注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学会珍惜

You've been saying for the longest time

 
 
 

日志

 
 

window.open浏览器安全策略解析  

2013-01-08 12:35:38|  分类: 前端开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
转自:前端开发之GINANO

window.open虽然在很多时候被广大中小站长用于弹窗广告的展示,所以广受争议,但是在业务需求中还是有很多场景需要用到此功能。然而,大多数浏览器对此都有一定的安全策略进行阻止,为此本文将针对以下浏览器进行测试。

window.open浏览器安全策略解析 - 听歌 - 学会珍惜

Chrome16、Firefox10、360SE4.2、IE6、IE8

1、首先是最原始的在head标签中加入

<script>
window.open('about:blank'); //空白页
window.open('http://www.1688.com/'); //非同源知名站点
window.open('http://www.ginano.net/'); //同源
window.open('http://www.aliren.org/'); //非同源非知名站点
alert('over!');
</script>

结果显示:Firefox、IE6、Chrome、360SE均阻止了弹出广告;360SE在加载时,从第一个open开始阻止了弹窗并且停止了后续代码的执行,连over都没有弹出(这样也行)。

2、在一个非a标签上执行click事件,然后触发行为

<script>

$('#not-a').click(function(){
window.open('http://www.1688.com/');
window.open('http://www.aliren.org/');
window.open('http://www.ginano.net/');
window.open('about:blank');
alert('over!'); });

</script>
<span id="not-a">dddd</span>

结果显示:除了IE和360SE不允许同时打开两个及以上弹窗外,其他浏览器都能够正常打开所有窗口,但是360SE居然同样阻止弹窗的同时停止后后续的脚本执行!! 


3、在一个a标签上执行2中同样的操作,得出的结论一致,在此不再累述。

同样从上面的测试中可见,对于打开多个窗口和打开单个窗口基本行为一致,只是在有些时候360SE这个号称安全的浏览器做了一些额外的处理而已,所以接下来的测试将会只针对一个弹窗进行测试。如果不同网址对应的弹窗行为不同将会做进一步说明。

4、很多时候我们会根据ajax请求返回的结果来执行window.open操作,那么这个时候还能顺利打开么?

<script>
$('#tag-a,#not-a').click(function(e){
e.preventDefault();
$.ajax({
//async:false,
url:'http://www.ginano.net/',
success:function(){
window.open('http://www.ginano.net/');
}
});
//return true;
});
</script>
<a href="http://www.ddddd.com" id="tag-a">testa</a>
<span id="not-a">testb</span>

结果很意外的,360SE居然都能够打开弹窗,而其他所有浏览器都一致的阻止了弹窗。

5、重复第4种情况的讨论,修改ajax请求为同步请求,看看什么反应。结果显示所有浏览器都能够正常打开弹窗,因此得出结论:同步的操作能够解除浏览器对弹窗的限制。

6、其实还有一种非常恶心的场景,当然可以采用其他方式避免。但是如果你又不得不这样做呢?还是得看一下吧:

如果想希望通过点击B的同时,使得某个链接A也被点击(好像大多数的广告需要被点击,许多垃圾站就这样做的),就需要用到此场景

<script>

$('#not-a').click(function(){
$('#tag-a').click();
});

</script>
<a href="http://www.ddddd.com" id="tag-a">test</a> <span id="not-a">dddd</span>

而这种情况,所有浏览器都会对js触发的和鼠标触发的点击事件做出正确的判断,因此不会自动打开链接,从而影响垃圾站长们的心情。但是不急,从上面几个场景的分析可以很容易得到以下的解决方法,那就是给所需要的链接增加一个click的事件,然后通过click事件注册window.open来打开所需要的窗口: 

<script>
$('#tag-a').click(function(){
e.preventDefault();
window.open($(this).attr('href'));
return false;
});
</script>

因此就可以实现变态的需求了。。。站长们偷着乐吧!(其实这种方法和直接在触发标签中添加window.open事件别无两样) 


从上面的分析可见:

  1. 浏览器对于鼠标点击和js触发点击是有不同的行为控制的,主要是需要判断标准为事件的触发起始必须为真实的鼠标事件,以及事件执行的连贯性
  2. 同时打开多个弹窗也会受到部分浏览器的安全屏蔽。所以,一开始就自动打开弹窗将会被阻止,而通过鼠标click事件来弹窗却可以正常打开;而ajax的异步操作同样会让浏览器认为其为非连贯性的鼠标点击事件,所以需要采用同步的请求来完成。
  评论这张
 
阅读(342)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018