【发布时间】:2014-08-22 11:38:59
【问题描述】:
情况
我们有一种情况,在执行 XHR / Ajax 请求后,我们需要onclick-open a new tab 在浏览器中。
我们通过将 Ajax 请求设置为同步执行来保持可信点击事件的上下文,这样可以正常工作。
问题
但是,在最新的 Chrome 版本 (36) 中,当 Ajax 调用有一些延迟时,我们会遇到弹出警告... 延迟 2 秒足以让 Chrome 显示弹出警告而不是打开标签就像它应该的那样。代码本身正在工作,我可以多次单击该按钮,它一直工作,直到请求遇到一些滞后。然后我收到弹出警告...
问题
是否对同步 Ajax 请求应用了超时,在此期间它需要完成才能使可信事件仍然可用?
有什么办法可以避免吗?毕竟,调用已经是同步的,并且在结果到达之前冻结其他所有内容。
谢谢。
更新 JSFiddle
更新:我创建了一个 JSFiddle 来演示这个问题:http://jsfiddle.net/23JNw/9/
/**
* This method will give open the popup without a warning.
*/
function performSlowSyncronousRequest() {
$.ajax({
url: '/echo/html',
data: {delay: 2}, //JSfiddle will delay the answer by 2 seconds
success: function(){
window.open('http://www.thirtykingdoms.com'); //this causes the popup warning in Chrome
},
async: false
});
}
【问题讨论】:
-
运气好能解决这个问题吗?我遇到了同样的问题,并确定超时为 1000 毫秒。以上所有内容都会导致 Chrome 被阻止。
-
同步请求会阻止 JS 执行,因此您看到的警告可能是您的脚本没有响应。如果请求等待响应太久,你会看到这个警告。尝试执行异步请求并在成功回调上启用按钮以打开选项卡。
-
@Rubens:感谢您的评论,但是:不。正如我在问题中所描述的那样,警告是一个明确的弹出警告。此外,禁用和启用按钮需要用户单击两次才能打开弹出窗口,这当然很容易,但不是我们想要的。我们想做一个后台请求并打开一个带有单个可信事件的弹出窗口。
-
我现在低估了,谢谢你的小提琴。好吧,很难说,如果脚本等待太久才响应,Chrome 可能会将函数上下文变为不可信。我会尝试找到解决这个问题的方法:)
标签: javascript ajax google-chrome popup synchronous