我有一个div
,div
内有一个子img
元素。
div
和img
都有自己的javascript click handler
。
我的目标是点击img
时,只触发img click
。
但目前div click handler
正在img click handler
之前回复。
以下是示例:http://jsfiddle.net/5j73w/
我不确定父母的position: relative
是否是罪魁祸首。但这是一种强制性的风格。
我还尝试使用z-index
img
,但没有用。
提前致谢!
答案 0 :(得分:4)
在您使用jQuery 1.7 +时,将已弃用的.live()
替换为.on()
。
$('#parent > img').on('click', function(e) {
<强> Fiddle 强>
或者,如果您需要事件委托(例如,如果您要将内容动态添加到#parent
):
//run this line when #parent is in the DOM
$('#parent').on('click', '> img', function(e) {
.live
将事件一直冒泡到文档,然后检查给定的选择器是否与目标元素匹配,此时您无法再停止事件传播。来自docs:
在事件处理程序中调用
event.stopPropagation()
对于停止附加在文档中较低位置的事件处理程序是无效的;该事件已传播至document
。
另外,要回答“父母优先”问题,那不是案例。当您致电.live
时,您实际上是将处理程序附加到document
。
在这种情况下,通过.click(function(){})
附加的处理程序(在jQuery 1.7+中是.on('click'[, null], function(){})
的简写)在附加到document
的处理程序之前执行,这是预期的事件传播冒泡行为。
答案 1 :(得分:2)
能够通过执行以下操作来解决问题:
$('#parent').click(function(e)
{
console.log("parent click");
});
$('#child').click(function(e)
{
console.log("child click");
e.stopPropagation();
});
这是Fiddle.