jquery 歌剧忽略,live()事件处理程序

ego6inou  于 2023-04-29  发布在  jQuery
关注(0)|答案(7)|浏览(94)

我有下面的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忽略了这个。有什么想法吗

编辑:

我刚发现如果我换掉。live()for .bind()一切都如预期的那样运行。我找不到任何有关的文件。live()在Opera中有bug,它在jsFiddle中 * 确实工作 *,这将指向环境。是什么导致了这种行为?

y4ekin9u

y4ekin9u1#

这一点需要澄清。上面的答案是正确的,但没有人清楚地解释你的问题来自哪里。
事实上,我认为你可能也可以在其他浏览器中重现这个问题。这是因为.live是如何工作的:
它绑定到document上的事件,并等待特定的事件冒泡到那里。然后它检查event.target是否是您想要处理的。*
如果你点击了一个link元素,很有可能浏览器在事件气泡足够高的时候转到新页面,触发代码。在一个有大量HTML和事件处理程序的应用程序中,所有浏览器都应该有问题。Opera只是开始显示新的页面,并在这种情况下更快地破坏以前的页面。它实际上取决于特定情况而不是浏览器。例如:如果您在连接到站点时有很高的网络延迟,则可能不会看到这种情况发生。
要防止对a元素的默认操作,您必须像以前一样使用.bind;)当开发者必须知道他用 AJAX 加载了什么,并在回调中将新事件绑定到该事件时。
*还有更多,.live更复杂。我只是描述了这里所需要的。

yhxst69z

yhxst69z2#

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

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

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

mcvgt66p

mcvgt66p3#

以下代码在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>

它要么是一个被纠正的bug,要么是一些更微妙的东西。
你能检查一下上面的内容是否适用于你的Opera / jQuery版本吗?

cnwbcb6i

cnwbcb6i4#

读取this article。请尝试使用委托

neskvpey

neskvpey5#

不确定你是否想这样做,或者它是否会为你工作。Opera 9也有类似的问题。5和e.preventDefault()不工作,我找到的唯一解决方案是只return false。..

jQuery(document).ready(function () {

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

};
tnkciper

tnkciper6#

在这种情况下,事件冒泡有两个方面值得考虑:传播和默认操作。
传播是指事件冒泡。首先,锚标记获取click事件,然后是其父元素,再是其父元素的父元素,依此类推,直到文档元素。您可以通过调用e.stopPropagation()随时停止事件的传播。
默认操作是浏览器在没有采取任何措施阻止它的情况下将执行的操作。最常见的情况是,当点击带有href的锚时,浏览器将尝试导航到那里。还有其他的例子,例如,当你点击并拖动一个图像时,许多浏览器会创建一个重影图像,你可以把它放在另一个应用程序上。在这两种情况下,您都可以通过调用e.preventDefault()随时停止浏览器执行默认操作
正如在这个问题的其他答案中提到的,jQuery的.live()特性在高级元素(如document)设置了一个处理程序,并在事件向上传播后采取行动。如果锚和文档之间的处理程序调用e.stopPropagaiton() * 而不调用e.preventDefault() *,它将停止活动处理程序的响应,同时仍然允许浏览器导航(默认操作)。
我怀疑这是正在发生的事情,因为它会影响所有的浏览器,但这是一个可能的解释。

axr492tv

axr492tv7#

确保该文件。ready事件发生在你点击链接之前。
尝试将所有生命放在文档的顶部。现成的 Package 。如果你有很多JavaScript代码,这可能会有所帮助。

相关问题