对动态元素使用.on()和e.stopPropagation()
Using .on() and e.stopPropagation() on dynamic elements
我一直在尝试使用stopPropagation()
捕获元素外部的点击事件。
$(".container").children().on('click',function(e){
e.stopPropagation();
});
$(".container").on("click",function(){
alert("outside the box?");
})
下面是一个jsFiddle设置来演示它的功能。当您点击白色框外的任何位置时,都会发出警报。
现在,我正在尝试将同样的原理应用于动态创建的元素。据我所知,jQuery中事件分配的on()
方法应该允许它在不更改脚本的情况下运行。
这里是第二个jsFiddle,您必须首先单击一个链接来创建元素。一旦你做到了这一点,理论上同样的剧本会奏效,但事实并非如此。这种方法缺少什么?
当动态添加项时,您应该将处理程序附加到最近的父级,该父级肯定会在那里——在您的情况下,这是body
。您可以通过这种方式使用on()
来实现delegate()
曾经提供的功能:
$(父级的选择器).on(事件,动态子级的选择器,处理程序);
所以你重写的代码会简单地是这样的:
$("body").on('click', '.container', function(e){
var $target = $(e.target);
if ($target.hasClass('container')) {
alert("outside the box!");
}
});
我使用e.target
来查找实际触发事件的元素。在这种情况下,我通过检查该项是否具有container
类来识别它。
jsFiddle演示
简而言之,您需要将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()"
演示
当使用.on
将事件处理程序绑定到元素时,绑定到的目标必须存在于domocument中。
$('body').on('click', '.container > *', function(e){
e.stopPropagation();
});
$('body').on("click",'.container',function(){
alert("outside the box?");
})
您需要将.on()
绑定到父级。
您要做的是将处理程序绑定到侦听事件的父级,然后检查该事件是否由与该选择器匹配的元素触发。
$("body").on("click", '.container',function(){
alert("outside the box?");
})
此处更新了fiddle
根据jQuery.on()
:的文档
事件处理程序仅绑定到当前选定的元素;他们必须在代码调用
.on()
时存在于页面上。
您必须将事件绑定到父容器。也许是这样。
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- I'我设计了一个下拉菜单,onclick会出现,而on blur会消失
- window.on.scroll事件未启动
- Socket.io on Mozilla Rhino
- CSS中的游标属性似乎不适用于USB On The Go
- jQuery点击ON现在使用.load触发关闭
- JQuery.on(“keydown”)追加到页面时不工作
- 使用.on动态添加jquery/js不知道的html元素
- angularjs$valid-on-dates在firefox中报告错误
- addEventListener on NodeList
- 当我在节点上拖动鼠标时,我如何防止使用d3.ehavior.zoom().on(“缩放”,重绘)
- jQuery 1.7.2:.on()在一个页面上工作;Don’别再干别的了
- Jquery on单击“显示信息”
- 平均值.on(事件[,选择器][,数据],处理程序)
- 多个jQuery.on()事件无法运行xBrowser(取决于顺序)
- 如何使jQuery的“bind”或“on”事件处理程序幂等
- 无法使以下ng on click outside指令在同一页面上的两个元素上工作
- 对动态元素使用.on()和e.stopPropagation()
- $.on() bubbling after stopPropagation();
- jQuery.on()无法使用stopPropagation