realazy


Firebox 3 后退后按钮 diasabled 状态不恢复的一个解决方案

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" 的属性。

12 Responses to “Firebox 3 后退后按钮 diasabled 状态不恢复的一个解决方案”

  1. fireyy Says:

    有这种事,还真没发现过

  2. old9 Says:

    我以前遇到过这种网站,后退了还是 disabled,不过记得刷新一下就好了,难道firefox3 新增的 bug?

  3. 卢子嘉 Says:

    先转载了在说

  4. lifesinger Says:

    这其实是firefox的特性,可以关闭的,看这里:http://lifesinger.org/blog/?p=569

    PS: realazy没开启自动显示trackback?

  5. buzhizhe Says:

    一直用ff3,未发现此bug

  6. Lucars Says:

    哈哈?真是非常奇妙,今天刚刚发现这个问题,还没有来得及去研究就发现了解决方法了?巧妙,非常巧妙。

  7. hax Says:

    这个不能说是FF的bug,而是高速缓存特性。实际上,在某些场合也许你希望back回去,原来disabled掉的部分会继续disabled(正如表单的其他部分也保持原状)。
    事实上,我认为按下之后disable按钮的做法并不是一个完善的方法。比如因为某些原因你提交失败,你要如何再次提交呢?
    如果要坚持使用这一方式,用pageshow事件来处理就是最合理的方式——既然本来你就是用脚本disable它的,你就有责任做好各项善后工作。除了pageshow来处理back的问题,这也包括在提交失败的情况下重新enable按钮。

  8. hax Says:

    因此岁月如歌的autocomplete=off并不是一个合理的规避方法,何况在FF2下也是不起作用的。

  9. netwjx Says:

    我这里ff3.0.3下 用岁月如歌的示例 后退依然disabled 需要刷新

  10. 闲耘 Says:

    lazy的软硬刷新不知道分别指的什么,不过我使用FF3刷新(F5,刷新按钮,地址栏回车)是可以的,需要注意的是,back回来时,焦点有可能在disabled掉的提交按钮上,此时F5是无效的。
    我觉得hax说的很有道理,不过只需要做好善后处理就行了,这个善后包括提交成功与失败,AJAX提交较好处理,普通提交时,在unload时enable提交按钮即可。

  11. hax Says:

    to闲耘:
    unload会阻止FF的高速快取特性。不过你提醒了我们,不应该等到下一次pageshow时处理,而应该在本页的pagehide事件里做善后啊。

  12. hax Says:

    今天又看了一下,根据http://dev.opera.com/articles/view/efficient-javascript/?page=4的说法,貌似disable按钮直接会禁用Opera的fast history nav(即使用unload恢复)。所以最好不要disable按钮。

Leave a Reply


realazy (懒到死) is proudly powered by WordPress | Entries (RSS) and Comments (RSS)