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);
}
}
猜你喜欢
- 如何最大限度地实现安全登录功能? 具体方法如下(这是一个程序,为便于说明,中间用虚线“------”将代
- 所谓产品其实最终展现在用户面前的只是界面而已,所谓界面绝大多数时候只包括两个部分:图片、文字。重视界面上的每一个像素和每一个文字是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的初学者,可以越过本