我一直在尝试使用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,你必须首先点击一个链接来创建元素。一旦你完成了这个操作,理论上同样的脚本也会工作,但是它没有。我错过了这个方法的什么?
5条答案
按热度按时间7nbnzgx91#
当动态添加项时,您应该将处理程序附加到最接近的父项上--在您的例子中是
body
。您可以通过这种方式使用on()
来实现delegate()
曾经提供的功能:因此,您的代码重写将简单如下:
我使用
e.target
来查找实际触发事件的元素,在本例中,我通过检查该元素是否具有container
类来识别该元素。jsFiddle Demo
6kkfgxo02#
简而言之,您需要将
on()
放在现有的父元素上,以使其正常工作:代码:http://jsfiddle.net/GsLtN/5/
有关更多详细信息,请查看官方网站“直接和委托活动”部分的'.on()'
4uqofj5v3#
我的天啊
当您使用
.on
将事件行程常式系结至项目时,您系结的目的必须存在于文件中。ct3nt3jp4#
您需要将
.on()
绑定到父对象。您尝试做的是-将处理程序绑定到侦听事件的父对象,然后检查事件是否由与该选择器匹配的元素触发。
更新的小提琴here
pinkon5k5#
根据
jQuery.on()
的文档:事件处理程序仅绑定到当前选定的元素;它们必须在代码调用
.on()
时存在于页面上。你必须将事件绑定到一个父容器上,比如THIS。