我有以下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中可以正常工作这会指向环境问题。可能导致这种行为的原因是什么?
答案 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)
答案 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代码,它可能会有所帮助。