先看代码:

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();
        }

这样一行。

 

posted on 2010-10-22 13:35  lorgine  阅读(2119)  评论(1编辑  收藏  举报