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


猜你喜欢
- 简单的测试用例#!/usr/bin/python# -*- coding: UTF-8 -*-import timefrom pymongo
- 前言:pandas中排序的几种常用方法,主要包括sort_index和sort_values。基础数据:import pandas as p
- Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱
- 最近有个Vue项目中会偶尔出现Loading chunk {n} failed的报错,报错来自于webpack进行code spilt之后某
- 对于golang, 交换两个数很简单,如下这么写就可以了:i, j = j, i等号左边和右边含有多个表达式,这就是平行赋值。 赋值分为两个
- 本次案例使用OpenCV和selenium来解决一下滑块验证码先说一下思路:弹出滑块验证码后使用selenium元素截图将验证码整个背景图截
- 多线程适合于多io操作多进程适合于耗cpu(计算)的操作# 多进程编程# 耗cpu的操作,用多进程编程, 对于io操作来说,使用多线程编程i
- 超级简单实现iframe框架滚动控制,前提要会简单修改原代码。step1:插入iframe标签在你想要的位置。<iframe
- 什么是 MyBatis?MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 J
- 一、Pylint 是什么Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在
- python去除文件中重复的行,我们可以设置一个一个空list,res_list,用来加入没有出现过的字符行!如果出现在res_list,我
- 本文实例讲述了js设计模式之单例模式原理与用。分享给大家供大家参考,具体如下:关于设计模式,我的理解是它是业务代码的提前解决方案。意思就是说
- 1.数据是什么?在 Python 以及其他所有面向对象编程语言中,类都是对数据的构成(状态)以及数据 能做什么(行为)的描述。由于类的使用者
- 所谓贪婪匹配就是匹配重复字符是尽可能多的匹配,比如:"aaaaa".match(/a+/); //["aaaa
- 在windows下写bat的时候,通过pause命令,可以暂停程序运行,例如经常见的程序会在终端提示”按任意键继续……”,用户在终端回车后程
- 记录了Linux 安装python3.7.0的详细过程,供大家参考,具体内容如下我这里使用的时centos7-mini,centos系统本身
- pyecharts中的Funnel函数可以绘制漏斗图,自动根据数据大小生成由大到小自上而下排列的一个漏斗样的图形。1、导入Funnel模块。
- CSS入门很简单,规则不多,写法也比较灵活,因此也带来了很多有创意的写法。跟IE一样,很好的容错性,像《 边框样式写法总结 》所说的bord
- 网上关于Python的音视频播放示例都集中在简单的多媒体库或者PyGame这样的游戏库,有些库使用简单,但功能单一,有些库功能丰富,支持的格
- 级联查询在ORACLE 数据库中有一种方法可以实现级联查询select * //要查询的字段from table