Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome window.open在ajax请求后的行为类似于弹出窗口_Javascript_Ajax_Google Chrome - Fatal编程技术网

Javascript Chrome window.open在ajax请求后的行为类似于弹出窗口

Javascript Chrome window.open在ajax请求后的行为类似于弹出窗口,javascript,ajax,google-chrome,Javascript,Ajax,Google Chrome,在这种情况下,当用户按下一个按钮时,我执行一个ajax请求,然后使用ajax请求的结果生成一个URL,我想在一个新选项卡中打开该URL。但是,在chrome中,当我在ajax请求的成功处理程序中调用window.open时,它会在一个新窗口中打开,就像弹出窗口一样(并被弹出窗口拦截器阻止)。我的猜测是,由于成功代码与点击处理代码是异步的,chrome认为它不是由点击触发的,即使它与点击有因果关系。有没有办法在不同步ajax请求的情况下防止这种情况 编辑 下面是一些演示此行为的最低限度的代码: $

在这种情况下,当用户按下一个按钮时,我执行一个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);
});