Firefox 3 有一个很让人讨厌的bug:基于某种目的,在表单提交时 disable 掉提交按钮,通过后退键回到这个页面后,这个提交按钮的状态依旧保持为 disabled 的状态,重新载入(软硬刷新)也无法改变。
google 良久,从 https://developer.mozilla.org/En/Using_Firefox_1.5_caching 中发现一个 window.onpageshow 事件,window.onload 事件无法在后退的页面中出发,但这个可以,所以解决方案就是它了。
window.addEventListener('pageshow', function(e){
// 重置你不需要 disabled 的按钮
}, false);
更新:网友岁月如歌的解决方案比我的方案简易和正宗多了:给提交按钮加上 autocomplete="off" 的属性。
October 27th, 2008
by fireyy
有这种事,还真没发现过
October 27th, 2008
by old9
我以前遇到过这种网站,后退了还是 disabled,不过记得刷新一下就好了,难道firefox3 新增的 bug?
October 28th, 2008
by 卢子嘉
先转载了在说
October 28th, 2008
by lifesinger
这其实是firefox的特性,可以关闭的,看这里:http://lifesinger.org/blog/?p=569
PS: realazy没开启自动显示trackback?
October 31st, 2008
by buzhizhe
一直用ff3,未发现此bug
November 3rd, 2008
by Lucars
哈哈?真是非常奇妙,今天刚刚发现这个问题,还没有来得及去研究就发现了解决方法了?巧妙,非常巧妙。
November 7th, 2008
by hax
这个不能说是FF的bug,而是高速缓存特性。实际上,在某些场合也许你希望back回去,原来disabled掉的部分会继续disabled(正如表单的其他部分也保持原状)。
事实上,我认为按下之后disable按钮的做法并不是一个完善的方法。比如因为某些原因你提交失败,你要如何再次提交呢?
如果要坚持使用这一方式,用pageshow事件来处理就是最合理的方式——既然本来你就是用脚本disable它的,你就有责任做好各项善后工作。除了pageshow来处理back的问题,这也包括在提交失败的情况下重新enable按钮。
November 7th, 2008
by hax
因此岁月如歌的autocomplete=off并不是一个合理的规避方法,何况在FF2下也是不起作用的。
November 8th, 2008
by netwjx
我这里ff3.0.3下 用岁月如歌的示例 后退依然disabled 需要刷新
November 13th, 2008
by 闲耘
lazy的软硬刷新不知道分别指的什么,不过我使用FF3刷新(F5,刷新按钮,地址栏回车)是可以的,需要注意的是,back回来时,焦点有可能在disabled掉的提交按钮上,此时F5是无效的。
我觉得hax说的很有道理,不过只需要做好善后处理就行了,这个善后包括提交成功与失败,AJAX提交较好处理,普通提交时,在unload时enable提交按钮即可。
November 18th, 2008
by hax
to闲耘:
unload会阻止FF的高速快取特性。不过你提醒了我们,不应该等到下一次pageshow时处理,而应该在本页的pagehide事件里做善后啊。
November 26th, 2008
by hax
今天又看了一下,根据http://dev.opera.com/articles/view/efficient-javascript/?page=4的说法,貌似disable按钮直接会禁用Opera的fast history nav(即使用unload恢复)。所以最好不要disable按钮。
February 17th, 2009
by li
to hax
https://bugzilla.mozilla.org/show_bug.cgi?id=439810
这里面已经有了,但是还没有被承认。。。。。。
还有就是2.0中没有这个问题,3.0却有自身的特性都不统一,很难说这不是bug把。
https的情况下同样没有问题
pageshow事件是所有浏览器都支持么?
本人是个新人,说的不对的请指教
February 17th, 2009
by li
2.0也有这个问题,抱歉我没搞清楚
但是我的程序在2.0中就ok,3.0下才出的问题。。。。。。。