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

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

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

    posts - 54,  comments - 1,  trackbacks - 0

    (原文)

    From MoztwWiki

    本文章為 Mozilla Developer Center 的 AJAX:Getting Started (http://developer.mozilla.org/en/docs/AJAX:Getting_Started) 的翻譯。原文的作者與編修歷史可在它的歷史頁 (http://developer.mozilla.org/en/docs/index.php?title=AJAX:Getting_Started&action=history)上看到。

    這篇文章說明 AJAX 相關技術的基礎,並提供實例供您上手。

    AJAX 是啥?

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

    這兩個 JavaScript 功能 是:

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

    第一步 – 說聲「請」 (又稱為「怎麼發(fā)出 XMLHttpRequest」)

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

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

    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

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

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

    http_request.onreadystatechange = nameOfTheFunction; 

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

    http_request.onreadystatechange = function(){
        
    // 做些事

    }
    ;

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

    http_request.open('GET', 'http://www.example.org/some.file', true);
    http_request.send(null);
    • open() 的第一個參數(shù)是 HTTP request 的方法,也就是從 GET、POST、HEAD 中擇一使用,亦可用你主機上支援的方式。為遵循 HTTP 標準,請記得這些方法都是大寫,不然有的瀏覽器(如 Firefox)或許不會理你。其他 HTTP request 可以支援的方法列表請參考 W3C 規(guī)格書 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)
    • 第二個參數(shù)是目標 URL。基於安全考量,你不能叫用同網(wǎng)域以外的網(wǎng)頁。如果網(wǎng)域不同,則叫用 open() 時會出現(xiàn)「權限不足,拒絕存取」那類的錯誤。通常大夥會犯的錯誤多為在 domain.tld 網(wǎng)的網(wǎng)站下呼叫 www.domain.tld 中的網(wǎng)頁,僅是一點點差別都不行。
    • 第三個參數(shù)決定此 request 是否不同步進行,如果設定為 TRUE 則即使伺服器尚未傳回資料也會繼續(xù)執(zhí)行其餘的程式,這也就是 AJAX 中第一個 A 代表的意義。

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

    name=value&anothername=othervalue&so=on 

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

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

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

    第二步 – 「就上咩!」(又稱為「處理伺服器傳回的資料」)

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

    http_request.onreadystatechange = nameOfTheFunction; 

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

    if (http_request.readyState == 4{
        
    // 一切 ok, 繼續(xù)解析

    }
     else {
        
    // 還沒完成

    }

    readyState 所有可能的值如下:

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

    (資料來源: MSDN (http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_1.asp))

    接下來要檢查伺服器傳回的 HTTP 狀態(tài)碼。所有狀態(tài)碼列表可於 W3C 網(wǎng)站 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)上查到,但我們要管的是 200 OK 這種狀態(tài)。

    if (http_request.status == 200{
        
    // 萬事具備

    }
     else {
        
    // 似乎有點問題,或許伺服器傳回了 404 (查無此頁) 或者 500 (內部錯誤) 什麼的

    }

    檢查傳回的 HTTP 狀態(tài)碼後,要怎麼處理傳回的資料就由你決定了。有兩種存取資料的方式:

    • http_request.responseText – 這樣會把傳回值當字串用
    • http_request.responseXML – 這樣會把傳回值視為 XMLDocument 物件,而後可用 JavaScript DOM 相關函式處理

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

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

    <script type="text/javascript" language="javascript">

        
    var http_request = false;

        
    function makeRequest(url) 
    {

            http_request 
    = false
    ;

            
    if (window.XMLHttpRequest) 
    // Mozilla, Safari,
                http_request = new XMLHttpRequest();
                
    if (http_request.overrideMimeType) 
    {
                    http_request.overrideMimeType('text
    /
    xml');
                }

            }
     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 
    = alertContents;
            http_request.open('GET', url, 
    true
    );
            http_request.send(
    null
    );

        }


        
    function alertContents() {

            
    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() 函式,亦傳入?yún)?shù)值 test.html (也就是那份 HTML 檔的名稱,放在同目錄下)
    • 接著發(fā)出 request,而後會將主導權交給 onreadystatechange 指定的 alertContents() 函式
    • alertContents() 檢查回應是否正常,而後以 alert()test.html 的內容列出

    你可以由此測試本例 (http://www.w3clubs.com/mozdev/httprequest_test.html),也可以參考測試檔案 (http://www.w3clubs.com/mozdev/test.html)

    第四步 – 「X 檔案」(又稱為「處理 XML 回應值」)

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

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

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

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


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

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

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

    這樣一來我們便可取得 responseXML 所傳回的 XMLDocument 物件,而後以 DOM 相關的方法取用 XML 文件內容。你可以參考 test.xml 的原始碼 (http://www.w3clubs.com/mozdev/test.xml) 以及修改過後的測試程式 (http://www.w3clubs.com/mozdev/httprequest_test_xml.html)

    其他與 DOM 相關的方法,請參考 Mozilla DOM (http://www.mozilla.org/docs/dom/) 文件。


    posted on 2005-11-22 19:02 ZhuJun 閱讀(554) 評論(0)  編輯  收藏 所屬分類: 他山の玉

    蜀中人氏,躬耕于珠海

    <2005年11月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    常用鏈接

    留言簿(2)

    隨筆分類(71)

    隨筆檔案(54)

    博客

    文檔

    站點

    論壇

    搜索

    •  

    積分與排名

    • 積分 - 50725
    • 排名 - 980

    最新評論

    閱讀排行榜

    主站蜘蛛池模板: 哒哒哒免费视频观看在线www| 亚洲中文字幕无码不卡电影| 美女被艹免费视频| 最新亚洲春色Av无码专区 | 日本中文一区二区三区亚洲| 91在线亚洲精品专区| 好男人视频社区精品免费| 国产精品成人69XXX免费视频| 91亚洲国产在人线播放午夜| 国产色婷婷精品免费视频| 无码国产精品一区二区免费16| 在线亚洲v日韩v| 亚洲国产精品丝袜在线观看| 一级做a爰全过程免费视频毛片| 亚洲一区二区电影| 精品国产污污免费网站aⅴ| 免费高清A级毛片在线播放| 亚洲精品无码99在线观看| 无码av免费毛片一区二区| 91精品成人免费国产| 亚洲国产美女精品久久久| 久久久久久亚洲精品| 久久成人国产精品免费软件| 一级毛片免费在线| 亚洲日本成本人观看| 激情内射亚洲一区二区三区| 亚洲AV无码乱码在线观看牲色| 一色屋成人免费精品网站| 免费看一区二区三区四区| 亚洲国产日韩女人aaaaaa毛片在线| 亚洲欧洲久久av| 日本二区免费一片黄2019| 日韩在线一区二区三区免费视频| 亚洲av乱码一区二区三区香蕉 | 日韩av无码成人无码免费| 国产三级在线免费| 国产精品成人免费观看| 美美女高清毛片视频黄的一免费 | 国产亚洲福利在线视频| 久久国产亚洲精品无码| 国产成人麻豆亚洲综合无码精品|