【问题标题】:Set onclick handler to dynamically created button将 onclick 处理程序设置为动态创建的按钮
【发布时间】:2013-11-13 07:36:50
【问题描述】:

我需要动态创建按钮并分配其onclick 处理程序。点击处理程序可能是匿名函数(我不确定它是如何在 JS 中调用的)。允许jQuery.
我试过这样的事情:

<div>
    <button id="x">Show</button>
</div>

function magick() {
    console.log('some special magick');
}

function createButton(itsHandler) {
    var guts = '<button id="__internal" onclick="' 
        + itsHandler +    // <-- that's wrong
        '">Test</button>';
    $($.trim(guts)).appendTo('body');
}

$(document).ready(function () {
    $("#x").bind("click", function() { 
            createButton(magick);
        });
});

但它不起作用。

(Here is jsfiddled code)

如何实现?
UPD1:如果能做到就更好了在createButton 函数内部。

【问题讨论】:

标签: javascript jquery html button dynamic


【解决方案1】:

尝试使用on()like

$('body').on('click','#__internal',function(){
   console.log('test some special magick');
});

$(document).ready(function () {
    $("#x").bind("click", function() { 
       var guts = '<button id="__internal" >Test</button>';
       $($.trim(guts)).appendTo('body');
    });
}); 

Demo

更新在你的代码下面two lines可以create magic为你喜欢,

var guts = '<button id="__internal">Test</button>';
$($.trim(guts)).appendTo('body').bind('click', magick);

Demo 1

【讨论】:

  • 如何在一个函数内完成?我的意思是创建按钮并分配处理程序。
  • 如果您使用的是jquery,那么最好使用on
  • 我可以在函数内部使用$('body').off('click', ...) 来防止多个处理程序分配,而不是使用on 再次设置处理程序。我需要它在一个函数中,因为我必须将它与&lt;script&gt; 元素分开。
  • 谢谢!对于任何使用 $(SELECTOR).click(function(){STUFF}) 并发现它仅在某些时候有效的人。改用这个!
【解决方案2】:

尝试使用开启

FIDDLE

 $("body").on("click", "#__internal", function(){
      alert('some special magick');
 });

【讨论】:

    【解决方案3】:

    我认为您可以这样做,只需将 onclick 值设为这样的函数调用:

    var guts = '<button id="__internal" onclick="magick()">Test</button>';
    

    但它在 jsfiddle 中不起作用,因为 jsfiddle 将您的 js 代码放在窗口加载处理程序中,因此在该处理程序之外不会看到 magick 函数。

    关于你的 createButton 函数,你应该传递函数的名称而不是函数本身,试试这个:

    function createButton(itsHandlerName) {
        var guts = '<button id="__internal" onclick="' 
            + itsHandlerName +
            '()">Test</button>';//add () to the function's name
        $($.trim(guts)).appendTo('body');
    }
    
    $(document).ready(function () {
        $("#x").bind("click", function() { 
                createButton("magick");//pass function name
            });
    });
    

    【讨论】:

    • 这是不合适的方式,因为似乎不可能将匿名函数附加到处理程序。
    • 是的,它不适用于匿名函数,因此您应该使用 jquery on method,就像其他人建议的匿名函数一样,这将是一个更好的做法,我只是想证明它可以工作在你的魔术案例中。
    【解决方案4】:

    您可以使用 on() 在动态添加的元素上绑定事件。像这样:

    $(document).on('click', '#__internal', function () {
     alert('some special magick');
    })
    

    WORKING FIDDLE...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 2016-03-07
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 2017-07-29
      • 2018-04-23
      相关资源
      最近更新 更多