Ajax與DOM實現動態加載

首先說下問題背景:想要經過異步請求一個文本文件,而後經過該文件的內容動態建立一個DOM節點添加到網頁中。javascript

基於這個須要瞭解:html

  1 DOM如何動態添加節點java

  2 Ajax異步請求chrome

  3 Chrome瀏覽器如何處理本地請求編程

  DOM如何動態添加節點

  想要動態的添加節點,就須要良好的理解DOM文檔。瀏覽器

  經常使用的幾個方法:app

  getElementById()  getElementsByTagName() getAttribute() setAttribute()異步

  以及ide

  createElement() createTextNode() appendChild()ui

  等等。

  下面看一下建立一個DOM節點的方法過程,首先須要有一個掛載的div,這個div須要設置上一個id,這樣方便經過getElementById來獲取。

        <div id="test"></div>

        <script type="text/javascript">
             var para = document.createElement("p");//建立一個p標籤節點
             var txt  = document.createTextNode("文本內容");//建立一個文本節點,指定相關的內容
             para.appendChild(txt);//把文本節點添加到p標籤節點
             document.getElementById("test").appendChild(para);//把p標籤節點,添加到div中
        </script>

  這樣就完成了動態的建立節點。

  Ajax異步請求

  首先針對不一樣的瀏覽器,建立XMLHttpRequest對象,能夠採起下面的方法:

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

  這樣就能夠返回瀏覽器支持的request對象了。而後建立對應的request的open send onreadystatechange方法。

  這裏直接放在一個方法中:

            function getNewContent(){
                var request = getHTTPObject();
                if(request){
                    request.open("GET","test.txt",true);
                    request.onreadystatechange = function(){
                        if(request.readyState == 4){
                            //核心代碼
                        }
                    };
                    request.send(null);
                }else{
                    console.log("Browser does not support XMLHttpRequest");
                }
                console.log("Function Done!");
            }

  而後等待出發getNewContent就能夠了。

  所有代碼:

<!doctype html>
<html>
    <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         <title>Ajax test</title>
    </head>
    <body>
        <div id="test"></div>

        <script type="text/javascript">
            function getHTTPObject(){
                if(typeof XMLHttpRequest == "undefined"){
                    XMLHttpRequest = function(){
                        try{
                            return new ActiveXObject("Microsoft.XMLHTTP");
                        }catch(e){}
                        return false;
                    }
                }
                return new XMLHttpRequest();
            }

            function getNewContent(){
                var request = getHTTPObject();
                if(request){
                    request.open("GET","test.txt",true);
                    request.onreadystatechange = function(){
                        if(request.readyState == 4){
                            console.log("Response Received!");
                            var para = document.createElement("p");
                            var txt  = document.createTextNode(request.responseText);
                            para.appendChild(txt);
                            document.getElementById("test").appendChild(para);
                        }
                    };
                    request.send(null);
                }else{
                    console.log("Browser does not support XMLHttpRequest");
                }
                console.log("Function Done!");
            }

            function addLoadEvent(func){
                var oldonload = window.onload;
                if(typeof window.onload != 'function'){
                    window.onload = func;
                }else{
                    window.onload = function(){
                        oldonload();
                        func();
                    }
                }
            }

            addLoadEvent(getNewContent);
        </script>
    </body>
</html>
View Code

  執行結果:

  Chrome處理本地Ajax異步請求

  因爲Chrome不支持本地的異步請求,所以直接經過file://訪問文件就會報錯!

  報錯信息以下:

  XMLHttpRequest cannot load file:///C:/Users/Administrator/Desktop/test.txt. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resource.

  Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'file:///C:/Users/Administrator/Desktop/test.txt'.

 

  因此在Chrome的快捷方式後面添加:--allow-file-access-from-files 便可。注意後面要添加一個空格,否則會提示錯誤!

  正確的寫法:

  "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files

  這樣就能夠正確訪問了。

  參考:

  【1】《Javascript DOM編程藝術》

  【2】如何解決XMLHttpRequest cannot load...:http://blog.csdn.net/dandanzmc/article/details/31344267/

相關文章
相關標籤/搜索