【问题标题】:Binding Jquery Events On Elements Generated Through Other Events在通过其他事件生成的元素上绑定 Jquery 事件
【发布时间】:2012-03-12 18:31:49
【问题描述】:

我在通过另一个操作创建的项目上绑定 jquery 事件时遇到问题,例如当点击加载更多链接时

e.g there are list of elements
<div class="itm" id="c_1"></div>
<div class="itm" id="c_2"></div>
....

当点击加载更多链接时,它将生成更多元素,例如

<div class="itm" id="c_11"></div>
<div class="itm" id="c_12"></div>
...

在页面加载时,我使用下面的 jquery 脚本来绑定鼠标进入和离开事件。

$('.itm').on({
   mouseenter: function (e) {
      alert('mouse enter');
   },
   mouseleave: function (e) {
     alert('mouse leave');
   }          
});    

这将成功地在元素 c_1、c_2 上应用事件,但是当加载更多链接调用时,它将生成更多元素。为此,我取消绑定悬停事件并在单击加载更多链接时调用的函数下创建新元素后再次绑定它。

$(".cmtldmore").on('click', function (e) {
     // Ajax process to load more elements in tray.
     // Unbind hover event
     $('.itm').off();
     // Bind it again
     $('.itm').on({
     mouseenter: function (e) {
           alert('mouse enter');
     },
     mouseleave: function (e) {
           alert('mouse leave');    
            }
        });
    });

已经和加载更多元素在页面上正确显示, 但是悬停事件仍然可以正确调用已经创建的元素,而不是“加载更多”事件创建的元素。

谁能帮我正确地将事件附加到通过调用其他 jquery 事件或函数动态创建的元素上。

【问题讨论】:

  • @Madbreaks - 如果关键是要发现它实际上已被弃用,那肯定是个好主意!

标签: jquery html


【解决方案1】:

在动态内容上,您需要委托,如下所示:

$(document).on({
   mouseenter: function (e) {
      alert('mouse enter');
   },
   mouseleave: function (e) {
     alert('mouse leave');
   }          
}, '.itm'); 

您应该将 document 替换为未使用 Ajax 插入的最接近的父级。

【讨论】:

  • .live 比 .on 要漂亮得多,如果您仍然绑定到文档。就算贬值了,也去拧吧……
【解决方案2】:

查看on 文档的“直接和委托事件”部分:

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

您可以使用事件委托来处理这个问题。

$('#itmWrapper').on({
   mouseenter: function (e) {
      alert('mouse enter');
   },
   mouseleave: function (e) {
     alert('mouse leave');
   }          
}, '.itm');  

这会将事件绑定到一个包装器元素(由 id itmWrapper 组成,如果没有公共父级,则可以是主体)并应用于该包装器中与选择器匹配的所有元素,无论何时添加。

【讨论】:

  • 感谢您的建议,它工作得很好,就像上面的答案中提到的那样。
猜你喜欢
  • 2011-04-15
  • 2017-03-09
  • 2012-05-05
  • 1970-01-01
  • 2012-10-08
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多