在chrome与firefox / IE中试试这个:
var cancelPressed = false;
function redirect() {
//window.location = "http://www.google.com";
alert('hi!');
}
window.onbeforeunload = function() {
window.pressedTimer = setInterval("cancelPressed = true; clearInterval(window.pressedTimer);",3000);
window.onbeforeunload = function() {
if (!cancelPressed) {
window.unloadTimer = setTimeout('redirect()',500);
window.onbeforeunload = function() {clearTimeout(window.unloadTimer);};
return "Redirecting..";
} else {
return 'wups';
}
};
return 'first!';
};
在FF / IE中,刷新,在第一个提示符下点击取消,等待大约六秒钟,然后尝试刷新。 'wups'将被触发。但是,在Chrome中,您可以根据需要等待,而cancelPressed永远不会设置为true。
您怎么看?
答案 0 :(得分:1)
您使用的是哪个版本的Chrome?如果我等待足够长时间,我还会在Chrome中收到'wups'
消息。但是,我注意到Webkit浏览器和其他浏览器之间存在细微差别。请考虑以下代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Javascript test</title>
<script type="text/javascript" language="javascript">
window.onload = function() {
document.getElementById("test").onclick = function() {
var startdate;
var interval = window.setInterval(function() {
// Get the difference (in milliseconds) between the current
// date and the startdate.
var diff = (new Date()).getTime() - startdate.getTime();
alert(diff);
window.clearInterval(interval);
}, 5000);
alert("Hello!");
startdate = new Date();
};
};
</script>
</head>
<body>
<button id="test">Test button</button>
</body>
</html>
在chrome和safari中,第二个警报将始终显示略大于5000的数字,而在其他浏览器中,您将获得0到5000之间的数字。
那发生了什么?使用setInterval()
,浏览器会创建一个计时器,该计时器将在每个给定的时间间隔内调用javascript方法。 Javascript是单线程的,一个警告框将完全阻止javascript执行。在chrome和safari中,这意味着计时器也会暂停,而在其他浏览器中,计时器会继续,但javascript方法调用将被禁止,直到警报框关闭。
这与你的例子有什么关系?这意味着在chrome和webkit中你总是必须等待至少3000毫秒才能设置cancelPressed
,而在其他浏览器中,这将发生在0到3000毫秒之间。