假设我有一个场景,我有一个全局插件(或者至少是一个绑定到更多事件的插件)。
此插件采用选择器,并将实时点击绑定到它。伪jquery中的某些内容可能如下所示:
$.fn.changeSomething = function(){
$(this).live("change", function(){ alert("yo");});
}
在另一个页面上,我还有一个类似的实时绑定:
$("input[type='checkbox']").live("click", function(){alert("ho");});
在这种情况下,理想情况下,该复选框最终会绑定到两个直播事件。
我所看到的是变化事件应该发射,我被警告“哟”。但是,使用此实时点击事件,我从不触发它。但是,使用显式点击绑定,我会点击它。
简单的解决方法是在实时更改处理程序结束时触发单击事件,但这对我来说似乎很笨拙。有任何想法吗?
请注意,这是使用jquery 1.4.2并且只发生在IE8中(我认为6/7也会这样,但我还没有测试过它们。)
一个例子(你需要jquery-1.4.2.min.js):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<script src="jquery-1.4.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
$.fn.changeSomething = function(){
var t = $(this);
t.live("change", function(){
alert("yo");
});
};
$(document).ready(function(){
$("input[type='checkbox']").changeSomething();
$("#special").live("click", function(){
alert("ho");
});
});
</script>
</head>
<body>
<form>
<input type="checkbox" id="cbx" />
<input type="checkbox" id="special" />
</form>
</body>
</html>
答案 0 :(得分:5)
你知道IE不会触发“更改”事件,直到复选框失去焦点,对吗?
编辑虽然我认为这是真的,但该测试页面的效果非常奇怪。我还在玩它。 “生活”机制使我感到困惑,让我有点紧张,尽管我完全理解它的价值。
我已经(略微修改和澄清)测试页面了:http://gutfullofbeer.net/clicks.html我将开始做一些jQuery调试
twilight zone:正如评论中所述,当我将虚拟“更改”处理程序绑定到body元素时:
$('body').bind('change', function() { return true; });
然后事情开始正常工作。我确信@Alex是正确的,jQuery试图伪造“变化”事件的冒泡方式正在发生一些事情。然而仍然是幽灵般的。测试页面位于http://gutfullofbeer.net/clicks-body.html,您可以通过单击“首先使用更改处理程序进行设置”来查看奇怪之处,然后单击复选框并注意第二个上的“单击”处理程序仅触发一次,然后单击“将处理程序绑定到正文”并观察复选框之后的行为。
答案 1 :(得分:1)
尝试将$.delegate
与共同祖先而不是$.live
使用live
记住的关键是事件不绑定到您选择的元素。它绑定到document
,然后一旦事件冒泡到文档,它就会检查你在事件目标上传入的选择器。
从中学习的关键是在IE中 - 变化事件不会像大多数浏览器那样自然地冒泡。在IE中,基于启发式的事件“起泡”在所有jquery测试中与其他浏览器中的实际事件相同。您的其他功能可能会阻止此启发式工作。因此,IE具体是有意义的。这并不是一件好事......
答案 2 :(得分:0)
$("select[name='majorsList']").livequery("change",function()
{
alert('in');
});