您的位置:首页 > 运维架构

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

2017-02-10 11:25 417 查看
现象:如下代码在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: