关于javascript:将click事件附加到尚未添加到DOM的JQuery对象

Attaching click event to a JQuery object not yet added to the DOM

本问题已经有最佳答案,请猛点这里访问。

在将Click事件添加到DOM之前,我一直很难将它附加到jQuery对象。

基本上,我有一个函数返回的按钮,然后将它附加到DOM。我想要的是用自己的单击处理程序返回按钮。我不想从DOM中选择它来附加处理程序。

我的代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
createMyButton = function(data) {

  var button = $('')
    .css({
       'display' : 'inline',
       'padding' : '0px 2px 2px 0px',
       'cursor' : 'pointer'
     }).append($('').attr({
       //'href' : Share.serializeJson(data),
       'target' : '_blank',
       'rel' : 'nofollow'
     }).append($('<image src="css/images/Facebook-icon.png">').css({
      "padding-top" :"0px",
      "margin-top" :"0px",
      "margin-bottom" :"0px"
     })));

     button.click(function () {
        console.log("asdfasdf");
     });

     return button;    
}

返回的按钮无法捕获Click事件。但是,如果我这样做(在按钮添加到DOM之后):

1
2
3
$('#my-button').click(function () {
    console.log("yeahhhh!!! but this doesn't work for me :(");
});

它起作用了…但不是为了我,不是我想要的。

它似乎与对象还不是DOM的一部分这一事实有关。

哦!顺便说一句,我正在使用Openlayers,我要附加按钮的DOM对象是Openlayers.framedcloud(它还不是DOM的一部分,但一旦触发了几个事件,它就会出现。)


用这个。可以将body替换为dom ready上存在的任何父元素

1
2
3
$('body').on('click', '#my-button', function () {
     console.log("yeahhhh!!! but this doesn't work for me :(");
});

请访问http://api.jquery.com/on/了解有关如何使用on()的更多信息,因为它从1.7+开始取代live()。

下面列出了您应该使用的版本

$(selector).live(events, data, handler); // jQuery 1.3+

$(document).delegate(selector, events, data, handler); // jQuery 1.4.3+

$(document).on(events, selector, data, handler); // jQuery 1.7+


我真的很惊讶没有人发布这个

1
2
3
$(document).on('click','#my-butt', function(){
   console.log('document is always there');
})

如果您不确定当时该页面上的元素,只需将其附加到document即可。

注意:从性能角度来看,这是次优的——要获得最大的速度,应该尝试附加到要插入的元素的最近父元素上。


试试这个…用父选择器替换正文

1
2
3
$('body').on('click', '#my-button', function () {
    console.log("yeahhhh!!! but this doesn't work for me :(");
});


尝试:

1
2
3
4
5
6
7
8
$('body').on({
    hover: function() {
        console.log("yeahhhh!!! but this doesn't work for me :(");
    },
    click: function() {
        console.log("yeahhhh!!! but this doesn't work for me :(");
    }
},'#my-button');

jfiddle示例。

当使用.on()并绑定到动态元素时,需要引用页面上已经存在的元素(如示例中的body)。如果可以使用更具体的元素来提高性能。

Event handlers are bound only to the currently selected elements; they
must exist on the page at the time your code makes the call to .on().
To ensure the elements are present and can be selected, perform event
binding inside a document ready handler for elements that are in the
HTML markup on the page. If new HTML is being injected into the page,
select the elements and attach event handlers after the new HTML is
placed into the page. Or, use delegated events to attach an event
handler, as described next.

网址:http://api.jquery.com/on/


你必须附加它。创建元素时使用:

1
2
3
var $div = $("my div");
$div.click(function(){alert("clicked")})
return $div;

然后,如果您附加它将工作。

看看这里的例子,这里是一个简单的版本。


为那些使用.on()来监听最近加载的表单元格中输入绑定的事件的人提供补充信息;我通过使用delegate()设法将事件处理程序绑定到此类表单元格,但是.on()不起作用。

我将表ID绑定到.delegate(),并使用了一个描述输入的选择器。

例如

HTML

1
2
3
4
5
6
<table id="#mytable">
  <!-- These three lines below were loaded post-DOM creation time, using a live callback for example -->
  <tr><td><input name="qty_001" /></td></tr>
  <tr><td><input name="qty_002" /></td></tr>
  <tr><td><input name="qty_003" /></td></tr>
</table>

JQuery

1
2
3
$('#mytable').delegate('click', 'name^=["qty_"]', function() {
    console.log("you clicked cell #" . $(this).attr("name"));
});


关于事件

1
2
3
$('#my-button').on('click', function () {
    console.log("yeahhhh!!! but this doesn't work for me :(");
});

或在追加后添加事件


方法用于绑定事件,即使在页面加载时不存在元素。这是链接使用方法如下:

1
2
3
 $("#dataTable tbody tr").on("click", function(event){
    alert($(this).text());
 });

在jquery 1.7之前,使用了.live()方法,但现在已弃用。


使用。为你工作?

1
$("#my-button").live("click", function(){ alert("yay!"); });

http://api.jquery.com/live/

编辑

从jquery 1.7开始,不推荐使用.live()方法。使用.on()附加事件处理程序。旧版本jquery的用户应优先使用.delegate()而不是.live()。

http://api.jquery.com/on/


也许bind()可以帮助:

1
2
3
button.bind('click', function() {
  alert('User clicked');
});