XMLHttpRequest的浏览器兼容代码写法

作者:winter 来源:51js 时间:2008-09-02 10:46:00 

XMLHttpRequest的兼容代码功能结构上大体没有什么变动

主要处理了这么几条:

1.不同浏览器的创建方式

2.事件大小写问题(ie7的XMLHttpRequest)

3.this指向问题(ie6的ActiveX)

4.增加了2个事件onerror和onfinish


部分代码方便阅读:


function HttpRequest()
{
    if(this==window)throw new Error(0,"HttpRequest is unable to call as a function.")
    var me=this;
       var asyncFlag=false;
       var typeFlag=false;
    var r;
    function onreadystatechange()
    {
        if(me.onreadystatechange)me.onreadystatechange.call(r);
        if(r.readyState==4)
        {
            if(Number(r.status)>=300)
            {
                if(me.onerror)me.onerror.call(r,new Error(0,"Http error:"+r.status+" "+r.statusText));
                if(typeFlag)r.onreadystatechange=Function.prototype;
                else r.onReadyStateChange=Function.prototype;
                r=null;
                return;
            }
            me.status=r.status;
            me.statusText=r.statusText;
            me.responseText=r.responseText;
            me.responseBody=r.responseBody;
            me.responseXML=r.responseXML;
            me.readyState=r.readyState;
            if(typeFlag)r.onreadystatechange=Function.prototype;
            else r.onReadyStateChange=Function.prototype;
            r=null;
            if(me.onfinish)me.onfinish();
        }
    }
    function creatHttpRequest(){
        var e;
        try{
            r=new window.XMLHttpRequest();
            typeFlag=true;
        } catch(e) {           
            var ActiveXName=[
                'MSXML2.XMLHttp.6.0',
                'MSXML2.XMLHttp.3.0',
                'MSXML2.XMLHttp.5.0',
                'MSXML2.XMLHttp.4.0',
                'Msxml2.XMLHTTP',
                'MSXML.XMLHttp',
                'Microsoft.XMLHTTP'
            ]
            function XMLHttpActiveX()
            {
                var e;
                for(var i=0;i<ActiveXName.length;i++)
                {
                    try{
                        var ret=new ActiveXObject(ActiveXName[i]);
                        typeFlag=false;
                    } catch(e) {
                        continue;
                    }
                    return ret;
                }
                throw {"message":"XMLHttp ActiveX Unsurported."};
            }
            try{
                r=new XMLHttpActiveX();
                typeFlag=false;
            } catch(e) {
                throw new Error(0,"XMLHttpRequest Unsurported.");
            }
        }
    }
    creatHttpRequest();


    this.abort=function(){
        r.abort();
    }
    this.getAllResponseHeaders=function(){
        r.getAllResponseHeaders();
    }
    this.getResponseHeader=function(Header){
        r.getResponseHeader(bstrHeader);
    }
    this.open=function(Method,Url,Async,User,Password){
        asyncFlag=Async;
        try{
            r.open(Method,Url,Async,User,Password);
        } catch(e) {
            if(me.onerror)me.onerror(e);
            else throw e;
        }
    }
    this.send=function(Body){
        try{
            if(typeFlag)r.onreadystatechange=onreadystatechange;
            else r.onReadyStateChange=onreadystatechange;

            r.send(Body);
            //alert("sended");
            if(!asyncFlag){
                this.status=r.status;
                this.statusText=r.statusText;
                this.responseText=r.responseText;
                this.responseBody=r.responseBody;
                this.responseXML=r.responseXML;
                this.readyState=r.readyState;

                if(typeFlag)r.onreadystatechange=Function.prototype;
                else r.onReadyStateChange=Function.prototype;

                r=null;
            }
        } catch(e) {
            if(me.onerror)me.onerror(e);
            else throw e;
        }
        //alert("sended");
    }
    this.setRequestHeader=function(Name,Value){
        r.setRequestHeader(Name,Value);
    }
}


 

 

标签:XMLHttp,Request,兼容,浏览器
0
投稿

猜你喜欢

  • 网站设计趋势: iPhones[译]

    2009-09-21 12:40:00
  • css样式表滤镜全接触

    2007-10-26 12:48:00
  • 使用SqlBulkCopy时应注意Sqlserver表中使用缺省值的列

    2012-07-11 15:34:35
  • 优化 SQL Server 索引的小技巧

    2012-10-07 11:00:07
  • 空行不空格式排版组织原理

    2010-05-03 14:46:00
  • ASP XML操作类代码

    2011-03-08 10:47:00
  • IE6 升级要不要?

    2009-07-23 20:44:00
  • Mobile Web下的编码设计

    2010-01-28 10:42:00
  • 如何防止未经注册的用户绕过注册界面直接进入应用系统?

    2009-11-22 19:22:00
  • ASPImage组件的实现过程[图]

    2008-02-03 15:37:00
  • 写给JavaScript库开发者们的规则

    2008-10-26 12:30:00
  • asp 各种进制转换函数

    2008-06-24 12:35:00
  • asp如何使用MsChart制图工具?

    2010-06-05 12:40:00
  • W3C优质网页小贴士(四)

    2008-04-17 13:34:00
  • ASP 写的判断 Money 各个位值的函数

    2008-04-13 06:36:00
  • Dreamweaver 网页编辑常用表现的实现方法

    2010-10-20 20:05:00
  • CSS Hack 汇总快查

    2007-11-06 11:48:00
  • ASP访问数量统计代码

    2011-04-08 10:59:00
  • FrontPage XP设计教程4——Css样式表的应用

    2008-10-11 12:25:00
  • asp如何对用户进行授权?

    2009-11-20 18:46:00
  • asp之家 网络编程 m.aspxhome.com