opera下的onload、onunload事件无法正确处理?
今天,QA在测试JS框架的时候发现了一个问题:opera下不能绑定onunload事件,最新的opera 10.51也不行。
网上的解释千奇百怪,有说opera不支持unload事件的,有说使用beforeunload事件代替unload事件,还有的人说把通过js修改opera的history.navigationMode为’compatible’后就能正常支持这个事件了。
而按照我的测试,不管是按照window.unload绑定还是用addEventListener绑定的事件都无法在刷新、前进、后退,页面关闭,浏览器关闭时被执行。beforeunload事件表现相同。正在我怀疑opera彻底不支持unload事件时,恰好找到了bytes.com上的这篇文章。上面说的很清楚:
There is no solution because according to Opera developers and users this is not a bug. Opera maintains the runstate of scripts, so it’s as if we never left the page when we return back to it. According to Opera, onload should only fire when loading the page for the first time and onunload should fire when unloading the page completely, not when just leaving the page by pressing the back, forward or refresh button. Refresh is considered to be a reload, not an unload.
大意是说,opera开发人员和用户不认为这是一个bug,因此没有解决方案。opera会维护脚本的运行状态,因此当用户回到某页面的时候,页面会和离开的状态相同。onload只会在第一次打开页面的时候触发,而onunload只会在这个页面完全被unload时触发。而在用户使用后退,前进,刷新按钮重新打开这个页面时不会被触发。刷新是reload,而不是unload。
上面解释了unload为何不会被触发的原因。
继续测试,发现点击页面上的链接时,onunload事件会被正常触发。在加载一个其他页面的时候,这个页面会被unload掉(可以明显的看到进度条在加载),而使用前进后退切换页面时,在瞬间就被加载完毕,页面这是从内存中取得的。
最后,找到了opera官网上的这篇文章,上面有一段解释了opera对Fast history navigation的处理方法,对理解opera出现这样的结果也有帮助。
后来和CatChen讨论时,他提到了firefox有onpageshow和onpagehide事件,在firefox中可以用这个来专门处理前进后退的事件。
我找到了MDC上面关于firefox页面缓存的介绍,里面有关于onpageshow和onpagehide事件的解释,可惜这对事件不是DOM2标准定义的事件。在现代浏览器都逐渐开始做页面前进后退加速,保存表单和JS执行状态的时候,有这样一对事件对Web开发人员来说是很必要的。
iphone上的网游:we rule » « 博客迁移到nginx
相关文章
- No Related Posts
天堂左我往右 于 2010-04-28 @ 18:10:00 留言 :
[ 引用 ]原理是这样啊,学习了,3q