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

时间:2012-01-08 17:35:27

标签: jquery

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

<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>

3 个答案:

答案 0 :(得分:65)

我想指出的是,先到先得&#34;规则并不总是正确的,它还取决于您如何注册处理程序:

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

以上示例中,处理程序2始终在handler1之前调用。

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

答案 1 :(得分:36)

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

但是,你的例子看起来有点不同。看起来您还有一个事件绑定到input对象,其他事件绑定到父li对象。在这种情况下,事件实际发起的那个(在这种情况下可能是input元素)将首先发生,然后事件将冒泡到父对象,它们将在以后发生。

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

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

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

您可以在此处看到差异:http://jsfiddle.net/jfriend00/L33aq/

答案 2 :(得分:4)

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

相关:jQuery event handlers always execute in order they were bound - any way around this?