Javascript Chrome window.open在ajax请求后的行为类似于弹出窗口
在这种情况下,当用户按下一个按钮时,我执行一个ajax请求,然后使用ajax请求的结果生成一个URL,我想在一个新选项卡中打开该URL。但是,在chrome中,当我在ajax请求的成功处理程序中调用window.open时,它会在一个新窗口中打开,就像弹出窗口一样(并被弹出窗口拦截器阻止)。我的猜测是,由于成功代码与点击处理代码是异步的,chrome认为它不是由点击触发的,即使它与点击有因果关系。有没有办法在不同步ajax请求的情况下防止这种情况 编辑 下面是一些演示此行为的最低限度的代码:Javascript Chrome window.open在ajax请求后的行为类似于弹出窗口,javascript,ajax,google-chrome,Javascript,Ajax,Google Chrome,在这种情况下,当用户按下一个按钮时,我执行一个ajax请求,然后使用ajax请求的结果生成一个URL,我想在一个新选项卡中打开该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();
尝试添加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');
}
});
});
对我起作用的是:
var win = window.open('about:blank', '_blank');
myrepository.postmethod('myserviceurl', myArgs)
.then(function(result) {
win.location.href = 'http://yourtargetlocation.com/dir/page';
});
您在同步调用之前打开新的窗口选项卡,同时仍在范围内,抓取窗口句柄,然后在收到promise中的ajax结果后重新导航。上面@pstenstrm发布的答案(编辑2)基本上是有效的,但我只添加了一行,以使解决方案更加优雅。在我的例子中,ajax调用花费了一秒钟多的时间,而面对空白页面的用户带来了一个问题。好的是,有一种方法可以将HTML内容放入我们刚刚创建的新窗口中 e、 g:
$('a')。在('click',函数(e)上{
e、 预防默认值();
var wi=window.open('about:blank','u blank');
$(wi.document.body).html(“正在重定向,请稍候…”;
setTimeout(函数(){//async
wi.location.href=http://google.com';
}, 500);
});
这将在新选项卡中填充文本“请稍候,正在重定向…”,这似乎比用户在空白页面上看一秒钟更优雅。我想将此作为评论发布,但没有足够的声誉。没有可靠的方法。如果您的选项卡/窗口已被FF和IE6 SP2中的pop阻止程序阻止,则window.open将返回空值 我如何判断我的窗口何时被弹出窗口阻止程序阻止?和 Mozilla/Firefox和Internet Explorer 6的内置弹出窗口阻止程序 SP2,您必须检查window.open()的返回值:它将 如果不允许打开该窗口,则为null。然而,对于其他大多数人来说 弹出式拦截器,没有可靠的方法
这就是我用不同的解决方案修改我的答案的原因。很抱歉假设jquery是幸运的,click事件实际上并没有触发链接(尽管调用了javascript事件处理程序)。出于安全原因,这可能是不允许的。是的,请参见编辑2,虽然它可能对用户来说不是一个很好的体验,但如果ajax请求需要很长时间才能响应,它应该可以正常工作。按钮代码看起来如何?是的,这让chrome将其视为用户操作,做得很好!可以,但它会锁定浏览器,直到请求完成。这就是同步请求的阴暗面。。。我在非常极端的情况下使用它们。很聪明,但在最新的Firefox中似乎不起作用。解决方案可能是设置一个静态的“您正在被重定向”页面,因为about:blank显然是不可变的。
var win = window.open('about:blank', '_blank');
myrepository.postmethod('myserviceurl', myArgs)
.then(function(result) {
win.location.href = 'http://yourtargetlocation.com/dir/page';
});
$('#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);
});