我有一个包含两个事件的输入文本,而且我会多次克隆它。要正确绑定这些元素,我使用:
注意:此输入文字包含focusin和focusout事件。
$('[selector_input]').die().live( 'focusin', function() {
alert( 'You focused me' );
});
$('[selector_input]').die().live( 'focusout', function() {
alert( 'Bye!' );
});
最终结果是所有输入仅执行:focusout事件。如果我不使用.die(),我将重复调用相同的事件。
现在的解决方案可能是:
$('[selector_input]').die().live( 'focusout focusin', function(event) {
if (event.type == "focusin")
alert( 'You focused me' );
else
alert( 'Bye!' );
});
但我喜欢和第一个代码一样独立。
答案 0 :(得分:2)
只需指定调用die()
$('[selector_input]').die('focusin').live( 'focusin', function() {
alert( 'You focused me' );
});
$('[selector_input]').die('focusout').live( 'focusout', function() {
alert( 'Bye!' );
});
我不太确定为什么你需要die()
电话,你是否反复绑定事件?
答案 1 :(得分:0)
您可以执行类似
的操作$('path to your input').live({
focusin: function() { $('some output div').html('Focus!'); },
focusout: function() { $('some output div').html('Bye!'); }
});
或者您可以删除.die()
- 其目的是删除该选择器的先前事件处理程序。
如果你正在玩警报框,我不会同时搞乱焦点事件 - 当警报框出现时它会成为活动的东西,导致聚焦的东西不聚焦(然后可能重新聚焦),并且导致你的事件处理程序有时被无限调用。
BTW,请参阅http://jsfiddle.net/9pjWa/了解如何使用.live()
的示例 - 听起来你做错了。 .live()
的非常重要是每次添加元素时都不需要重新绑定事件;事件处理程序位于文档上,而不是元素,并且匹配选择器的每个元素都可以触发事件,无论它们是在.live()
之前还是之后添加的。实际上,每次重新绑定时,都会添加另一个处理所有匹配元素的事件处理程序,这也是为什么你看到多次调用事件处理程序的另一个原因。