想用JS控制网页卸载确实是一件麻烦的事情。如果用了unload,那么很显然我们无法阻止网页的replace或者reload,因为 unload是在下一个网页到达client的时候被触发的,因此我只能选择用onbeforeunload。
onbeforeunload 被调用的时候,当前的页面尚未被unload,所以我们还能够来得及做一些事情。但是我最近也遇到了一些麻烦:onbeforeunload有时候会莫名 其妙的被执行两次。不管是IE还是FF都会出现这种现象。这是个极为隐蔽的问题,我费了好些力气才揪出了它。
究其原 因,是因为如果我们只剩最后一个标签页,那么关闭该标签页的时候,整个browser也会被关闭掉。如果恰好最后一个tab上跑的一段js中有 onbeforeunload事件的调用,这个onbeforeunload就会执行两次。注意:如果是刷新,则不会存在这个问题,因为browser不 会随之关闭。所以我猜测,浏览器的关闭过程中,当最后一个tab关闭时,onbeforeunload被调用一次,随即整个browser关闭,onbeforeunload 再次被调用。
当然还没有很好的解决方案。目前解决的思路如下:
var hasExecuted=false; function onBeforeUnloadHandler(event){ if(this.hasExecuted==true){ return; } // TO-DO SOMETHING this.hasExecuted=true; }