IE下ajax问题的探讨
今天当js的时候,想打包一个ajax请求发送对象,当然是兼容所有浏览器的:复制代码代码如下所示:
var
Xhr:空,
回调函数:null,
XMLHttp:函数(){
VaR技术;
标准浏览器
如果(窗口。XMLHttpRequest){
{试
XMLHTTP =新的XMLHttpRequest();
}
catch(e){
警报('unknown Ajax错误);
/ / console.log('unknown Ajax错误);
}
}
浏览器
{其他
如果(窗口。ActiveX对象){
{试
XMLHTTP =新的ActiveX对象('microsoft。XMLHTTP的);
}
catch(e){
{试
XMLHTTP =新的ActiveX对象('msxml2。XMLHTTP的);
}
catch(e){
警报('unknown Ajax错误);
/ / console.log('unknown Ajax错误);
}
}
}
}
返回XMLHTTP;
},
连接:功能(paramsobj){
VaR宝= paramsobj;
参与判断法/
如果(!(PO实例对象)){
警报('ajax参数非法);
/ / console.log('ajax参数非法);
返回false;
}
否则如果(!(PO。urlpo。methodpo。回调)){
返回false;
}
内部参数初始化
this.xhr = this.xmlhttp();
this.callback = po.callback;
/ /参数对象并生成URL遍历参数
无功requestparams =;
如果(PO。params){
对于(重点在Po。params){
requestparams =键+ params {key} +=+;
}
requestparams = requestparams.substr(1);
}
启动请求
{试
VaR XHR = this.xhr;
xhr.onreadystatechange = this.response;
POST请求处理
如果(PO.method.toLowerCase()= = 'post){
Xhr.open('post ',po.url,真的);
Xhr.send(requestparams);
}
获取请求处理
如果(PO.method.toLowerCase)= =(' '){
Xhr.open(' ',宝。URL ++ requestparams,真的);
Xhr.send(空);
}
}
catch(e){
This.callback(null,1);
}
},
响应:函数(){
此代码在所有浏览器中通过测试
如果(阿贾克斯。XHR。readyState = = 4){ / /
如果(阿贾克斯。XHR。状态= = '200){ / /
/ / ajax.callback(阿贾克斯。XHR。responseText);
}
{其他的
/ / ajax.callback(null,阿贾克斯。XHR。状态);
}
}
下面的代码在IE中失败(没有错误,相应的请求,但没有返回结果,其他浏览器没有这个问题)
如果(这。发生= 4){
如果(这个状态= = '200){
Ajax.callback(这个responseText);
}
{其他
ajax.callback(null,这个状态);
}
}
}
};
实例
ajax.connect({
网址:HTML的测试,
方法:' ',
回调函数(数据,错误){
如果(数据)!= NULL){
警报(数据);
/ / console.log(数据);
}
{其他
警报(错误);
/ / console.log(ERR);
}
}
});
问题描述:让我们看看在我的代码中注释过的代码,它在整个浏览器下进行测试。没有注释的代码是一个有问题的代码。
测试在Chrome,Firefox,Opera和Safari,IE6,7下的性能(IE8 +未测试)是没有错误,并没有返回结果。
比较这两个代码之间的区别,我认为有两种可能性。一个是这个指向的问题,一是在IE onreadystatechange函数的上下文语境,这是不同于其他浏览器,但现在还无法确定问题。JS在IE6和7的调试是很困难的。(试过Firebug Lite,但它不使用它在一个幻想的方式,和Ajax对象被成功地削减在Firebug Lite,糊涂一点)。
解决过程:
事实上,这个测试方法很简单,主要的意思是没有想到发烧。
事实上,在处理这种指向未知的问题,可以尝试使用这是JS对象来找出什么样的变量是指= = =。这个窗口可以用于判断是否是一个全球性的电话。我在这里使用这个方法。
在代码问题中,我们可以尝试插入一段代码:
警报(这个实例对象);
其结果是,在IE6,返回假!一目了然 uff01it可能有这样一个奇怪的返回值在IE,这证明了什么也就是说,函数的执行上下文不是一个对象!这样,你就只能想到伊江的窗口对象,而且你知道IE总是一个很好的工作。你的标准浏览器说窗口对象是一个对象,我不知道它。你还不知道我在想什么吗那你为什么不试试呢
警报(此= =窗口);
The result is true!是什么样的没有话对不对所以问题很明显:
当Ajax请求的响应下即回调函数中调用onreadystatechange全球环境。在标准的浏览器,执行上下文是XMLHttpRequest对象。它给我造成的事故。