多个事件处理程序绑定到一个元素时的优先级

当多个事件处理程序绑定到一个元素时,如何确定首先触发哪一个?

<script> $(function(){ $(".li").find('input').click(function(){alert('li>input');}); $(".li").click(function(){alert('li');}); $('input').click(function(){alert('input');}); }); </script> </head> <body> <ul> <li class="li"><input type="checkbox" /><span>Hello</span></li> <li class="li"><input type="checkbox" /><span>Hello</span></li> <li class="li"><input type="checkbox" /><span>Hello</span></li> </ul> </body> 

如果两个事件处理程序绑定到完全相同的对象,则会先到先服务。 附件中的第一个将首先执行。

但是,你的例子看起来有点不同。 看起来你也有一个绑定到input对象的事件,而其他的绑定到父对象。 在这种情况下,事件实际发生的地方(大概是这种情况下的input元素)将首先发生,然后事件将会冒泡到父对象,并且会在稍后发生。

如果你想停止向父母冒泡,你可以使用jQuery的event.stopPropagation() ,事件不会到达父母,也不会触发他们的事件处理程序。 这看起来像这样:

 $('input').click(function(e) { e.stopPropagation(); alert('input'); }); 

根据stopPropagation()的jQuery文档,它不会停止同一对象上的其他事件处理程序,而只会通过冒泡父树来获取事件的父对象上的事件处理程序。

你可以看到这里的区别: http : //jsfiddle.net/jfriend00/L33aq/

我想指出,“先到先得”的规定并不总是对的,也取决于你如何注册一个处理程序:

 Handler1 - $(document).on('click', 'a', function....) Handler2 - $('a').on('click', function....) 

这个上面的例子中,Handler 2总是在handler1之前被调用。

看看这个小提琴: http : //jsfiddle.net/MFec6/

先到先得。 第一个绑定将是第一个被触发的,依此类推…

相关: jQuery事件处理程序总是执行它们的绑定 – 任何方式围绕?

但是,如果添加父元素事件,那么它应该先调用它们的子元素,这似乎是不同的

如果我有一个文档级别的事件和内部的HTML级别的事件