我有一个奇怪的情况。
尝试在这个小提琴上双击“Insane” 。你会注意到它onreadystatechange
被调用了 3 次。所有这些时间与readyState = 4
。对我来说,这太疯狂了。
但最重要的是,当我alert(added)
从双击事件侦听器函数中删除时,如this fiddle所示,一切正常。
有人可以向我解释发生了什么吗?这对我来说很奇怪。在此先感谢。:)
我有一个奇怪的情况。
尝试在这个小提琴上双击“Insane” 。你会注意到它onreadystatechange
被调用了 3 次。所有这些时间与readyState = 4
。对我来说,这太疯狂了。
但最重要的是,当我alert(added)
从双击事件侦听器函数中删除时,如this fiddle所示,一切正常。
有人可以向我解释发生了什么吗?这对我来说很奇怪。在此先感谢。:)
发生这种情况是因为您的 XMLHttpRequest 设置为异步执行,并且您alert('added')
在 XMLHttpRequest 开始调用之前暂停了 JavaScript 执行线程onreadystatechange
。当您关闭警报时,XMLHttpRequest 已经完成,并且四个调用onreadystatechange
位于堆栈中,等待执行。
因此,因为您的 XMLHttpRequest 已经完成,.readyState
并且.status
已经分别等于4
和200
。因此,每次.onreadystatechange
通话时,您的if
陈述都会评估为真。
如果您将 XMLHttpRequest 更改为同步执行(或者如果您alert('added')
在调用 AJAX 之前放置),那么您将获得预期的警报数量:
有关 JavaScript 事件、计时和单线程处理的更多信息:
最简单的方法是在检查 readyState 后编写警报,
如下所示
function myCallback() {
if (g_xmlHttpRequest.readyState != 4)
return;
警报(“我的回调”);
// 添加一些代码
}