按钮事件中window.location更改时,IE9 onbeforeunload调用了两次..最小繁殖
IE9 onbeforeunload called twice when window.location changed in button event... minimal reproduction
我一直在努力,但却一无所获。
我有一个取消按钮,点击后会显示"window.location='404.htm';"。onbeforeunload处理程序会触发两次,但前提是用户在第一个对话框中单击"Stay on this page"。正常导航(页面刷新,转到主页)onbeforeunload处理程序只触发一次。
我已经设法用最少的HTML和脚本重新处理了这种行为:
<!DOCTYPE html>
<html>
<head>
<title>Test page</title>
</head>
<body onbeforeunload="return 'Unsaved changes';">
<form name="form1" id="form1">
<input id='cmdCancel' type="button" value="Cancel" onclick="window.location = '404.htm';" />
</form>
<script type="text/javascript">
/*
* Connecting the events via code makes no difference
*
document.forms[0].cmdCancel.onclick =
function () {
alert('Clicked cancel. About to navigate...');
window.location = '404.htm';
};
window.onbeforeunload = function () {
return "Unsaved changes";
};
*/
</script>
</body>
</html>
"onbeforeunload调用两次"有很多点击量,但没有最低限度的复制,也没有实际的解决方案。
有什么建议吗?
谢谢!
试试看,这对我很有效。这个解决方案最初由Amit发布在http://social.msdn.microsoft.com/Forums/eu/sharepointinfopath/thread/13000cd8-5c50-4260-a0d2-bc404764966d?prof=required
记住,暂时禁用onbeforeunload并在短时间后将其启用是关键。
var checkChangesEnabled = true;
window.onbeforeunload = confirmExit;
function confirmExit()
{
if(checkChangesEnabled)
{
event.returnValue = "You have not saved your document yet.";
disableCheck();
}
}
function disableCheck()
{
checkChangesEnabled = false;
setTimeout("enableCheck()", "100");
}
function enableCheck()
{
checkChangesEnabled = true;
}
不管怎样,onbeforeunload
都是通过JS来解释的,您可能可以在全局变量中使用布尔标志来知道这是否是事件启动的进程第一次运行。类似:
<head>
...
<script ...>
var flag=true;
var ret="";
function getoff() {
if(flag) {
//do your things and save your return value to the global variable "ret"
//ret="Unsaved changes";
flag=false; //with this, the code above will be executed only once
}
return ret; //the second call will return the same thing as the first call, as first call's return value is stored in a global variable, and is not modified during the second call
}
</script>
</head>
<body onbeforeunload="return getoff();">
...
另一种可能是,根据这篇文章,问题似乎来自于使用JS更改页面,你可以使用隐藏的超链接来使用HTML更改页面,比如:
<a href="404.htm" id="myButton" style="display:none;visibility:hidden;"></a>
然后你的按钮可以做:
<input type="button" ... onclick="document.getElementById('myButton').click();">
假设这些都有效,像这样的隐藏链接就是一个丑陋的黑客攻击(第一种可能性无论如何都不漂亮),但当MSIE表现得像一个网络浏览器时,不需要一些丑陋的黑客。。。
使用下一个代码,您可以在任何情况下修复此问题:
window.location = 'javascript:window.location = "http://www.google.com"';
我发现当使用回发和非asp标记的控件时,它会被调用两次。将控件从<button>
更改为<asp:Button>
等以解决此问题。
我想我找到了一个更干净的解决方案。我在回调中将onbeforeunload设置为null,并在退出前重置它:
...
window.onbeforeunload=confirmExit;
function confirmExit(){
window.onbeforeunload=null;
event.returnValue="You have not saved your document yet.";
window.onbeforeunload=confirmExit;
}
- Meteor Router数据函数被调用两次
- 从MySQL数据库中获取输入数据需要两次页面刷新
- Module.start()已激发两次
- Jquery点击事件必须点击两次
- Append元素在运行两次函数后不显示
- 防止双击执行两次jQuery post请求
- 我必须点击两次才能激活任何按钮操作(离子/角度)
- 单击jQuery会激发两次
- 如何避免在树上走两次
- button.单击两次删除附加操作后不工作
- 由于$compile,Javascript(Angular)嵌套指令加载了两次
- 单击元素两次后执行操作
- AngularJs正在阻止链接被点击两次
- 为什么我的路线处理程序会触发两次
- 为什么Highchart在我的rails应用程序中加载了两次?(未捕获的Highcharts错误#16)
- 在列表中至少使用两次随机生成的nr
- 检查某个键是否按下两次
- 一次点击,两次'单击'事件已启动
- 我的所有代码在使用Webpack编译时都会运行两次
- 按钮事件中window.location更改时,IE9 onbeforeunload调用了两次..最小繁殖