window.open()弹出窗口被拦截.

谭兄
  • 276

从后端传一个url, 前端收到后打开新窗口跳到这个链接.
使用 window.open(url, '_blank'); 被浏览器拦截.

请问有什么办法实现吗 ? 试了下模拟a标签点击照样拦截, 弹出div加载iframe不行, 必须要打开窗口.

问题已解决, 见采纳答案.

回复
阅读 5.1k
9 个回答

这个问题首先要了解为啥会拦截,浏览器会对"非人为"的调用window.open的弹窗进行拦截,什么叫做"非人为"的,就是浏览器判断在用户操作和window.open之间不是连续的,浏览器会认为可能是流氓程序弹出的广告窗口从而进行拦截
从楼主的描述可以看出,楼主应该是进行某个操作之后,通过ajax去获取一个url,然后通过window.open打开页面,我们都知道ajax是异步的,浏览器就认为不是连续的,所以就拦截了
解决方法可以先在操作(比如点击)的时候,直接window.open,然后再去ajax获取数据,再给打开的window赋值url,大概的伪代码如下:

el.addEventListener('click',function(){
    var winHandler = window.open("","_blank");
   ajax(function(url){
        winHandler.location.href = url;
   });
    
})
<a href="http://www.baidu.com" target="_blank" id="xx">hahah</a>
    <button type="button" id='btn'>clickme</button>
    <script>
        document.getElementById('btn').onclick = function() {
            document.getElementById('xx').click();
        }
    </script>

没毛病啊。

为什么要加_blank?

window.open('www.baidu.com')
小汤圆
  • 3
新手上路,请多包涵

url要是带http或者https头的

把触发方法的事件写成一个a标签,获取url的逻辑写在这个a标签指向的Controller里,然后就可以返回一个新页面,总之绕过window.open方法

浏览器为了安全问题,会自动拦截弹窗

只有用户点击之后一小段时间内的一个打开新窗口的命令,比如,window.open 才不会被拦截,这是浏览器的安全限制。

may_be
  • 2
新手上路,请多包涵

试试给ajax请求参数再加一条:async: false

YangJing_
  • 2
新手上路,请多包涵

已解决问题
参考博文:http://flc.io/2015/11/289.html

片段代码:

点击弹窗

<script>
function dialog(){

$.ajax({
    url: 'url',
    type: 'POST',
    dataType: 'json',
    **async: false,**  **// 此处必须定义为同步**
    data: {param1: 'value1'},
    success: function(data){
        gotourl(data.url);  //发起弹窗
    }
})

}

/**

  • 弹窗
  • @param {string} url 跳转链接

*/
function gotourl(url){

var a = $('<a href="'+ url +'" target="_blank">链接</a>');  //生成一个临时链接对象
var d = a.get(0);
var e = document.createEvent('MouseEvents');
e.initEvent( 'click', true, true );  //模拟点击操作
d.dispatchEvent(e);
a.remove();   // 点击后移除该对象

}
</script>

你知道吗?

宣传栏