js DOM编程艺术关于ajax不太理解的地方

<!DOCTYPE html>
<html>
<head>
    <title>Ajax</title>
</head>
<body>
    <div id = "new"></div>

    <script type="text/javascript" src = "scripts/addLoadEvent.js"></script>
    <script type="text/javascript" src = "scripts/getHTTPObject.js"></script>
    <script type="text/javascript" src = "scripts/getNewContent.js"></script>
</body>
</html>
function addLoadEvent(func){                 
    if( typeof window.onload != "function"){
        window.onload = func;
    }else{
        window.onload = function(){
            oldload();
            func();
        }
    }
}

function getHTTPObject(){
    if(typeof XMLHttpRequest == "undefined"){
        XMLHttpRequest = function(){
            try { return new ActiveXObject("Msxml2.XMLHTTP.6.0");}
                catch(e){}
            try { return new ActiveXObject("Msxml2.XMLHTTP.3.0");}
                catch(e){}
            try { return new ActiveXObject("Msxml2.XMLHTTP");}
                catch(e){}
            return false;
        }
    }
    return new XMLHttpRequest();

}

function getNewContent(){
    var request = getHTTPObject();
    if(request) {
        request.open("GET", "example.txt", true);
        request.onreadystatechange = function(){
            if(request.readyState == 4) {
                var para = document.createElement("p");
                var txt = document.createTextNode(request.responseText);
                para.appendChild(txt);
                document.getElementById('new').appendChild(para);
            }
        };
        request.send(null);
    }else{
        alert("Sorry , your browser doesn\'t support XMLHttpRequest");
    }
}
addLoadEvent(getNewContent);

这是书上关于ajax的一个例子,用ctrl+o在chrome浏览器成功运行,关于最后一个getNewContent函数,我想问request.send(null)为什么写在后面???

阅读 2.9k
3 个回答

触发onreadyState的过程是异步的,所以同步的执行request.send(),放在前后关系不大

onreadystatechange 设置的是一个回调函数, 函数设置时只是做了定义, 其实里面的代码并没有被执行.

函数的执行是浏览器的内部网络请求模块来负责调用执行的.

至于 request.send(null) 放在最后执行, 可以这么理解就是: 先做好准备工作, 再开始工作. 虽然大部分情况下, 先执行 send() 再设置 onreadystatechange 效果是一样的, 但是不排除有一些特殊的浏览器内核处理上有一些特殊, 在 send() 返回前, 会先触发一些初始化事件回调函数, 这样就会丢失某一些回调了.

先设置好所有情况的回调函数, 应对处理所有的事件情况, 再开始执行, 这是一个更正确的做法.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题