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事件,然后触发行为

$('#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!');

});

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

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

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

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

$('#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;

});

<a href="http://www.ddddd.com" id="tag-a">testa</a>

<span id="not-a">testb</span>

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

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

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

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

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

$('#tag-a').click();

});

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

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

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

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

e.preventDefault();

window.open($(this).attr('href'));

return false;

});

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

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

360浏览器拦截弹窗,window.open方式打不开新页面的更多相关文章

  1. 防止浏览器拦截的window.open新窗口方案

    背景 当前的浏览器为了保证用户体验,在很多场合下禁止了window.open打开新窗口,下面就给出一些方案,最大程度上的实现新窗口打开一个链接. 方案 //打开新链接方法实现 function win ...

  2. ajax请求后弹开新页面被浏览器拦截

    window.open()我想应该很多人都不陌生吧,它可以实现除用a标签以外来实现打开新窗口! 最近开发项目用到时,却遇到了麻烦,本来好好的弹出窗口,结果被浏览器无情的给拦截了! 代码如下: $.ge ...

  3. ajax回调中window.open弹出的窗口会被浏览器拦截的解决方法

    存在问题:处理页面ajax请求过程中,异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法 来实现,最终都被浏览器拦截了.不会跳到对应的页面,如下 原因:浏览器之所以拦截 ...

  4. window.open方法被浏览器拦截的处理方式

    问题现象 当我们在一个 ajax 回调中执行 window.open 方法时,新页面会被浏览器拦截. 原因 在 Chrome 的安全机制里,非用户直接触发的 window.open 方法,是会被拦截的 ...

  5. 【转载】window.open被浏览器拦截的解决办法

    今天在处理程序的过程中,发现window.open方法会被浏览器拦截,导致无法打开新页面,查阅相关资料后发现,主要原因是浏览器为了维护用户安全和体验,禁止在javascript中直接使用window. ...

  6. (转)js弹窗&返回值(window.open方式)

    本文转载自:http://hi.baidu.com/z57354658/item/5d5e26b8e9f42fa7ebba93d4 js弹窗&返回值(window.open方式) test.h ...

  7. window.open()被浏览器拦截问题汇总

    一.问题描述 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截.何况当出现拦截时,很多用户根本不知道发 ...

  8. window.open打开新窗口被浏览器拦截的处理方法

    一般我们在打开页面的时候, 最常用的就是用<a>标签,如果是新窗口打开就价格target="_blank"属性就可以了, 如果只是刷新当前页面就用window.loca ...

  9. 360浏览器下载excel问题解决方式

    亲们有没有碰到过今天我遇到的这件事. 如果使用简单的链接.或者get方式提交的表单,去下载excel,那么360浏览器就会有问题. 问题是:它没把我用java生成的excel表格下载,而是去把我的列表 ...

随机推荐

  1. php分页笔记

    在做留言板的时候,用到了分页,所以写了这个分页笔记   既然已经开始写分页了,肯定掌握了了php的一些知识以及mysql的基本操作   在做分页的时候,我也遇到了很多问题,但是大家不要怕,无论什么问题 ...

  2. yii之srbac详解

    一.安装篇 1.下载http://www.yiiframework.com/extension/srbac/ 将解压得到的srbac文件夹放在moudles目录下. 2.在项目的主配置文件中mai.p ...

  3. SWD模式和JTAG模式

    一.功能 SWD模式:仿真 下载 JTAG模式:仿真 下载 二.接口 1.J-link JTAG/SWD接口 2.开发板接口电路 ①SWD模式 4根线(包片机) ②JTAG模式 20脚JTAG(网络) ...

  4. .Net Framework Data Provider可能没有安装

    方法一.下载SQL Server Compact 4.0 安装后就可以解决.下载地址是: http://www.microsoft.com/downloads/zh-cn/details.aspx?f ...

  5. JavaScript高级之函数的四种调用形式

    主要内容 分析函数的四种调用形式 弄清楚函数中this的意义 明确构造函对象的过程 学会使用上下文调用函数 了解函数的调用过程有助于深入学习与分析JavaScript代码. 本文是JavaScript ...

  6. uva 1267 - Network

    这个题目关键在于把无根树变成有根树:这个用dfs: 然后用贪心的方法,从最深的那层开始,每次找到节点的上k层,建一个服务器,然后用一个dfs把这个服务器能够覆盖的节点标记: #include<c ...

  7. 有关TCP和UDP 粘包 消息保护边界

    http://www.cnblogs.com/lancidie/archive/2013/10/28/3392428.html 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因 ...

  8. Ubuntu下安装Qt4.5(包括X86和ARM版本)

    条件:TQ2440开发板,虚拟机安装的Ubuntu10.04,安装好天嵌自带的GCC交叉编译器参考:http://blog.csdn.net/newnewman80/article/details/6 ...

  9. View以自身中心旋转的代码解惑

    matrix.preTranslate(-centerX, -centerY); matrix.postTranslate(centerX, centerY); 经常在中心旋转的应用中看到这段代码. ...

  10. logstahs 匹配isslog

    2016-11-30 06:33:33 192.168.5.116 GET /Hotel/HotelDisplay/cncqcqb230 - 80 - 192.168.9.2 Mozilla/5.0+ ...