【发布时间】:2010-06-25 02:16:10
【问题描述】:
我正在尝试为列表中“li”元素中的不同元素设置不同的委托单击处理程序。示例:
<ul id='myList'>
<li>
<p>First item.</p>
<button>button1</button>
<button>button2</button>
</li>
<li>
<p>Second item.</p>
<button>button1</button>
<button>button2</button>
</li>
</ul>
当用户单击 button1(任何项目)时,我想抓取该事件并停止传播(对于 button2 实例也是如此)。单击父 li 元素的用户将是不同的处理程序:
$('#myList').delegate('li', 'click', function() {
alert("You clicked a parent <li> item!");
});
$('#myList').delegate('button', 'click', function(event) {
event.stopPropagation();
event.stopImmediatePropagation();
alert("You clicked a button (but which one?)!");
});
所以一个问题是,我如何为 button1 实例设置一个委托,而为 button2 实例设置另一个委托?上例中的第二个委托在单击按钮时会触发,但 event.stopPropagation() 似乎无法正常工作,因为仍会调用父 li 项的处理程序,
------更新--------------
也尝试调用 event.stopImmediatePropagation(),但没有效果,父处理程序仍然被调用。
谢谢
【问题讨论】:
-
你用哪个浏览器测试过这个?
-
@user - 仅供参考,
.stopPropagation()不起作用的原因是delegate()依赖 冒泡工作。换句话说,您将处理程序放置在#myList上,因此当您单击其后代之一时,事件会冒泡到#myList,然后触发。所以没有更多的传播可以停止。
标签: javascript jquery event-bubbling