jquery ajax 原理實現一個簡單ajax執行個體

來源:互聯網
上載者:User

對於Ajax來說,JQuery是一個不可多得的好JS庫,但是很多朋友並不瞭解Jquery對Ajax的實現過程,或者說不太瞭解,這點CG在此是不提倡的,CG寫下面代碼一方面是為瞭解決一位網友的疑問,同時也希望那些如果想在Jquery技術上有深入提高的朋友能夠多看看Jquery原始碼。


下面是簡單實現的一個Ajax支援類,有不明白的話可以發起提問和留言。

 代碼如下 複製代碼

 /**
 * 名稱:Ajax支援javascript類
 * 功能:用於對頁面實現Ajax支援,簡單封裝Ajax請求
 * 建立時間:2010-01-14
 * 作者:CG
 */
//以下為通用函數或對象
//是否是IE
var isIE = (document.all) ? true : false;
 
//$ id選取器
var $ = function(id) {
    return "string" == typeof id ? document.getElementById(id) : id;
};
//Class  類對象
var Class = {
    create: function() {
        return function() { this.initialize.apply(this, arguments); }
    }
};
//事件函數綁定
var Bind = function(object, fun) {
    return function() {
        return fun.apply(object, arguments);
    }
};
 
//全域Ajax對象
//用於AjaxSupport對象調用
var $ajax = function(obj){
    //錯誤資訊
    if(undefined == obj.error){
        obj.error = ajaxError;
    }
    //建立新的對象,此處可以使用單例來實現,減少資源消耗
    new AjaxSupport(obj);
};
 
//通用Ajax錯誤顯示
function ajaxError(msg){
    alert(msg);
}
 
var AjaxSupport = Class.create();
AjaxSupport.prototype ={
    /**初始化方法
     * 參數: obj 調用對象
     */
    initialize: function(obj){
        this._xmlHttp = null;
        //URL對象
        this._url = obj.url;
        //要求方法對象
        this._method = obj.method;
        //請求方式
        this._asyn= obj.asyn;
        //請求資料
        this._data= obj.data;
        //請求成功
        this._success = obj.success;
        //錯誤
        this._error = obj.error;
        //初始化HttpRequest
        this._initHttpRequest();
        //開始請求
        this._ajaxRequest();
    },
    //請求狀態變化
    _readyStateChange: function() {
        //只判斷是4的情況,其他情需要另行設定
        if(4 == this._xmlHttp.readyState){
            //請求成功
            if(200 == this._xmlHttp.status){
                if(undefined != this._success){
                    //將請求發送給調用者
                    this._success(this._xmlHttp.responseXML);
                }
            }
            // 錯誤,或返回結果非200
            else{
                if(undefined != this._error){
                    this._error("Error:Server Internal Error!");
                }
            }
        }
    },
 
    //開始Ajax請求
    _ajaxRequest: function() {
        //開啟請求
        try{
            //開啟請求
            this._xmlHttp.open(this._method , this._url ,this._asyn);
        }catch(e){
            //開啟請求錯誤
            if(undefined != this._error){
                this._error("Error:Openning Ajax Request Error!");
            }
        }
        try{
            //發送請求
            this._xmlHttp.send(this._data);
        }
        catch(e){
            //發送資料錯誤
            if(undefined != this._error){
                this._error("Error:Sending Ajax Request Error!");
            }
        }
    },
 
    //初始化HttpRequest對象
    _initHttpRequest: function(){
        //初始化HTTPReqest
        if(!isIE){//FF opera safari
            this._xmlHttp = new XMLHttpRequest();
        }else{//IE
            try{//IE6+
                this._xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
            }catch(e){
                try{//IE5.5+
                    this._xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                }catch(e){
                    //瀏覽器不支援
                    if(undefined != this._error){
                        this._error("Sorry! Your Browser dose not Support Ajax!");
                    }
                }
            }
        }
        //事件綁定
        if(null != this._xmlHttp) {
            //綁定狀態改變事件
            this._xmlHttp.onreadystatechange = Bind(this, this._readyStateChange);
        }else{
            //綁定事件調用錯誤資訊
            if(undefined != this._error){
                this._error("Error: init Ajax Object Error!");
            }
        }
    }
}

以下是簡單的調用代碼,相信用過Jquery的朋友覺得很類似吧?

 代碼如下 複製代碼

function testAjax() {
    var req = "text=" + $("txtName").value;
    //對象調用Ajax測試
    $ajax({
        url:"AjaxTest",
        method:"post",
        asyn:true,
        data:req,
        success: function(obj){
        //這裡測試輸出資料,不作XML解析
            $("msg").innerHTML = obj;
        },
        error: function(msg){
        //錯誤資訊顯示
            $("msg").innerHTML = msg;
        }
    });
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.