先看代码:
function test1()
{
if (xmlHttpRequest == null)
{
xmlHttpRequest = CreateXmlHttpRequest();
}
var url = “test.ashx”;
同步请求
xmlHttpRequest.open("GET", url, false);
xmlHttpRequest.onreadystatechange = suc;
xmlHttpRequest.send(null);
alert(1);
}
function suc()
{f (xmlHttpRequest.readyState == 4)
{
if (xmlHttpRequest.status == 200)
{
alert(2);
}
}
}
上面的代码在ie中会先后弹出2,1,但是在火狐中只会弹出2.
原因是在火狐中,如果ajax基于同步请求,那么代码是顺序执行的,同时不会触发onreadystatechange事件。
当执行xmlHttpRequest.send(null);这一句时,不会立即执行alert(1);直至xmlHttpRequest有返回结果。
在ie中也是顺序执行的,但是当执行xmlHttpRequest.send(null);这一句时,会不断的触发onreadystatechange直到执行alert(2);才执行alert(1);
如果把上面的代码改成:
function test1()
{
if (xmlHttpRequest == null)
{
xmlHttpRequest = CreateXmlHttpRequest();
}
var url = “test.ashx”;
异步步请求
xmlHttpRequest.open("GET", url, true);
xmlHttpRequest.onreadystatechange = suc;
xmlHttpRequest.send(null);
alert(1);
}
function suc()
{f (xmlHttpRequest.readyState == 4)
{
if (xmlHttpRequest.status == 200)
{
alert(2);
}
}
}
此时在ie或者火狐中,会返回相同的结果。所以在jquery中存在
if ( !s.async ) {
onreadystatechange();
}
这样一行。