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