AJAX异步请求封装

沧桑雨迢迢  23 : 54 : 11
$createDelegate 
=   function (instance, method)  {
    
return function() {
        
return method.apply(instance, arguments);
    }

}

if ( ! window.XMLHttpRequest) {
    
///<summary>跨浏览器的XMLHttpRequest</summary>     
    window.XMLHttpRequest = function(){
        
var progIDs = ['Msxml2.XMLHTTP','Microsoft.XMLHTTP'];
        
for(var i=0; i<progIDs.length; i++){
            
try{
                
var xmlHttp = new ActiveXObject(progIDs[i]);
                
return xmlHttp;
            }
catch(ex){
            }

        }

        
return null;
    }

}

window.XMLDOM 
=   function  window$XMLDOM(markup)  {
    
if (!window.DOMParser) {
        
var progIDs = [ 'Msxml2.DOMDocument.3.0''Msxml2.DOMDocument' ];
        
for (var i = 0; i < progIDs.length; i++{
            
try {
                
var xmlDOM = new ActiveXObject(progIDs[i]);
                xmlDOM.async 
= false;
                xmlDOM.loadXML(markup);
                xmlDOM.setProperty(
'SelectionLanguage''XPath');
                
return xmlDOM;
            }

            
catch (ex) {
            }

        }

        
return null;
    }

        
else {
        
try {
            
var domParser = new window.DOMParser();
            
return domParser.parseFromString(markup, 'text/xml');
        }
 catch (ex) {
            
return null;
        }

    }

    
return null;
}

var  $extend  =   function ()  {
    
/// <summary>将从第2个开始的对象的属性全复制给第一个对象</summary>
    var target = arguments[0], a = 1;
    
if ( arguments.length == 1 ) {
        
return target;
    }
    
    
var prop;
    
while (prop = arguments[a++]){
        
for ( var i in prop ) {
            target[i] 
= prop[i];    
        }

    }

    
return target;
}
;

var  Ajax  =   function (settings) {
    
this._ajaxSettings = $extend({}, $Ajax.Settings, settings);       
    
this._xmlHttpRequest = new XMLHttpRequest();     
}

    
function  Ajax$_onReadyStateChange() {
        
if (this._xmlHttpRequest.readyState === 4 ) {
            
if(this._xmlHttpRequest.status == 200){            
                
if(this._timer){
                    window.clearTimeout(
this._timer);
                    
this._timer = null;                
                }

                
if(typeof(this._ajaxSettings.success) == 'function'){
                    
this._ajaxSettings.success(this._xmlHttpRequest.responseText);
                }
                
                
this._isActive = false;
            }

        }

    }

    
function  Ajax$call(settings) {
        
if(this._isActive == true){
            
throw new Error("正在使用中...");
        }

        
var s = $extend(this._ajaxSettings, settings);  
        
var xml = this._xmlHttpRequest;
        xml.onreadystatechange 
= $createDelegate(this,this._onReadyStateChange);  
        
if ( s.data ) {               
            s.data 
= Ajax.getUrlParam(s.data);  //url传递的格式(值进行json)        
        }
        
        
if ( s.type.toLowerCase() == "post" ){        
            xml.open(s.type, s.url, s.async);        
            xml.setRequestHeader(
"Content-Type", s.contentType);                
        }
else if(s.type.toLowerCase() == "get"){
            s.url 
+= ((s.url.indexOf("?"> -1? "&" : "?"+ s.data;                
            s.data 
= null;
            xml.open(s.type, s.url, s.async);        
        }
        
        
if ( s.timeout > 0 ){
            
this._timer = window.setTimeout(function(){
                
if ( xml ) {            
                    xml.abort();
                    
if(typeof(s.fail) == 'function'){
                        s.fail(
new Error("ajax调用超时:"+s.timeout))        
                    }

                }

            }
, s.timeout);
        }
        
        
try {
            xml.send(s.data);
            
this._isActive = true;
        }
 catch(e) {
            
if(typeof(s.fail) == 'function'){
                s.fail(e);        
            }

        }

    }

    
function  Ajax$dispose() {
        
this._xmlHttpRequest.onreadystatechange = function(){};
        
this._xmlHttpRequest = null;        
    }

Ajax.prototype 
=   {
    _isActive: 
false,
    _ajaxSettings : 
null,
    _timer: 
null,
    _xmlHttpRequest: 
null,
    _onReadyStateChange: Ajax$_onReadyStateChange,
    call: Ajax$call,
    dispose: Ajax$dispose
}

Ajax.getUrlParam 
=   function ( hs )  {
    
var s = [];
    
for ( var j in hs ) {
        s.push( encodeURIComponent(j) 
+ "=" + encodeURIComponent( hs[j] ) );
    }
    
    
return s.join("&");
}

$Ajax 
=   function (settings) {    
    
var success = settings.success;
    
var fail = settings.fail;    
    
var a = new Ajax();   
    settings 
= $extend({},$Ajax.Settings,settings,{
        success : 
function(text){
            success(text);            
            a.dispose();
        }
,
        fail : 
function(e){
            fail(e);
            a.dispose();
        }

    }
);   
    
if(settings.data){
        settings.data[
"__ajaxCallNoCache"= new Date();
    }
else{
        settings.data 
= {};
        settings.data[
"__ajaxCallNoCache"= new Date();
    }
    
    a.call(settings);
}

$Ajax.Settings 
=   {
    type: 
"GET",
    timeout: 
0,
    contentType: 
"application/x-www-form-urlencoded",
    processData: 
true,
    async: 
true,
    data: 
null,
    success: 
null,
    fail: 
null
}

$Ajax.ajaxSetup 
=   function (settings) {
    $extend($Ajax.Settings,settings);
}

沧桑雨迢迢 
23 : 54 : 21
给大家一个ajax caller
沧桑雨迢迢 
23 : 54 : 45
实现跨浏览器,ajax交互操作的所有功能
~~
沧桑雨迢迢 
23 : 55 : 18
调用:
    $Ajax(
{       
        url: 
'HttpService.aspx',
        type: 
'get',
        async: 
false,
        data:
{
            methodName: 
'lala',
            param: 
123
        }
,        
        success: 
function(text){                    
            alert(text
+"!1");
        }
,
        fail: 
function(e){
            alert(e.message);
        }

    }
);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值