Javascript window.open()对AJAX成功的作用不同

Javascript window.open()对AJAX成功的作用不同,javascript,ajax,asynchronous,window.open,Javascript,Ajax,Asynchronous,Window.open,如果我只向您展示这个例子,我将更容易解释这个问题-> 如您所见,有两个按钮,一个称为“AJAX”,另一个称为“Direct”。。。所以,如果您单击“Direct”,它将打开窗口(Chrome上的新选项卡),但如果我尝试在AJAX成功处理程序上创建window.open(),它的工作方式就不同了。 我确信问题来自AJAX,但我不知道如何解决它。 如果有好主意,我将不胜感激。 谢谢问题是浏览器经常会阻塞窗口。除非直接响应用户操作调用它们,否则请打开s。这就是为什么单击处理程序可以工作(单击是用户操作

如果我只向您展示这个例子,我将更容易解释这个问题->
如您所见,有两个按钮,一个称为“AJAX”,另一个称为“Direct”。。。所以,如果您单击“Direct”,它将打开窗口(Chrome上的新选项卡),但如果我尝试在AJAX成功处理程序上创建window.open(),它的工作方式就不同了。
我确信问题来自AJAX,但我不知道如何解决它。
如果有好主意,我将不胜感激。
谢谢

问题是浏览器经常会阻塞
窗口。除非直接响应用户操作调用它们,否则请打开
s。这就是为什么单击处理程序可以工作(单击是用户操作),而AJAX处理程序不能工作的原因

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


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

这就像一个符咒:

// 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时,它会将变量success设置为true。
async:false
property确保在Ajax调用完成后触发if语句。

因此,window.open在与直接链接相同的情况下启动。

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

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

的可能重复以及非异步请求存在一些缺陷,如果请求的页面可能出现延迟,则不应使用它们。“请注意,同步请求可能会暂时锁定浏览器,在请求处于活动状态时禁用任何操作。”这是事实,使用此解决方案时必须小心,但据我所知,这是在相同情况下执行这两个功能的唯一方法。因为即使在Ajax版本中允许弹出窗口,它也会创建一个弹出窗口,而不会像直接调用那样打开另一个选项卡。我不知道为什么会有行为上的差异,但这似乎起到了作用。谢谢,正如您所说,它“工作起来很有魅力”:)为了防止浏览器长时间冻结,我添加了timeout=2000…请记住,如果您添加timeout=2000,并且由于某种原因Ajax调用需要2秒以上的时间,窗口将永远不会打开。也许是重置计时器的else语句?或者Ajax调用中的一个失败属性使计时器无法重置。仅供参考,这在Chrome版本30或IE 10.0.4中不再起作用。是的,这也是解决方案,但只有当响应中有一些特定信息时,我才需要打开一个窗口。。。因此,这对我来说不是一个好的解决方案,但可能会对其他人有所帮助(1+)