Javascript readyState=4,在行中显示三次。Ajax-由警报引起

Javascript readyState=4,在行中显示三次。Ajax-由警报引起,javascript,ajax,stack,Javascript,Ajax,Stack,我有一个奇怪的情况 尝试双击“疯狂”。您会注意到,onreadystatechange被调用了3次。所有这些时间都使用readyState=4。对我来说,这太疯狂了 但令人兴奋的是,当我从双击事件侦听器函数中删除警报(已添加)时,一切都正常 有人能向我解释发生了什么事吗?这对我来说很奇怪。提前谢谢。:) 之所以发生这种情况,是因为您的XMLHttpRequest设置为异步执行,并且警报('added')在XMLHttpRequest开始调用onreadystatechange之前停止JavaSc

我有一个奇怪的情况

尝试双击“疯狂”。您会注意到,
onreadystatechange
被调用了3次。所有这些时间都使用
readyState=4
。对我来说,这太疯狂了

但令人兴奋的是,当我从双击事件侦听器函数中删除
警报(已添加)
时,一切都正常


有人能向我解释发生了什么事吗?这对我来说很奇怪。提前谢谢。:)

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

因此,由于XMLHttpRequest已经完成,
.readyState
.status
已经分别等于
4
200
。因此,每次调用
.onreadystatechange
时,您的
if
语句都会计算为true

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

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


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

因此,由于XMLHttpRequest已经完成,
.readyState
.status
已经分别等于
4
200
。因此,每次调用
.onreadystatechange
时,您的
if
语句都会计算为true

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

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


最简单的方法是在检查readyState后编写警报
像这样
函数myCallback(){
如果(g_xmlHttpRequest.readyState!=4)
返回;
警报(“myCallback”);
//添加一些代码

}

最简单的方法是在检查readyState后编写警报
像这样
函数myCallback(){
如果(g_xmlHttpRequest.readyState!=4)
返回;
警报(“myCallback”);
//添加一些代码

}

如果您使用console.log代替alerts,效果很好。我可以建议您使用js库,如jQuery或Dojo来帮助您吗?它消除了许多这样的问题,还将为IE@wirey这是因为
console.log
不会暂停JavaScript执行线程。@Justanotherdunce(1)不,不会,(2)如果他不需要IE6支持怎么办?(3) 您不需要一个功能完备的库。@Zirak他们提供了一种创建ajax调用和dom操作的清晰方法。如果您使用console.log代替Alerts,效果很好。我可以建议使用js库(如jQuery或Dojo)来帮助您吗?它消除了许多这样的问题,还将为IE@wirey这是因为
console.log
不会暂停JavaScript执行线程。@Justanotherdunce(1)不,不会,(2)如果他不需要IE6支持怎么办?(3) 您不需要一个功能完备的库。@Zirak它们提供了一个创建ajax调用和dom操作的清晰方法。