Opera忽略.live()事件处理程序

时间:2011-07-05 15:30:47

标签: javascript jquery opera

我有以下jQuery适用于所有主流浏览器除了 Opera:

jQuery(document).ready(function () {

      jQuery("#GetResults").live("click", function(e){
            e.preventDefault(); //Opera doesn't execute anything here
      });

};

单击以下链接时应该触发:

<a id="GetResults" href="Folder/File/javascript:void(0);">Get Results</a>

只有Opera忽略了这一点。有什么想法吗?

修改

我刚刚发现如果我用.bind()代替.live(),一切都按预期运行。我找不到任何与Opera中的.live()错误相关的文档,并且在jsFiddle中可以正常工作这会指向环境问题。可能导致这种行为的原因是什么?

7 个答案:

答案 0 :(得分:7)

这需要澄清。上面的答案是正确的,但没有人清楚地解释你的问题来自哪里。

事实上,我认为你可能也可以在其他浏览器中重现这个问题。 这是因为.live的工作原理:

它与document上的事件绑定,并等待特定事件冒泡到那里。然后它检查event.target是否是你想要处理的。 *

如果点击一个链接元素,很可能浏览器会在之前进入新页面,事件气泡足够高以触发您的代码。在具有大量HTML和事件处理程序的应用程序中,所有浏览器都应该有问题。在这种情况下,Opera只是开始显示新页面并破坏前一个更快的页面。它实际上取决于特定情况而不是浏览器。例如:如果您在连接到网站时遇到高网络延迟,则可能不会发生这种情况。

要防止对a元素执行默认操作,您必须像过去一样使用.bind;)当开发人员必须知道他使用AJAX加载的内容并将新事件绑定到该元素时在回调中。

*还有更多内容,.live更复杂。我刚才描述了这里需要什么。

答案 1 :(得分:6)

使用以下方法附加处理程序时会发生什么:

$ (something).bind ("click", function (e) {
    // do something
})

您还可以尝试使用.click()方法附加处理程序。

答案 2 :(得分:4)

以下代码在Opera 11.50中按预期工作。

<!doctype html>
<title></title>
<a id="GetResults" href="http://google.com">Get Results</a>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script>
jQuery(document).ready(function () {
  jQuery("#GetResults").live("click", function(e){
    alert('doing something');
    e.preventDefault(); //Opera doesn't execute anything here
  });
});
</script>

要么是纠正的错误,要么是更微妙的错误。

您能否检查上述内容是否适用于您的Opera / jQuery版本?

答案 3 :(得分:2)

阅读本文:http://jupiterjs.com/news/why-you-should-never-use-jquery-live 尝试使用委托代替

答案 4 :(得分:1)

不确定是否要这样做,或者它是否适合您。我有类似的问题与Opera 9.5和e.preventDefault()无法正常工作,我找到的唯一解决方案只是return false ...

jQuery(document).ready(function () {

      jQuery("#GetResults").live("click", function(e){
            e.preventDefault();
            return false;
      });

};

答案 5 :(得分:1)

在这种情况下,值得考虑的事件冒泡有两个方面:传播和默认操作。

传播是指事件冒泡。首先,锚标记获取click事件,然后获取其父元素,然后获取其父元素,依此类推,直至文档元素。您可以随时通过调用e.stopPropagation()来阻止事件传播。

默认操作是浏览器如果不采取任何措施来阻止它的操作。最着名的情况是,当点击具有href的锚点时,浏览器将尝试在那里导航。还有其他一些例子,例如,当您单击并拖动图像时,许多浏览器将创建一个可以放在另一个应用程序上的重影图像。在这两种情况下,您都可以通过调用e.preventDefault()

来阻止浏览器随时执行默认操作

正如在这个问题的其他答案中所提到的,jQuery的.live()功能在高级元素(如document)中设置处理程序,并在事件传播完成后采取行动。如果锚点和文档之间的处理程序在没有调用e.stopPropagaiton()的情况下调用e.preventDefault() ,则会阻止实时处理程序响应,同时仍允许浏览器导航(默认操作) )。

我怀疑这是发生了什么,因为它会影响所有浏览器,但这是一种可能的解释。

答案 6 :(得分:1)

确保在单击链接之前发生document.ready事件。

尝试将所有生命放在document.ready包装器的顶部。如果你有很多javascript代码,它可能会有所帮助。