jquery .live()事件交互

时间:2010-03-08 23:04:04

标签: jquery internet-explorer-8 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>

3 个答案:

答案 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)

您可以使用jquery.livequery plugin

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