<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 104,  comments - 34,  trackbacks - 0
    本文章為 Mozilla Developer Center 的 AJAX:Getting Started 的翻譯。這篇文章說明 AJAX 相關技術的基礎,并提供實例供您上手。

    AJAX 是啥?

    AJAX (Asynchronous JavaScript and XML, 異步 JavaScript 及 XML 技術) 是個新詞,但內涵是兩個存在已有一段時間的 JavaScript 功能。這兩種功能以往一直被忽略,在 Gmail、Google suggest 及 Google Maps 出現后才一舉成名天下知。

    這兩個 JavaScript 功能 是:

       * 在不重新讀取頁面的情況下對伺服器送出要求(request)
       * 解析、使用 XML 文件

    第一步 – 怎么發出 XMLHttpRequest

    為了用 JavaScript 對伺服器發送 HTTP 要求,你必須先以相關的類別(class)制出實體(instance)。Internet Explorer 首先以 ActiveX 物件方式提供 XMLHTTP 類別,而 Mozilla、Safari 及其他瀏覽器則隨后以 XMLHttpRequest 類別支援此 ActiveX 物件中的類別及屬性。

    因此,如果想跨瀏覽器,那么可以這么寫:

    Code:

    if (window.XMLHttpRequest) { // Mozilla, Safari, ...
        http_request = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // IE
        http_request = new ActiveXObject("Microsoft.XMLHTTP");
    }



    (由于這段程式僅供說明,所以是采最簡方式寫出。本文第三步中有另一種我們比較常用的寫法。)

    有些版本的 Mozilla 瀏覽器在伺服器送回的資料未含 XML mime-type 檔頭(header)時會出錯。為了避免這個問題,你可以用下列方法覆寫伺服器傳回的檔頭,以免傳回的不是 text/xml。

    Code:

    http_request = new XMLHttpRequest();
    http_request.overrideMimeType('text/xml');



    接下來是要決定伺服器傳回資料后的處理方式,此時你只要以 onreadystatechange 這個屬性指明要處理傳回值的 JavaScript 函式名稱即可,例如:

    http_request.onreadystatechange = nameOfTheFunction;

    注意,指定的函式名稱后不加括號也沒有參數。除了指定函式名稱外,你也能用 Javascript 即時定義函式的方法來定一個新的處理函式,如下:

    Code:

    http_request.onreadystatechange = function(){
        // do the thing
    };


    決定處理方式之后你得確實發出 request,此時需叫用 HTTP request 類別的 open() 及 send() 方法,如下:

    Code:

    http_request.open('GET', 'http://www.example.org/some.file', true);
    http_request.send(null);



       * open() 的第一個參數是 HTTP request 的方法,也就是從 GET、POST、HEAD 中擇一使用,亦可用你主機上支援的方式。為遵循 HTTP 標準,請記得這些方法都是大寫,不然有的瀏覽器(如 Firefox)或許不會理你。其它 HTTP request 可以支援的方法列表請參考 W3C 規格書 。
       * 第二個參數是目標 URL。基于安全考量,你不能叫用同網域以外的網頁。如果網域不同,則叫用 open() 時會出現「權限不足,拒絕存取」那類的錯誤。通常大伙會犯的錯誤多為在 domain.tld 網的網站下呼叫 www.domain.tld 中的網頁,僅是一點點差別都不行。
       * 第三個參數決定此 request 是否不同步進行,如果設定為 TRUE 則即使伺服器尚未傳回資料也會繼續執行其余的程式,這也就是 AJAX 中第一個 A 代表的意義。

    send() 的參數在以 POST 發出 request 時可以是任何想傳給伺服器的東西,而資料則以查詢字串的方式列出,例如:

    name=value&anothername=othervalue&so=on

    不過如果你想要以 POST 方式傳送資料,則必須先將 MIME 型態改好,如下:

    Code:

    http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');



    否則伺服器就不會理你傳過來的資料了。

    第二步 – 處理伺服器傳回的資料

    傳出 request 時必須提供處理傳回值的函式名稱。

    http_request.onreadystatechange = nameOfTheFunction;

    那么來看看這個函式該做些什么。首先,它必須檢查 request 目前的狀態:如果狀態值為 4 代表伺服器已經傳回所有資訊了,便可以開始解析所得資訊。

    Code:

    if (http_request.readyState == 4) {
        // everything is good, the response is received
    } else {
        // still not ready
    }



    readyState 所有可能的值如下:

       * 0 (還沒開始)
       * 1 (讀取中)
       * 2 (已讀取)
       * 3 (資訊交換中)
       * 4 (一切完成)

    接下來要檢查伺服器傳回的 HTTP 狀態碼。所有狀態碼列表可于 W3C 網站上查到,但我們要管的是 200 OK 這種狀態。

    Code:

    if (http_request.status == 200) {
        // perfect!
    } else {
        // there was a problem with the request,
        // for example the response may be a 404 (Not Found)
        // or 500 (Internal Server Error) response codes
    }



    檢查傳回的 HTTP 狀態碼后,要怎么處理傳回的資料就由你決定了。有兩種存取資料的方式:

       * http_request.responseText – 這樣會把傳回值當字串用
       * http_request.responseXML – 這樣會把傳回值視為 XMLDocument 對象,而后可用 JavaScript DOM 相關函式處理

    第三步 - 萬事俱備 - 簡單范例

    好,接著就做一次簡單的 HTTP 范例,演示方才的各項技巧。這段 JavaScript 會向伺服器要一份里頭有「I'm a test.」字樣的 HTML 文件(test.html),而后以 alert() 將文件內容列出。

    Code:

    <script type="text/javascript" language="javascript">
        function makeRequest(url) {

            var http_request = false;

            if (window.XMLHttpRequest) { // Mozilla, Safari,...
                http_request = new XMLHttpRequest();
                if (http_request.overrideMimeType) {
                    http_request.overrideMimeType('text/xml');
                    // See note below about this line
                }
            } else if (window.ActiveXObject) { // IE
                try {
                    http_request = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e) {
                    try {
                        http_request = new ActiveXObject("Microsoft.XMLHTTP");
                    } catch (e) {}
                }
            }

            if (!http_request) {
                alert('Giving up :( Cannot create an XMLHTTP instance');
                return false;
            }
            http_request.onreadystatechange = function() { alertContents(http_request); };
            http_request.open('GET', url, true);
            http_request.send(null);

        }

        function alertContents(http_request) {

            if (http_request.readyState == 4) {
                if (http_request.status == 200) {
                    alert(http_request.responseText);
                } else {
                    alert('There was a problem with the request.');
                }
            }

        }
    </script>
    <span
        style="cursor: pointer; text-decoration: underline"
        onclick="makeRequest('test.html')">
            Make a request
    </span>



    在此范例中:

       * 首先使用者按下「Make a request」
       * 這么一來就會呼叫 makeRequest() 函式,亦傳入參數值 test.html (也就是那份 HTML 檔的名稱,放在同目錄下)
       * 接著發出 request,而后會將主導權交給 onreadystatechange 指定的 alertContents() 函式
       * alertContents() 檢查回應是否正常,而后以 alert() 將 test.html 的內容列出

    你可以由此測試本例 ,也可以參考測試檔案 。

    第四步 – 處理 XML 回應值

    前面的例子中,在收到 HTTP 傳回值后我們以物件的 reponseText 屬性使用 test.html 檔案的內容,接著來試試 responseXML 屬性的方法。

    首先,我們得做個格式正確的 XML 文件,以便稍后取用。此檔名喚 test.xml,內容如下:

    Code:

    <?xml version="1.0" ?>
    <root>
        I'm a test.
    </root>



    在程式中,我們叫用檔案的地方只須略事修改如下:

    Code:

    ...
    onclick="makeRequest('test.xml')">
    ...



    接著在 alertContents() 中,我們必須將 alert(http_request.responseText); 改成這樣:

    Code:

    var xmldoc = http_request.responseXML;
    var root_node = xmldoc.getElementsByTagName('root').item(0);
    alert(root_node.firstChild.data);



    這樣一來我們便可取得 responseXML 所傳回的 XMLDocument 對象,而后以 DOM 相關的方法取用 XML 文件內容。你可以參考 test.xml 的原始碼 以及修改過后的測試程式

    其他與 DOM 相關的方法,請參考 Mozilla's DOM implementation 文件。
    posted on 2007-11-22 23:13 末日風情 閱讀(397) 評論(0)  編輯  收藏 所屬分類: AJAX

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2007年11月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 91在线老王精品免费播放| 亚洲精品视频免费| 日韩毛片免费无码无毒视频观看| 亚洲av午夜福利精品一区人妖| 国产在线播放线91免费| 亚洲精品高清无码视频| 国偷自产一区二区免费视频| 情人伊人久久综合亚洲| 中文字幕在线免费观看| 亚洲va精品中文字幕| 精品熟女少妇AV免费观看| 亚洲人成网站免费播放| 性做久久久久免费观看| 精品亚洲成a人在线观看| 亚洲成A人片77777国产| 青青操视频在线免费观看| 亚洲AV日韩AV永久无码久久| 69av免费观看| 成人婷婷网色偷偷亚洲男人的天堂 | 日韩精品一区二区亚洲AV观看| 91制片厂制作传媒免费版樱花| 亚洲国产日韩在线人成下载| 最近最新MV在线观看免费高清| 亚洲人成电影网站色| 亚洲爽爽一区二区三区| 久久午夜免费鲁丝片| 中文字幕亚洲码在线| 亚洲乱亚洲乱少妇无码| 久久国产精品萌白酱免费| 亚洲乱码在线观看| 亚洲片国产一区一级在线观看 | 久久亚洲熟女cc98cm| 在线jlzzjlzz免费播放| 成在线人视频免费视频| 亚洲欧洲春色校园另类小说| 四虎影视永久免费观看网址| 18禁超污无遮挡无码免费网站 | 国产AV旡码专区亚洲AV苍井空| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 日本阿v免费费视频完整版| 18禁免费无码无遮挡不卡网站|