Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

浏览器的弹窗拦截

  window.open是浏览器自带的用于打开新窗口的方法,低版本IE上由于对这个方法没有限制造成了很多恶意弹窗的网站。现代浏览器对这个方法都有限制,但这个限制并没有规范,不同浏览器有不同的默认设置。通常浏览器只会针对一些特定的情况允许open。
  比如下面这个测试
<script>
onload=function(){
  open("http://www.web-tinker.com");
};
setTimeout(function(){
  open("http://www.web-tinker.com");
});
document.onclick=function(e){
  for(var i=0;i<10;i++)open("http://www.web-tinker.com");
};
</script>

  load事件中直接执行open在所有现代浏览器上都是不允许的,否则只要嵌套弹窗页面就可以无限地弹窗,造成不良的用户体验。后面的计时器消息中调用open也会被拦截,同样的道理。
  click事件就不同,这是用户操作产生的事件,所以可以执行open。但在IE和Chrome中,一次click事件只能执行一次open,只有Firefox会毫无节操地弹出所有。上面的测试在Firefox中可以弹出10个。
  这里直接在document上监听click所以鼠标中键也可以在Firefox上触发,如果使用鼠标中键,在Firefox上就会被阻止。Firefox上只允许鼠标左键触发时调用open,中键和右键都会被阻止。在IE和Chrome上,鼠标右键不会触发click,所以这里不存在右键的问题。但是IE中使用鼠标中键点击和鼠标左键是一样的行为,而Chrome鼠标中键点击会采取和中键点击超链接一样的行为(新标签页不获取焦点打开)。
  另外,对于一些国产浏览器,他们又有自己的行为,比如搜狗浏览器上就无法从document对象的click事件上调用open,必须把事件绑定到具体的某一个元素上才行。
  除了click之外,还有其它事件
<script>
document.onkeyup=function(){
  open("http://www.web-tinker.com");
};
document.onmouseup=function(e){
  open("http://www.web-tinker.com");
};
</script>
  这里只测试了up,down和up的行为是一样的,它们主要就是鼠标和键盘的区别。在IE和Firefox上,键盘事件是不允许执行open的,只有Chrome允许。对于鼠标事件的支持和click的行为基本相同,不同的是mouseup和mousedown支持鼠标右键。这在Firefox本来就对click支持右键,这里和click的行为完全相同,IE和Chrome上他们的行为和鼠标左键click时的行为相同,只是IE会弹出右键菜单,Chrome会自动阻止。
  这些是在浏览器使用默认设置时的测试结果。浏览器通常都提供弹窗拦截的设置,但大多数情况下用户都采取默认设置,一般不考虑特殊设置的用户。
  测试于:
    IE 11
    Chrome 31
    Firefox 25
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^