2010-03-08 40 views
5

比方说,我有一个场景,我有一个全局插件(或至少一个插件绑定到更广泛的事件)。jquery .live()事件交互

这个插件需要一个选择器,并绑定一个实时点击。事伪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

你能后周围的例子的代码不工作?例如它是否准备好了? – 2010-03-08 23:07:45

+0

当然,请参阅我最近的修改。很简单的例子,但这基本上是流程。 – ddango 2010-03-08 23:20:52

+0

我每次都会在这里开火,改变点燃,然后点击...你用什么浏览器出现问题? – 2010-03-08 23:25:37

回答

5

你知道,直到复选框失去焦点,对IE浏览器将不火的“改变”事件?

编辑虽然我认为这是事实,但该测试页的效果非常奇怪。我仍然在玩它。 “活”的机制让我感到困惑,让我有点紧张,尽管我完全理解它的价值。

我已经把(略作修改和澄清)测试页起来:http://gutfullofbeer.net/clicks.html,我要开始做一些jQuery的调试

模糊地带:正如在评论中指出,当我绑定一个虚拟“更改”处理程序到正文元素:

$('body').bind('change', function() { return true; }); 

然后事情开始正常工作。我确信@Alex是正确的,jQuery试图伪造“更改”事件冒泡的方式正在发生。但仍然令人毛骨悚然。测试页面位于http://gutfullofbeer.net/clicks-body.html,您可以通过单击“首先使用更改处理程序设置”来看到奇怪,然后单击复选框并注意第二个处理器上的“单击”处理程序仅触发一次,然后单击“绑定处理程序到身体“,并观察复选框之后的行为。使用$.delegate有一个共同的祖先,而不是$.live

的关键与live记住

+0

有趣的发现,但进一步让我觉得它是1.4.x中引入的bug – ddango 2010-03-09 00:34:31

+1

很可能!我将在jQuery论坛上发布它,看看有没有人能解释它。 – Pointy 2010-03-09 00:38:16

1

尝试是,事件是绑定到您选择的元素。它被绑定到document,然后一旦事件冒泡到文档中,它将检查您在事件目标上传入的选择器。

从中学习的关键是,在IE中 - 更改事件自然不会像大多数浏览器那样冒泡。在IE中,基于启发式的“气泡”事件在所有jQuery测试中都与其他浏览器中的实际事件相同。您的其他功能可能会阻止这种启发式工作。所以它是有道理的,它是特定于IE的。这并不是说这是一个很好的事情...

+0

嗨,亚历克斯!有时我会戴领带。无论如何,这个很奇怪。我发现基于事件处理器注册顺序而改变的行为,如果我直接将“click”处理程序绑定到$(“body”),它也会发生变化。该处理程序运行,但“click”和“change”处理程序总是运行“特殊”复选框。我会尝试“委托”。 – Pointy 2010-03-09 00:09:55

+0

更正 - 我必须将“更改”事件绑定到正文,而不是“单击”。 – Pointy 2010-03-09 00:17:00

+0

不错的建议,但我已经尝试使用$ .delegate,而不是($(“body”)。委托(“#特别”,“点击”,功能(){...});)但这不能解决问题。然而,请注意,更改订单仍然适用于委托,与现场一样。 – ddango 2010-03-09 00:31:02

0

可以使用jquery.livequery plugin

$("select[name='majorsList']").livequery("change",function() 
{ 
alert('in'); 
});