2013-03-12 90 views
1

说我有一个ID的按钮:jQuery的 - 为同一按钮多个事件侦听器

<input id='someButton' />

我想在此按钮上附加一个事件侦听器:

$('#form').on('click', '#someButton', function() { 
    alert("My listener called"); 

});

然而,瞒着我,有人以前写过的事件侦听器这同一个按钮:

$('#form').on('click', '#someButton', function() { 
    alert("Some other listener called"); 
}); 

我遇到了一些代码,有效地确实与上述同样的事情,而且好像注册的第一个监听器是使用的那个。我是否正确假设jQuery将始终调用在特定ID上注册的第一个事件侦听器(并且只有那个侦听器)?

+1

nope。在jQuery中,您可以添加多个事件侦听器.. – honk31 2013-03-12 18:41:34

回答

7

错误。 jQuery将按照它们绑定的顺序调用绑定到元素的所有事件侦听器。

要删除现有的事件处理程序,使用.off()

$('#form').off('click'); // click event handler(s) removed 
$('#form').off(); // all event handler(s) removed 

要知道,从祖先的DOM元素委派事件将不会被这种方式去除,但。

+2

为了完整起见,如果其中一个处理程序在事件上调用[stopImmediatePropagation()](http://api.jquery.com/event.stopImmediatePropagation/),处理程序进一步向下链不会被调用。这可能是提问者观察到的行为的原因。 – 2013-03-12 18:43:41

+0

谢谢,事实证明,这两个处理程序实际上被称为。只是我的一个疏忽。没有调用stopImmediatePropagation(),但这是有用的知识! – 2013-03-12 18:55:30

0

,你可以使用鼠标按下:

$('#form').on('mousedown', '#someButton', function() { 
    alert("My listener called"); 
}); 

希望这有助于。