jQuery函数不绑定到新添加的dom元素

Ral*_*k28 75 javascript jquery onclick

这是index.html:

<head>
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
  <script type="text/javascript">

    $(document).ready(function() {
      $('.btn_test').click(function() { alert('test'); });
    });

    function add(){
      $('body').append('<a href=\'javascript:;\' class=\'btn_test\'>test</a>');
    }

  </script>
</head>
<body>
  <a href="javascript:;" class="btn_test">test1</a>
  <a href="javascript:;" onclick="add()">add</a>
</body>
Run Code Online (Sandbox Code Playgroud)

如果我点击test1链接,它会显示alert('test'),但是如果我点击add链接然后点击test,它就不会显示任何内容.

你能解释一下吗?

Mos*_*atz 211

对于2011年之后遇到此问题的用户,有一种新的正确方法:

$(document).on('click', '.btn_test', function() { alert('test'); });
Run Code Online (Sandbox Code Playgroud)

这是jQuery 1.7的一部分.

有关更多信息,请参阅直接和委派事件

  • 希望我可以选择答案作为"接受的答案".感谢您保存我的(剩余)日! (2认同)

Dou*_*eux 34

您需要使用"实时"单击侦听器,因为最初只存在单个元素.

$('.btn_test').live("click", function() { 
   alert('test'); 
});
Run Code Online (Sandbox Code Playgroud)

更新:由于不推荐使用live,您应该使用"on()":

$(".btn_test").on("click", function(){ 
   alert("test");
});
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,澄清一下 - "live"是一个后期绑定动态处理程序,可以在声明处理程序后附加到添加到DOM的元素.有关详细信息,请参阅[本文档](http://api.jquery.com/live/). (3认同)
  • 说明这一点的另一种方法是:`.click()`仅适用于加载页面时存在的对象,但`.live()`将应用于现在存在或将来创建的所有对象. (2认同)
  • live() 现在已被弃用,不是吗?还有什么选择呢? (2认同)

小智 15

我有同样的问题,如问题,我刚刚拉我的头发,然后我得到了解决方案.我使用不同的语法

$(".innerImage").on("click", function(){ 
alert("test");
});
Run Code Online (Sandbox Code Playgroud)

它不适合我(innerImage动态创建dom)现在我正在使用

$(document).on('click', '.innerImage', function() { alert('test'); });
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/SDJEp/2/

谢谢@Moshe Katz


doc*_*ess 8

.click绑定到jQuery目前可见的内容.你需要使用.live:

$('.btn_test').live('click', function() { alert('test'); });
Run Code Online (Sandbox Code Playgroud)


Ami*_*far 7

而是使用Jquery live.这是http://api.jquery.com/live/的帮助页面

$('.btn_test').live(function() { alert('test'); });
Run Code Online (Sandbox Code Playgroud)

编辑:live()已弃用,您应该使用on().

$(".btn_test").on("click", function(){ 
   alert("test");
});
Run Code Online (Sandbox Code Playgroud)

  • @silkfield我更新了我的答案.但下次请建议编辑而不是投票.SO是一个社区问答论坛,我们都可以改进. (6认同)