"javascript:void(0);"是个好选择吗?

IE对GIF动画的一个BUG中,提到了由于onbeforeunload事件形成浏览器进行中的请求被挂断的问题,这篇算是一个扩展。javascript

在网页中咱们经常使用<a href="javascript:void(0);"> ... </a>(包括其变种如javascript:等)来作一个“不会跳转”的超连接,而这个a标签一般会长得像一个按钮,或者充当了按钮的功能。前端

先抛开BUG不说,从语义上讲,a标签来作按钮是不合适的。但这么作实际上是处于历史缘由:在IE6或更古董的浏览器中,:hover等普遍应用的伪类只对a标签生效。悬浮态、点击态对于按钮来讲是很是重要的,但若是用JS来实现这事就有点蛋B,杀鸡用牛刀了,因而为了图便宜,你们都采用a加上各类样式来充当按钮功能。java

时间一长,按钮的点击不少不会是页面跳转了,而是页面内交互。这时候问题来了:a标签一点击,页面跳走了,没得玩儿了。因而强需求“不会跳转的a标签”,使用事件机制阻止浏览器默认行为固然是很好的,可是毕竟要手工操做,容易漏,再加上前端捉襟见肘的代码量,彷佛这种正经方法不怎么遭人待见。浏览器

结果容易的方法固然仍是被人找出来了,起先是onclick="return false;",没啥问题,可咱不是不提倡写内联事件绑定么?因而有了href="#",时间一长,发现hash是颇有用的,好比能够用来作历史记录,固然还有它原本的页面定位的做用,并且这容易形成页面跳到最顶上去,因而这样的a标签虽然不会跳转页面,但实际上是有破坏性的。后来不知道是谁发明了本文的猪脚:javascript:void(0);可谓惊为天人,后续为了省几个字符所扩展的都算不上啥,因为其较小的破坏性和很是便捷的用法,一度成为比较公认的最佳实践。动画

基本上来讲这没太大问题,缺点就是由于javascript:这个protocol是会触发onbeforeunload事件,从而引起一连串没必要要的麻烦。 那么,哪里才能买获得呢怎么才是真正的最佳实践呢?.net

我以为有三种选择:代理

  1. 只要是不跳走的,就坚定不用a标签作按钮,而后让IE6玩儿蛋去。
  2. 保证对每一个按钮性质的a标签都阻止浏览器默认事件行为。
  3. 用事件代理,在body上捕获全部a标签的点击事件,判断其href并阻止浏览器默认行为。

2麻烦 3可能受阻止冒泡的影响 教练,我想选1code

转载自:http://jimliu.net/2013/04/13/javascriptvoid0%E6%98%AF%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E5%90%97%EF%BC%9F/事件

相关文章
相关标签/搜索