jquery 在动态元素上使用.on()和e.stopPropagation()

sgtfey8w  于 2022-11-03  发布在  jQuery
关注(0)|答案(5)|浏览(118)

我一直在尝试使用stopPropagation()捕获元素外的单击事件。

$(".container").children().on('click',function(e){
  e.stopPropagation();    
});
$(".container").on("click",function(){
  alert("outside the box?");    
})​

Here is a jsFiddle set up to demonstrate it functioning。当您按一下白色方块以外的任何位置时,应该会引发警示。
现在,我尝试将同样的原理应用于动态创建的元素。据我所知,jQuery中事件赋值的on()方法应该允许在不更改脚本的情况下实现这一点。
Here is a second jsFiddle,你必须首先点击一个链接来创建元素。一旦你完成了这个操作,理论上同样的脚本也会工作,但是它没有。我错过了这个方法的什么?

7nbnzgx9

7nbnzgx91#

当动态添加项时,您应该将处理程序附加到最接近的父项上--在您的例子中是body。您可以通过这种方式使用on()来实现delegate()曾经提供的功能:

  • 事件 动态子级选择器 处理程序 *);

因此,您的代码重写将简单如下:

$("body").on('click', '.container', function(e){
    var $target = $(e.target);
    if ($target.hasClass('container')) {
        alert("outside the box!");
    }
});

我使用e.target来查找实际触发事件的元素,在本例中,我通过检查该元素是否具有container类来识别该元素。
jsFiddle Demo

6kkfgxo0

6kkfgxo02#

简而言之,您需要将on()放在现有的父元素上,以使其正常工作:

$('body').on('click', 'a', function(e){
    e.preventDefault();
    $('<div class="container"><div class="box"></div></div>').appendTo('body');
    $(this).remove();
});

$('body').on('click', '.container > *', function(e){
  e.stopPropagation();    
});

$('body').on('click', '.container', function(){
  alert("outside the box?");    
})​

代码:http://jsfiddle.net/GsLtN/5/
有关更多详细信息,请查看官方网站“直接和委托活动”部分的'.on()'

4uqofj5v

4uqofj5v3#

我的天啊
当您使用.on将事件行程常式系结至项目时,您系结的目的必须存在于文件中。

$('body').on('click', '.container > *', function(e){
  e.stopPropagation();    
});
$('body').on("click",'.container',function(){
  alert("outside the box?");    
})​
ct3nt3jp

ct3nt3jp4#

您需要将.on()绑定到父对象。
您尝试做的是-将处理程序绑定到侦听事件的父对象,然后检查事件是否由与该选择器匹配的元素触发。

$("body").on("click", '.container',function(){
  alert("outside the box?");    
})​

更新的小提琴here

pinkon5k

pinkon5k5#

根据jQuery.on()的文档:
事件处理程序仅绑定到当前选定的元素;它们必须在代码调用.on()时存在于页面上。
你必须将事件绑定到一个父容器上,比如THIS

相关问题