window.open()在AJAX成功方面有所不同

时间:2012-04-19 07:23:26

标签: javascript ajax asynchronous window.open

  

可能重复:
  window.open(url) different behavior - same code, different timing

如果我只是向您展示该示例,那么我将更容易解释这个问题 - > http://jsfiddle.net/RU2SM/
正如你所看到的那样,有2个按钮,一个名为“AJAX”和“AJAX”。还有一个名为“直接”的...所以如果你点击“直接”'它会打开窗口(Chrome上的新选项卡),但是如果我尝试在AJAX成功处理程序上创建window.open(),它就不会以相同的方式工作。
我确定问题来自AJAX,但我不知道如何修复它 会欣赏任何好主意。 感谢

4 个答案:

答案 0 :(得分:29)

这就像一个魅力:

// Direct window.open()
$('#btnDirect').on('click',function(){
    window.open('http://google.com')
})
var success = false;  //NOTE THIS

// AJAX window.open()
$('#btnAJAX').on("click", function(){
    $.ajax({
      url: "/user/login/",
      context: document.body,
      async:false,   //NOTE THIS
      success: function(){  //THIS ALSO CHANGED
         success = true
      }
    });
    if(success){ //AND THIS CHANGED
      window.open('http://google.com')
    }
})

这样做是在Ajax调用成功时将变量success设置为true async:false属性确保在Ajax调用完成后触发if语句 所以window.open在与直接链接相同的情况下被触发。

答案 1 :(得分:14)

问题是浏览器通常会阻止window.open,除非直接响应用户操作调用它们。这就是你的点击处理程序工作的原因(点击是用户操作),但你的AJAX处理程序没有。

一种解决方案是在初始点击操作期间打开窗口,然后在AJAX成功时更新其位置(或在AJAX失败时再次关闭它)。

否则,您必须让用户在其浏览器中明确允许您域中的弹出窗口。

答案 2 :(得分:1)

更好的方法是在ajax调用成功后实现任何逻辑,每个ajax调用执行都会触发一个事件,即 $。ajax.Request.done $ .ajax.Request.fail 即可。 $。ajax.Request.done(function(){if(success){//实现逻辑}});

答案 3 :(得分:0)

作为一个补充,还值得一提的是使用async:false然后调用window.open在chrome和firefox中工作,但可能会在safari中造成麻烦......它甚至没有提供弹出窗口被阻止的信息< / p>