关于“浏览器没法拦截的弹出窗口”、IE、Firefox强制弹出新窗口

大概有好久好久都没有打理这里了,刚朋友问我,如何防止 弹出框被 浏览器屏蔽,我突然想到了一个万全之策。 html

通常来讲,咱们会用 js 弹出窗口: window.open( url ); 这种方案基本被废弃了,由于全部浏览器都会封杀这种写法。 api

我要说的有两种方案:
一、好比,咱们要弹出一个网页:http://julying.com,那么能够 构造: 浏览器

<a id=”openWin” href=”http://julying.com”></a>
而后写脚本, 安全

JS写法:
document.getElementById(‘openWin’).click(); 
jQuery写法:
$(‘#openWin’).click(); 函数

但这个写法是有问题的,他只能在 IE有做用,、非 IE浏览器 的 click() 是无效的,要专门正对非IE浏览器写新的脚本,这跟麻烦。 测试

二、用 <form />
构建html: url

<form id=”openWin” action=”http://julying.com” target=”_blank” method=”get”></form> spa

而后写脚本, 插件

JS写法:
document.getElementById(‘openWin’).submit(); 
jQuery写法:
$(‘#openWin’).submit(); orm

这种方案,任何浏览器均可以执行,而且不会被任何浏览器以及插件屏蔽。

—- 王子墨 2010 年 3月

2012.5.2 日补充:
看到留言说,上面方法失效了。
刚才测试了一下,上述方法,在 Firefox 4.0 版本以后已经失效了。Firefox 为了阻止广告,更加安全,禁止了脚本 自动 触发 .submit() , .click() 事件。

也就是说,脚本不能 在用户不触发事件的时候,不能打开一个新窗口,就是说必须是是用户主动触发 <a /> 的 click() 事件,或者 主动触发submit()事件。

因此:
<form id=”openWin” action=”http://julying.com” target=”_blank” method=”get”></form> , 
document.getElementById(‘openWin’).submit(); 
仍是会被屏蔽。

就在我决定睡觉的时候,我突然想到这样的方法:
$(document).click(function(){
$(‘#openWin’).submit();
}); 
测试之下,发现这样是可行的!
在Firefox 11 ,Chrome 17 下测试经过。

可是 :
$(window).scroll(function(){
$(‘#openWin’).submit();
});
仍是会被屏蔽。

总结一下:
若是您须要在弹出新窗口一次,可用代码:

<form id=”openWin” action=”http://julying.com” target=”_blank” method=”get”></form>
$(document).one(‘click’,function(){
$(‘#openWin’).submit();
});

固然,也能够:
<a id=”openWin” href=”http://julying.com” target=”_blank”></a>
$(document).one(‘click’,function(){
$(‘#openWin’).
click();
});

.one()函数 是 jQuery 特有的函数,详见:http://julying.com/jQuery-1.6-api/#p=one

即:当用户点击网页任何一个地方,会弹出窗口一次。若是用户不点击,就不会弹出!

Firefox 限制真严格啊。

通过测试,只容许 click() 内部嵌套 .submit() 、click() 事件。
mousemove , mouseout , $(window).scroll() 这种类型的所有不容许。

夜好深了,个人思惟有点不清楚了,上面的文字感受写的乱七八糟,凑和着看吧 ,这算抛砖引玉,能够顺着这个思路继续走下去。 我得睡了,有问题,到QQ群:jQuery 自习室 (群号:7599526 ) 讨论吧。