网络编程
位置:首页>> 网络编程>> JavaScript>> XMLHttpRequest的浏览器兼容代码写法

XMLHttpRequest的浏览器兼容代码写法

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

标签:XMLHttp,Request,兼容,浏览器

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);
    }
}


 

 

0
投稿

猜你喜欢

  • 如何最大限度地实现安全登录功能?    具体方法如下(这是一个程序,为便于说明,中间用虚线“------”将代
  • 所谓产品其实最终展现在用户面前的只是界面而已,所谓界面绝大多数时候只包括两个部分:图片、文字。重视界面上的每一个像素和每一个文字是UED的基
  •  <1>IsArray 函数  返回 Boolean 值指明某变量是否为数组。 语法 IsArray(var
  • 这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内: mysql> 
  • 今天在一个QQ群中看到有人在问一个进度条的实现方式,当时因为工作时间,需求相对也比较紧,只是简单的说了一下可以通过CSS的边框属性和背景属性
  • 操作实现函数: 代码如下:Function AddWater(n) Set Photo = 
  • 环境:winxp sp2 ,mysql5.0.18,mysql odbc 3.51 driver 表采用 myisam引擎。access 2
  • 注:本文是应Alan邀请为《CSS布局实录》写的一个web标准入门指导。书已经上市近一年了,现在摘选出来,给初学者一个参考。希望了解更多实现
  • 说绘画语言,西方的油画是人类视觉语言里怎么也不能忽略的浓烈一笔。14~15世纪,蛋彩画——油画前身的发明,绘画可以使用均匀过渡的色彩渐变,并
  • 方法一 :这个是我在站长工具的查询页面使用的防止频繁查询,刷新页面的代码!下面函数的功能是3秒内查询页面即刷新了页面,超过2次就提示!sea
  • 原文:10 Principles Of Effective Web Design翻译:熊猫2008-02-03本文由熊猫同学授权翻译首发。并
  • 写程序的人在编写由asp页面生成静态页面html的时候,如果同时生成大量页面,一定遇到过浏览器下方的进度条上显示着3%,6%,10%等缓慢增
  • asp过滤留言中脏话的代码例子<!--#include file="../conn/dbconn1.asp"--&
  • Google网站管理员工具的验证方式有两种,一个是通过html文件,或一种是通过meta标签。通常情况下,这两个方式直接就可以通过验证了。但
  • 之前有写过一篇浏览器的tab设计,这回说说网站的tab设计。一说到tab很自然地就想到了导航、信息架构。随着网站信息结构的复杂化,选择tab
  • 文通过一个操作实例来说明SQL中主标识列IDENTITY的使用技巧。要求:在 sql server 2005中,建立数据表book,在表bo
  • clipboardData 对象提供了对于预定义的剪贴板格式的访问,以便在编辑操作中使用。成员表方法 描述 clearData 通过 dat
  • 如果用户查询时,使用Order BY排序语句指定按员工编号来排序,那么排序后产生的所有记录就是临时数据。对于这些临时数据,Oracle数据库
  • 创作思路:主要还是想尝试做点稍微不同于整天为迎合客户而做的东西.然后闲时就开始构思,比如坐车,走路什么的.看到有一些复古手机的相关图,就想到
  • 假如读者已经熟悉了ASP 2.0,并正在寻找3.0版本中的实际改变的列表,那么将在下面发现这些信息。假如读者是一个ASP的初学者,可以越过本
手机版 网络编程 asp之家 www.aspxhome.com