ajax回调时浏览器拦截window.open()

  1. 现象:如下代码在window.open() 时会被浏览器拦截。
    经测试,在直接open时,chrome51、firefox51、IE11 均不会拦截;
    在有ajax请求回调后,这三个浏览器均会拦截。
    $.ajax({
        type: "POST",
        url: REQUEST_BASE_PATH + "/**",
        data: {
            "productCode":systemCode
        },
        dataType: "json",
        success: function (data) {
            window.open('https://www.baidu.com',"_blank");
        },
        error: function (data) {
        }
    });

如下分别是chrome、firefox、IE浏览器的拦截现象:
这里写图片描述

这里写图片描述

这里写图片描述

解决方案:
方案1. 将异步请求改为同步请求。

async:false,

经测试,此方式在Firefox51中,会先出现about:blank,再到待跳转页面。
这里写图片描述

方案2. 先打开一个窗口(about:blank),再重定向。
建议:打开第一个空地址时可以绘制一个loading提示,以提高用户体验度。
打开现象如下:
这里写图片描述

    var win = window.open();
    $.ajax({
        type: "POST",
//        async:false,
        url: REQUEST_BASE_PATH + "/**",
        data: {
            "productCode":systemCode
        },
        dataType: "json",
        success: function (data) {
            win.location = 'https://www.baidu.com';
        },
        error: function (data) {
            win.close();
        }
    });

注:
Safari 5.1.7 只根据其设置来判断是否拦截,不论是否在回调函数中打开新窗口。
这里写图片描述

理解:
浏览器拦截新打开的窗口是因为该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了(不过如果是 _self 的话就不会有这个限制),即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger(‘click’)),浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所以被拦截。

参考:
http://www.cnblogs.com/chris-oil/p/4205517.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值