我的情况是,当用户按下按钮时,我执行ajax请求,然后使用ajax请求的结果生成我想在新选项卡中打开的URL。但是,当我在ajax请求的成功处理程序中调用window.open时,在chrome中,它会在弹出窗口的新窗口中打开(并被弹出窗口阻止程序阻止)。我的猜测是,由于成功代码与点击处理代码是异步的,因为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');
}
});
});
一个澄清的说明:我更倾向于在单独的窗口而不是标签中打开它,而不是我被弹出窗口阻止程序阻止。
答案 0 :(得分:19)
尝试添加
window.open(url,'_blank');
好吧,我不认为你打开一个不是用户操作的直接结果(即不是异步)的页面时,你可以绕过弹出窗口阻止程序。
你可以试试这样的东西,它应该看起来像弹出窗口拦截器的用户动作:
var $a = $('<a>', {
href: url,
target: '_blank'
});
$(document.body).append($a);
$a.click();
看起来你最好保持同步。
只要新窗口是“相同的原点”,你就有能力用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);
});
答案 1 :(得分:14)
尝试添加async:false。它应该工作
$('#myButton').click(function() {
$.ajax({
type: 'POST',
async: false,
url: '/echo/json/',
data: {'json': JSON.stringify({
url:'http://google.com'})},
success: function(data) {
window.open(data.url,'_blank');
}
});
});
答案 2 :(得分:10)
对我有用的是:
var win = window.open('about:blank', '_blank');
myrepository.postmethod('myserviceurl', myArgs)
.then(function(result) {
win.location.href = 'http://yourtargetlocation.com/dir/page';
});
当你仍然在范围内时,在同步调用之前打开新窗口选项卡,抓住窗口句柄,然后在收到承诺中的ajax结果后重新导航。
答案 3 :(得分:8)
@pstenstrm上面发布的答案(编辑2)大多有效,但我只添加了一行来使解决方案更加优雅。在我的情况下,ajax调用花了一秒多的时间,面向空白页的用户提出了一个问题。好消息是,有一种方法可以将HTML内容放在我们刚刚创建的新窗口中。
e.g:
$('#a').on('click', function(e){
e.preventDefault();
var wi = window.open('about:blank', '_blank');
$(wi.document.body).html("<p>Please wait while you are being redirected...</p>");
setTimeout(function(){ // async
wi.location.href = 'http://google.com';
}, 500);
});
这会在新标签中填入文字&#34;请等待您重定向...&#34;这似乎比用户查看空白页一秒钟更优雅。我希望将此作为评论发布,但没有足够的声誉。
答案 4 :(得分:1)
没有可靠的方法。如果您的选项卡/窗口已被FF和IE6 SP2中的弹出窗口阻止程序阻止,则window.open将返回值null。
https://developer.mozilla.org/en-US/docs/Web/API/Window/open#FAQ
如何通过弹出窗口拦截器阻止我的窗口被阻止?随着 Mozilla / Firefox和Internet Explorer 6的内置弹出窗口阻止程序 SP2,你必须检查window.open()的返回值:它将是 如果不允许打开窗口,则返回null。但是,对于大多数其他 弹出窗口拦截器,没有可靠的方法。