- 现象:如下代码在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’)),浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所以被拦截。