window.open为何会被浏览器拦截

window.open为何会被浏览器拦截

        由于最近在做facebook第三方登录的辅助功能,需要用到window.open弹窗来登录,但是在做的过程中发现弹出窗口居然被浏览器给拦截了,我们知道像chrome和firefox都对弹窗比较敏感,但是我原本认为浏览器应该不会过滤掉一些正规的站点的弹窗才对,但是后面证实我的第一感觉是错误的。


        我们先来看一个Demo:

$("#test_btn").click(function(){
    $.get("/echo/json/").done(function(data){   
    	window.open("http://www.520UED.com","LoginWindow","location=1,scrollbars=1," + "width=" + 500 + ",height=" + 500 + "," +"left=" + 500 + ",top=" + 200); 
    });   
});

Demo

        窗口被浏览器拦截了,为什么呢,我绑定了一个按钮,触发window.open的时候我先去做了一次ajax查询,原因有各种理由,例如我做第三方登录我想先判断用户是否已经登录了第三方的网站在确认弹窗,如果用户已经登录并授权了,我就直接不弹出窗口直接让用户进入下一步的操作。但是居然被浏览器拦截了。

    后面我又修改了下代码,居然window.open没被浏览器拦截了:

$("#test_btn").click(function(){
	window.open("http://www.520UED.com","LoginWindow","location=1,scrollbars=1," + "width=" + 500 + ",height=" + 500 + "," +"left=" + 500 + ",top=" + 200); 

    $.get("/echo/json/").done(function(data){   
    	console.log(data);
    });   
});

Demo

        代码中我只是将window.open放到了ajax之外处理,浏览器就没有拦截我的窗口了,后面经过研究,我    发现浏览器对点击事件产生的链接定义是如果点击那瞬间你产生的链接他都会定义为类似a标签产生跳转,不会被浏览器定义为广告窗口,但是如果点击事件进行了二次的操作,例如ajax成功或者失败后在触发的window.open都会被浏览器定义为广告弹窗会被拦截,因为window.open不是事件触发时马上被执行的,所以可能会是广告弹窗,因为现在很多广告窗口都是会去做一些操作后在弹窗。


        在做写一段代码来证实下上面的说法:

$("#test_btn").click(function(){
	setTimeout(function(){
		window.open("http://www.520UED.com","LoginWindow","location=1,scrollbars=1," + "width=" + 500 + ",height=" + 500 + "," +"left=" + 500 + ",top=" + 200);
	},100);
});

Demo

        上面的代码同样是被浏览器给拦截了,虽然我这次没用ajax操作后弹窗,但是我做了一个延迟的操作,延迟操作导致window.open不是第一事件下的方法,所以被浏览器认为是广告弹窗,我们经常会发现浏览网站的时候经常进入一个页面过了一分钟或者几分钟就会弹出一些广告窗口,但是大都被浏览器拦截了。不过现在太多的广告,点某某网站下载链接,先给你来个广告在给下载,捆绑式销售,没办法,咱们还是要买账。


转载请注明来自 520UED http://www.520ued.com/article/5417ef368d31c11e3b0003ff

comments powered by Disqus