jQuery如何将onclick事件绑定到动态添加的HTML元素

IT技术 javascript jquery bind
2021-01-11 05:31:27

我想将 onclick 事件绑定到我使用 jQuery 动态插入的元素

但它从不运行绑定函数。如果你能指出为什么这个例子不起作用以及我如何让它正常运行,我会很高兴:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"        
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da" lang="da">
        <head>
          <title>test of click binding</title>

<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
          <script type="text/javascript">


        jQuery(function(){
          close_link = $('<a class="" href="#">Click here to see an alert</a>');
          close_link.bind("click", function(){
            alert('hello from binded function call');
            //do stuff here...
          });
  
          $('.add_to_this').append(close_link);
        });
          </script>
        </head>
        <body>
          <h1 >Test of click binding</h1>
          <p>problem: to bind a click event to an element I append via JQuery.</p>

          <div class="add_to_this">
            <p>The link is created, then added here below:</p>
          </div>

          <div class="add_to_this">
            <p>Another is added here below:</p>
          </div>


        </body>
        </html>

编辑:我编辑了示例以包含该方法插入的两个元素。在这种情况下,alert()永远不会执行调用。(感谢@Daff 在评论中指出这一点)

6个回答

所有这些方法都已弃用。您应该使用该on方法来解决您的问题。

如果要定位动态添加的元素,则必须使用

$(document).on('click', selector-to-your-element , function() {
     //code here ....
});

这取代了弃用的.live()方法。

我的问题是我正在做类似的事情$('.row').on('click', function(){...});而不是$(document).on('click','.row',function(){...});
2021-03-11 05:31:27
@RickyBoyce 完美提示,谢谢。
2021-03-16 05:31:27
*selector-to-your-element*应该是'.some-class''#some-id'
2021-04-01 05:31:27
记住$(document)可以是页面上不会更改的任何元素。这可以防止过多的事件冒泡,从而加速您的 JS。例如。$(document)->$('.example-container')
2021-04-06 05:31:27

第一个问题是,当您在具有多个元素的 jQuery 集上调用 append 时,会为每个元素创建一个要追加的元素的克隆,因此附加的事件观察器会丢失。

另一种方法是为每个元素创建链接:

function handler() { alert('hello'); }
$('.add_to_this').append(function() {
  return $('<a>Click here</a>').click(handler);
})

另一个潜在的问题可能是在元素被添加到 DOM 之前附加了事件观察器。我不确定这是否有什么要说的,但我认为这种行为可能被认为是不确定的。更可靠的方法可能是:

function handler() { alert('hello'); }
$('.add_to_this').each(function() {
  var link = $('<a>Click here</a>');
  $(this).append(link);
  link.click(handler);
});
事实上,当您针对由其他一些代码创建的已知标记结构时。但是在这里他自己插入元素,并且没有明确的选择器(它只是一个锚点,可能有很多),所以他必须添加额外的标记才能定位元素。在这种情况下,将处理程序直接附加到元素同样容易,而不是捕获所有点击并测试选择器匹配。
2021-03-12 05:31:27
对于默认情况下提供旧版本 jQuery(例如 Drupal 7)的情况,此答案也非常有用。on()是在 jQuery 1.7 中引入的。
2021-03-18 05:31:27
我明白你的回答,并不意味着它是错的。当然,能够动态注入一些 html(例如加载了无限滚动内容的 ajax 的 ul li 图片)并且已经将按钮绑定到某些操作(例如灯箱),它更舒适。
2021-03-25 05:31:27
当您必须绑定附加有其他功能的元素的点击时,会出现问题。这就是为什么我建议使用 aM1Ne 答案。
2021-04-10 05:31:27

Live方法怎么样?

$('.add_to_this a').live('click', function() {
    alert('hello from binded function call');
});

不过,你所做的看起来应该有效。还有一个帖子看起来很相似。

live()现在不推荐使用on() 链接
2021-03-14 05:31:27
live()on()在 jQuery 1.9 中被弃用并替换
2021-03-14 05:31:27
你说得对,它确实有效。我的错。所以我编辑了这个问题。
2021-03-21 05:31:27
该问题与实时事件无关,但在这种情况下,实时事件可以解决它。Daff 提供的答案也解决了这个问题,并且没有在等式中添加直播事件的新概念
2021-03-27 05:31:27
是的,这类问题正是直播活动要解决的问题。
2021-04-04 05:31:27

聚会有点晚了,但我想我会尝试澄清 jQuery 事件处理程序中的一些常见误解。从 jQuery 1.7 开始,.on()应使用 , 而不是已弃用的.live(), 将事件处理程序委托给在分配事件处理程序后的任何时候动态创建的元素。

也就是说,切换livefor并不简单,on因为语法略有不同:

新方法(示例 1):

$(document).on('click', '#someting', function(){

});

不推荐使用的方法(示例 2):

$('#something').live(function(){

});

如上图,有区别。通过将选择器传递给 jQuery 函数本身,.on()实际上可以调用扭曲实际上类似于.live()

示例 3:

$('#something').on('click', function(){

});

但是,如果不使用$(document)示例 1,示例 3 将不适用于动态创建的元素。如果您不需要动态委托,示例 3 绝对没问题。

$(document).on() 应该用于所有事情吗?

它会起作用,但如果您不需要动态委派,则使用示例 3 会更合适,因为示例 1 需要浏览器做更多的工作。不会对性能产生任何实际影响,但使用最适合您的方法是有意义的。

如果不需要动态委托,应该使用 .on() 而不是 .click() 吗?

不必要。以下只是示例 3 的快捷方式:

$('#something').click(function(){

});

以上是完全有效的,因此在不需要动态委派时使用哪种方法实际上是个人偏好的问题。

参考:

考虑一下:

jQuery(function(){
  var close_link = $('<a class="" href="#">Click here to see an alert</a>');
      $('.add_to_this').append(close_link);
      $('.add_to_this').children().each(function()
      {
        $(this).click(function() {
            alert('hello from binded function call');
            //do stuff here...
        });
      });
});

它会起作用,因为您将它附加到每个特定元素。这就是为什么您需要 - 在将链接添加到 DOM 之后 - 找到一种方法来显式选择您添加的元素作为 DOM 中的 JQuery 元素并将单击事件绑定到它。

最好的方法可能是 - 正如建议的那样 - 通过 live 方法将它绑定到特定的类。

是的,你是对的,这不是 DOM(它实际上只适用于一个),抱歉。但我也发现,绑定到动态创建的元素似乎很烦人,只要它们不能被不同的 jQuery 选择器选择。
2021-03-28 05:31:27
“来自 BOUND 函数调用的你好。” 抱歉,这篇文章(整页;问题和答案)上的内容太多了,我只是想帮忙,你知道的,把它弄清楚。
2021-03-28 05:31:27
谢谢你的回答,达夫。我只能向 DOM 中的元素添加事件侦听器是不可能的。但是,我现在将更改我的代码来做到这一点。(应该没问题,因为我只是为添加的链接添加了特殊的 css 类)。
2021-03-29 05:31:27