在IE9中,onbeforeunload事件过于活跃
onbeforeunload event is too enthusiastic in IE9
下面是一些示例测试html:
<!DOCTYPE html>
<html>
<body>
<a href="javascript:alert('Not going anywhere!');">Go nowhere 1</a>
<a href="javascript:void(0);" onclick="alert('Not going anywhere!');">Go nowhere 2</a>
<a href="http://www.google.com">Go somewhere</a>
<script type="text/javascript">
window.onbeforeunload = function() { return "Really leave?"; };
</script>
</body>
</html>
这是一个工作页面:timjeanes.com/ie9_onbeforeunload.htm
在Firefox, Chrome和Safari中,我得到我想要的行为。也就是说,单击前两个链接中的任何一个都会显示一个警告对话框;点击第三个链接(或其他导航方式)会显示"您确定要离开这个页面吗?"的信息。
然而,在IE9中,当你点击前两个链接中的任何一个时,"你确定要离开这个页面吗?"消息也会显示出来,即使没有导航发生——我们只是在运行一些javascript。
我做错了什么吗?或者IE有一个很好的解决方案?
一个选项是使用href="#",并把我的javascript在onclick。我不喜欢这样,因为它会把用户带到页面的顶部,而我现实生活中的页面相当高。
我没有在其他版本的IE中测试过
这是一个非常不幸的错误。似乎您必须绕过它,使用哈希链接方法可能是最好的方法。为避免将用户带到页面顶部,请使用event.preventDefault()
和event.returnValue = false
取消该事件。
function myClickHandler(e) {
if (e.preventDefault)
e.preventDefault();
e.returnValue = false;
alert("Not going anywhere!");
}
这样写:
<a href="#" onclick="myClickHandler(event)">Go nowhere 1</a>
编辑:你可以像这样取消你页面上所有哈希链接的事件:
var links = document.links;
for (var i = 0; i < links.length; i++) {
var link = links[i];
if (link.href == "#") {
if (link.addEventListener) {
link.addEventListener("click", cancelEvent, false);
}
else if (link.attachEvent) {
link.attachEvent("onclick", cancelEvent);
}
}
}
function cancelEvent(e) {
e = e || window.event;
if (e.preventDefault)
e.preventDefault();
e.returnValue = false;
}
或者使用jQuery只使用一行代码:
$("a[href='#']").click(function (e) { e.preventDefault(); });
一个更简单的解决方案是在IE中使用onunload,在其他浏览器中使用onbeforeunload
href
中的#null
防止页面跳转而不仅仅是#
和onclick=""
中的脚本
你不应该使用href="javascript:...
来绑定事件:下面是不好的
<a href="javascript:alert('Not going anywhere!');">Go nowhere 1</a>
如果你要使用onclick并使href无效,那么只需在onclick中返回false。
<a onclick="alert('Not going anywhere!');return false;">Go nowhere 2</a>
当你点击第一个链接时弹出"你确定要离开这个页面吗?"这实际上不是一个bug;这似乎是ie9的一个"特性"——我不喜欢IE的更多原因
- :focus:一起活跃,不在firefox上工作
- 根据页面标题过滤活跃用户-谷歌分析
- 余烬失去活跃的踪迹
- 如何使用 pubnub 获取活跃订阅者列表
- PHP:检查是否有'这是一个活跃的PHP上传
- 制作'链接到'活跃在两条路线上,而不是一条
- 防止视窗调整网页大小时,android软键盘是活跃的
- 如何自动推进由于不活跃的质量
- Jquery取消悬停事件,而切换事件是活跃的
- 使用JavaScript和URL的活跃PHP代码
- 如果一个选项在json中已经存在,那么让它在输入字段中不活跃
- 如何抑制退格时,日期字段日历是活跃的extjs 4,特别是在IE中
- 设置“相关”;路线在奥蕾莉亚活跃
- 大喊:统计活跃用户的最好方法
- 我如何检测如果CAPS LOCK状态是活跃的,不按任何键使用JS
- 使用ngCordova检查活跃的网络连接,如果在ionic中不是活跃的,就退出应用
- 禁用滚动覆盖像Facebook一样活跃
- 保持课堂活跃,直到最后一节课开始活动
- 是否有可能有一个链接不可见/隐藏在网页源,但活跃时,按钮点击
- 如何使JavaScript运行在正常的速度在Chrome浏览器,即使标签不活跃