这个问题可能看起来有点奇怪,当网页通过网络测试时会出现问题。
该页面使用AJAX调用(async设置为true)来收集一些数据。由于某种原因,它不会在AJAX调用返回之前交换页面 - 请考虑以下代码:
console.log("firing ajax call");
$.ajax({
type: "POST",
url: "requestedService",
data: mode : "requestedMethod",
cache: false,
dataType: "json",
success: function() { console.log("ajax response received") },
error: null,
complete: null,
});
console.log("changing window location");
window.location = "http://www.google.com"
位置仅在AJAX返回响应后更改。我已经测试了这个调用,它实际上是异步的,页面没有被阻止。即使AJAX调用尚未完成,它也应该只加载新页面,但不是。我可以看到页面正在尝试加载,但只有在我得到响应后才会发生。有什么想法吗?
控制台输出是:
firing ajax call
changing window location
ajax response received
答案 0 :(得分:2)
这对我来说似乎很好。在异步处理程序中的代码执行之前更改位置。也许你应该发布一些真正的代码而不是简化版本,以便我们可以提供更好的帮助。
这是一个按预期工作的演示:http://jsfiddle.net/BSg9P/
$(document).ready(function() {
var result;
$("#btn").on('click', function(sender, args) {
setInterval(function() {
result = "some result";
console.log("Just returned a result");
}, 5000);
window.location = "http://www.google.com";
});
});
以下是结果的屏幕截图:http://screencast.com/t/VbxMCxxyIbB
我已经单击了按钮2次,您可以在JS控制台中看到每次在结果之前打印有关位置更改的消息。 (错误与CORS有关,如果它是相同的域,它会导航)。
答案 1 :(得分:0)
有点晚,但也许其他人也会遇到同样的问题。 @ todd-menier的答案可能有帮助:https://stackoverflow.com/questions/941889#answer-970843
所以问题可能出在服务器端。例如,如果默认情况下使用的是PHP会话,则服务器正在处理ajax请求时,用户会话将被锁定,因此服务器将无法处理对新页面的下一个请求,直到ajax被处理为止。完成并释放了锁。如果您的Ajax处理代码不需要它,则可以提早释放该锁,以便下一个页面加载可以同时发生。