使用jQuery.append时绑定事件会丢失

时间:2011-04-18 10:15:25

标签: jquery javascript-events dom-manipulation

我有一个简单的代码,例如http://jsfiddle.net/9braK/2/

$(function(){

$('body').append(
    $("<a/>").attr({ "id": "foo", "href":"#" })
             .text("click me")
             .live("click",function(e){
                e.preventDefault();
                alert("Hello World!");
             })
  );
});

根据docs这应该有用,对吗?

2 个答案:

答案 0 :(得分:2)

  

DOM遍历方法不是   支持查找要发送的元素   为了活着()。相反,.live()方法   应始终直接调用   选择器,如上例所示。

Source

因此,代码中唯一的问题是使用live()"<a/>"不是选择器,live()的工作方式将无法找到相应的元素。如果您只是使用.click(),它当然会完美无缺。

您可以使用类似

的内容
$('body')
  .append(
    $("<a/>")
      .attr({ "id": "foo", "href":"#" })
      .text("click me")
    )
  )
  .delegate("#foo", "click", function(e){
                e.preventDefault();
                alert("Hello World!");
             });

实现您的目标(但我认为根据您的使用情况,简单click()就足够了。)

答案 1 :(得分:0)

这个有效:

$(function(){
  // Add the click event for all future elements having the id #foo
  $('#foo').live("click",function(e){
                    e.preventDefault();
                    alert("Hello World!");
                 });

    $('body').append(
        $("<a/>").attr({ "id": "foo", "href":"#" })
                 .text("Continue ")
    );
});