1

我有一个奇怪的情况。

尝试在这个小提琴上双击“Insane” 。你会注意到它onreadystatechange被调用了 3 次。所有这些时间与readyState = 4。对我来说,这太疯狂了。

但最重要的是,当我alert(added)从双击事件侦听器函数中删除时,如this fiddle所示,一切正常。

有人可以向我解释发生了什么吗?这对我来说很奇怪。在此先感谢。:)

4

2 回答 2

5

发生这种情况是因为您的 XMLHttpRequest 设置为异步执行,并且alert('added')在 XMLHttpRequest 开始调用之前暂停了 JavaScript 执行线程onreadystatechange。当您关闭警报时,XMLHttpRequest 已经完成,并且四个调用onreadystatechange位于堆栈中,等待执行。

因此,因为您的 XMLHttpRequest 已经完成,.readyState并且.status已经分别等于4200。因此,每次.onreadystatechange通话时,您的if陈述都会评估为真。

如果您将 XMLHttpRequest 更改为同步执行(或者如果您alert('added')在调用 AJAX 之前放置),那么您将获得预期的警报数量:

http://jsfiddle.net/B9a5G/6/

有关 JavaScript 事件、计时和单线程处理的更多信息:

http://javascript.info/tutorial/events-and-timing-depth

于 2012-08-20T21:26:41.717 回答
0

最简单的方法是在检查 readyState 后编写警报,
如下所示
function myCallback() {
if (g_xmlHttpRequest.readyState != 4)
return;
警报(“我的回调”);
// 添加一些代码
}

于 2012-12-05T23:21:46.290 回答