看到Sleep()
您的代码中的调用以及您对 的评论alert()
后,我想说您的问题在于对 Ajax 代码的工作原理缺乏了解。
当您进行 Ajax 调用时,它被异步调用。这意味着进行了调用,然后当前函数的其余部分继续运行,而不会停止等待 ajax 代码运行。
ajaxsuccess
函数最终会被调用,但只有在 http 请求完成时才会调用。同时,您当前的功能将继续运行。
这里的要点是,如果在进行 ajax 调用之后运行的同一函数中有代码,则不能依赖给定的事件序列。
放在Sleep()
那里可能会使它看起来工作,因为某些浏览器可能会将睡眠时间视为运行 ajax 成功功能的机会,因此您的代码似乎以正确的顺序运行。放在alert()
那里将更有可能使其工作,因为alert()
通常需要更多时间才能将其清除,因此 ajax 函数有更多机会运行。
但是你不应该依赖它们中的任何一个来获得正确的执行顺序。
您应该做的是将要在 ajax 调用之后运行的代码放入success
函数中。这是确保它在 ajax 调用完成后运行的唯一方法。
希望有帮助。
[编辑] OP评论后的进一步澄清:
Spudley,睡眠功能是我自己的功能,可以防止浏览器在 2 秒内被重定向。函数睡眠(毫秒){ var start = new Date().getTime(); for (var i = 0; i < 1e7; i++) { if ((new Date().getTime() - start) > 毫秒) { break; } } }
只是为了参考,像这样的睡眠功能在 Javascript 中是一个非常糟糕的想法。你应该使用 setTimeout() 来处理这种事情。
但是,要点仍然相同——您有在 之后运行的代码,$.ajax()
它将阻止您的 ajax 成功函数的执行。如果您之后立即进行重定向,那么成功函数可能永远没有机会运行。
Analert()
确实会使其工作,因为该success
函数会在清除警报时找到一个插槽来运行, beforeSleep
被调用,但你不应该依赖它。
答案保持不变:您应该将要在 ajax 调用之后运行的代码放在success
函数中。
这是您所做更改的代码:
$.ajax({ type: "GET",
url: "../MasterPages/AHMHandler.ashx?T=1",
dataType: "HTML",
success: function (msg) {
document.getElementsByName('cartId')[0].value = msg;
setTimeout(function() { //this instead of your Sleep function
//this is where you need to do your redirect, or whatever else you're doing after the ajax completes.
}, 2000);
}
,
error: function (e) {
return false;
}
});
//don't put **any** code here after the ajax call! put it in the success function.