我正在使用以下JS代码来调用Web处理程序。 这段代码完美地调用处理程序,而不是FF。
$.ajax({ type: "GET",
url: "../MasterPages/AHMHandler.ashx?T=1",
dataType: "HTML",
success: function (msg) {
document.getElementsByName('cartId')[0].value = msg;
}
,
error: function (e) {
return false;
}
});
Sleep(2000);
我的代码有什么问题?
答案 0 :(得分:1)
在您的代码中看到了Sleep()
调用,以及您对alert()
的评论,我会说您的问题是缺乏对Ajax代码工作方式的理解。
当你进行Ajax调用时,它被称为异步。这意味着进行了调用,然后当前函数的其余部分继续运行而不停止等待ajax代码运行。
最终将调用ajax success
函数,但仅在http请求完成时才会调用。 同时,您当前的功能将继续运行。
这里的要点是,如果你在ajax调用之后运行的代码中有代码,则不能依赖给定的事件序列。
放置Sleep()
可能会使其看起来有效,因为某些浏览器可能会将休眠时间视为运行ajax成功函数的机会,因此您的代码似乎以正确的顺序运行。放置alert()
将更有可能使其工作,因为alert()
通常会在清除之前花费更多时间,因此ajax函数有更多机会运行。
但是你不应该依赖它们中的任何一个来使你的执行顺序正确。
你应该做的是把你想在ajax调用之后运行的代码放在success
函数中。这是确保在ajax调用完成后运行它的唯一方法。
希望有所帮助。
[编辑] OP评论后进一步澄清:
Spudley,Sleep Function是我自己的功能,可以防止浏览器重定向2秒钟。 function Sleep(毫秒){var start = new Date()。getTime(); for(var i = 0; i< 1e7; i ++){if((new date()。getTime() - start)> milliseconds){break; }}
仅仅是为了参考,像这样的睡眠功能在Javascript中是一个非常可怕的想法。你应该使用setTimeout()来做这种事情。
但是,重点仍然是相同的 - 您的代码在$.ajax()
之后运行,它将阻止执行您的ajax成功函数。如果你之后正在进行重定向,那么成功函数可能永远不会有机会运行。
alert()
确实会使它工作,因为success
函数会在调用Sleep
之前清除警报时找到要运行的插槽,但您不应该依赖它在那。
答案保持不变:您应该在success
函数内放置ajax调用之后要运行的代码。
以下是您所做更改的代码:
$.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.