【发布时间】:2012-12-19 09:53:00
【问题描述】:
我已经阅读了 jQuery 文档,并且我知道如果我使用 live() 将事件绑定到元素,那么使用 stopPropagation() 是没有意义的,因为带有 live() 的事件会绑定到文档节点,所以事件已经发生了向上。这么说,我认为 nex 代码会发出 3 次警报,因为 stopPropagation 不会停止任何事情:
<ul style="border:red solid 1px;">
<li style="padding:10px; border:blue solid 1px;">
<p style="border:green solid 1px;"><a href="#">link</a></p>
</li>
<li style="padding:10px; border:blue solid 1px;">
<p style="border:green solid 1px;">no link</p>
</li>
</ul>
<script type="text/javascript">
$('a').live( "click", function( e ) {alert("link");e.stopPropagation()} );
$('ul').live( "click", function( e ) {alert("ul");} );
$('ul li').live( "click", function( e ) {alert("li");} );
</script>
当我单击链接时,我期望并警告“li”和“ul”,但是 stopPropagation 正在停止其他本应无用的事件。 我错过了什么?
【问题讨论】:
-
为什么不只是
$('a').on( "click", function() {alert("link"); return false;} );? -
如果我单击确切的链接,您的代码将按预期工作。我没有看到 ul 和 li 警报。如果我点击实际链接旁边的空间,我会看到另外两个警报。您可能希望为元素设置宽度,以免看到此行为。
-
似乎是因为对于 ul 和 ul li,您还使用了
live。如果您将它们更改为bind,它们都会被调用。
标签: events jquery stoppropagation