因为safari在如何执行位置更改方面非常奇怪,我在正确运行某些功能时遇到了一些问题。发生这种情况:
myFunc
location.href = stuff
setTimeout(myFunc2,0)
//here i would expect the beforeunload event, instead i get:
myFunc2
beforeunload
现在的问题是,我根本不希望调用myFunc2,因为它在实际位置更改后排队到堆栈中。我也试过这样的事情:
var prevLoc = location.href;
function myFunc(){
location.href = stuff;
setTimeout(myFunc2, 0);
}
function myFunc2(){
if(location.href == prevLoc) return;
//...
}
也不起作用,因为location.href不是stuff
,而是当前页面的位置。
defineProperty,prototypechanges和其他实现都没有选项,因为无法重新定义location.href,可能是因为window.location = something
的奇怪功能
也许是一个更简单的例子,比如我想跟踪回调所需的时间,但是如果它改变了页面(我会在下一页关闭它),那就不是了。
var funcStarted = 0;
function startFunc(){
funcStarted = Date.now();
theFunc()
setTimeout(endFunc, 0);
}
function theFunc(){
window.location = "http://www.example.com";
}
//this correctly isn't executed in all browsers, except safari
function endFunc(){
console.log("time: " + (Date.now() - funcStarted));
}
底线: 我需要一些东西来检测是否已触发位置更改,但是onbeforeunload函数为时已晚。