我有这样一种情况,当用户按下一个按钮时,我执行一个 ajax 请求,然后使用 ajax 请求的结果生成一个我想在新选项卡中打开的 URL。但是,在 chrome 中,当我在 ajax 请求的成功处理程序中调用 window.open 时,它会像弹出窗口一样在新窗口中打开(并被弹出窗口阻止程序阻止)。我的猜测是,由于成功代码与点击处理代码异步,因此 chrome 认为它不是由点击触发的,即使它与点击有因果关系。有没有办法在不同步 ajax 请求的情况下防止这种情况发生?
编辑 下面是一些演示此行为的最小代码:
$('#myButton').click(function() {
$.ajax({
type: 'POST',
url: '/echo/json/',
data: {'json': JSON.stringify({
url:'http://google.com'})},
success: function(data) {
window.open(data.url,'_blank');
}
});
});
需要澄清的一点:我更关心它在单独的窗口而不是选项卡中打开,而不是它被弹出窗口阻止程序阻止。
最佳答案
尝试添加
window.open(url,'_blank');
编辑
好吧,我认为在打开不是用户操作的直接结果(即非异步)的页面时,您无法绕过弹出窗口拦截器。
虽然你可以尝试这样的事情,它应该看起来像一个弹出窗口拦截器的用户操作:
var $a = $('<a>', {
href: url,
target: '_blank'
});
$(document.body).append($a);
$a.click();
编辑2
看起来您最好保持同步。
只要新窗口是“同源”的,你就可以用 JS 来操作它。
$('#a').on('click', function(e){
e.preventDefault();
var wi = window.open('about:blank', '_blank');
setTimeout(function(){ // async
wi.location.href = 'http://google.com';
}, 500);
});
关于javascript - ajax 请求后的 Chrome window.open 就像弹出窗口一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22007592/