如果我只是向您展示该示例,我将更容易解释问题 -> http://jsfiddle.net/RU2SM/
正如您所看到的,有 2 个按钮,一个称为“AJAX”,一个称为“直接” ...因此,如果您单击“直接”,它会打开窗口(Chrome 上的新标签),但如果我尝试在 AJAX 成功处理程序上创建 window.open(),则它的工作方式不同。
我确定问题来自 AJAX,但我不知道如何解决它。
将欣赏任何好主意。谢谢
4 回答
这就像一个魅力:
// 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 在与您的直接链接相同的情况下被触发。
问题是浏览器通常会阻止window.open
s ,除非它们被直接响应用户操作而被调用。这就是您的点击处理程序有效(点击是用户操作)但您的 AJAX 处理程序无效的原因。
一种解决方案是在初始单击操作期间打开窗口,然后在 AJAX 成功时更新其位置(或在 AJAX 失败时再次关闭它)。
否则,您必须让用户在其浏览器中明确允许来自您的域的弹出窗口。
另外值得一提的是,使用 async: false 然后调用 window.open 可以在 chrome 和 firefox 中工作,但会在 safari 中造成麻烦……它甚至没有提供弹出窗口被阻止的信息
Better way implement any logic after success of ajax call, there is an event fired on every ajax call execution i.e. $.ajax.Request.done and $.ajax.Request.fail. $.ajax.Request.done(function(){ if(success){ // Implement logic } });