ajax入門之創建XHR對象

ajax入門之創建XHR對象

今天幫朋友寫了一個簡單的ajax的demo,發現了一些東西,決定寫一篇文章記錄一下,避免之後挖坑。javascript

建立XMLHttpRequest
一般
function createXHR(){
        if(XMLHttpRequest){
            return new XMLHttpRequest();
        }else{
            return new ActiveXObject('Microsoft.XMLHTTP')
        }
    }

這一段js代碼來源自w3school,用於建立兼容各瀏覽器的XMLHttpRequest對象的含義:php

檢測客戶端是否有XMLHttpRequest,不然使用ActiveXObject

關於XMLHttpRequest對象,IE5是第一個引入XHR對象的瀏覽器,在IE5中,XHR是經過activeX對象實現的.所以在IE中可能遇到三種不一樣版本的XHR對象,MXSML2.XMLHTTP,MXSML2.XMLHttp.3.0和MXSML2.XMLHttp.6.0。html

IE的坑

爲了向咱們偉大的IE瀏覽器「致敬」,咱們必須添加額外的代碼進行建立
如下代碼適用與IE7如下的狀況:java

function createXHR(){
    if(typeof argument.callee.activeXString != 'string'){
        var versions = ['MXSML2.XMLHTTP','MXSML2.XMLHttp.3.0','MXSML2.XMLHttp.6.0'];
        var i len;
        for(i = 0;len=versions.length;i<len;i++){
            try{
                new ActiveXObject(varsions[i]);
                argument.callee.activeXString = varsions[i];
            }catch{
                <!-- 跳過 -->
            }
        }
    }
    return new ActiveXObject(argument.callee.activeXString);
}
完整走一遍

但每每我不會考慮這麼多,能看懂前面的函數也是很不容易了,再讓我寫出來,個人天!當你們和我這麼懶的時候,能夠直接使用第一份代碼,也就是w3school那一套代碼,咱們使用原生的XHR對象進行建立。
固然,咱們這裏也給出完整的代碼。ajax

function createXHR(){
    if(typeof XMLHttpRequest != 'undefined'){
        return new XMLHttpRequest();
    }else if(typeof argument.callee.activeXString != 'string'){
        var versions = ['MXSML2.XMLHTTP','MXSML2.XMLHttp.3.0','MXSML2.XMLHttp.6.0'];
        var i len;
        for(i = 0;len=versions.length;i<len;i++){
            try{
                new ActiveXObject(varsions[i]);
                argument.callee.activeXString = varsions[i];
            }catch{
                <!-- 跳過 -->
            }
        }
        return new ActiveXObject(argument.callee.activeXString);
    }else{
        throw new Error("沒有XHR對象存在");
    }
}
用法
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>demo</title>
</head>
<body>
        <form>

        <button onclick="returnText();return false">登錄</button>
    </form>
    <script type="text/javascript">
        function returnText(){
            var xhr = createXHR();
            xhr.onreadystatechange = function(){
                if(xhr.readyState == 4){
                    if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
                        alert(xhr.responseText);
                    }else{
                        alert('獲取失敗'+xhr.status)
                    }
                }
            }
            xhr.open('get','demo.php',true);
            xhr.send(null);

        }
        function createXHR(){
            if(typeof XMLHttpRequest != 'undefined'){
                return new XMLHttpRequest();
            }else{
                return new ActiveXObject('Microsoft.XMLHTTP')
            }
        }
    </script>
</body>
</html>

建立好XHR對象只是第一步,纔是咱們各類操做的開始。瀏覽器

open()

open()函數會啓動一個請求,但並非發送,能夠看做辦事以前的準備。
它接受三個函數:異步

open(get/post,url,false/true)
  1. 請求類型:最經常使用的就是get和post函數

  2. 路徑:就是要請求的操做的文件的urlpost

  3. 是否異步url

咱們這是使用的是get方式,由於咱們並無要發送的數據。
異步咱們選擇了true,無心中發如今使用false時候,火狐出現了警告:

主線程中同步的 XMLHttpRequest 已不推薦使用,因其對終端用戶的用戶體驗存在負面影響。

具體須要再瞭解。

send()

天然而然,準備好了就要發送,send()只接受一個參數,那就是要發送的數據。咱們使用的是get,沒有數據,那就null好了。

php

由於這篇文章主要是講ajax,因此php部分我只用了最簡單的echo

<?php
    echo '成功了';
 ?>

這樣就能在接受到請求後返回一個字符串。

回調函數

咱們怎麼樣才能直到php文件將數據處理完,返回給客戶端了呢?
這時候咱們就須要監測XHR的readyState屬性。先介紹如下readyState屬性:

  1. 0:初始化未完成,未調用open()

  2. 1: 啓動調永了open()函數,可是尚未send

  3. 2:發送,調永了send()函數,尚未接收到響應

  4. 3:開始接收,接收到部分的數據

  5. 4:完成,接收到了所有數據。

因此在上面的函數中咱們能夠看到,咱們去監測readyState屬性,等到等於4的時候,也就是數據接收完成以後,咱們開始對數據進行處理。

小結

這是一個手動建立XHR對象並使用最簡單的方法。之後回繼續進行更新。介紹其更詳細的用法。

相關文章
相關標籤/搜索