关于XMLHttpRequest对象的onreadystatechange

cqzoo 2009-07-02 11:07:15
向各位请教:XMLHttpRequest对象的onreadystatechange,如何在这个事件的回调函数中取得当前XMLHttpRequest对象?条件是不使用全局变量。我尝试在回调函数中使用this,比如this.readyState,this.status,这样在firefox上没问题,但在IE上就有问题。请问有其他方法吗?谢谢
...全文
349 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Go 旅城通票 2009-07-02
  • 打赏
  • 举报
回复
test.html


//仅ie6测试。。。。。。这个你得问ms的了,我也不清楚,this==window
var xhr=new ActiveXObject("microsoft.xmlhttp")
xhr.onreadystatechange=function(){if(xhr.readyState==4)alert(this==window)}
xhr.open('post','test.html',true);
xhr.send('');
cqzoo 2009-07-02
  • 打赏
  • 举报
回复
cgisir,不好意思,刚刚结贴,刚才结贴时没看到你的回答。谢谢你!
cgisir 2009-07-02
  • 打赏
  • 举报
回复
下面的callback不用带参数的
这样
function XmlHttp()
{
var xmlHttp=createXmlHttp();//这个函数封装了创建XMLHttpRequest的代码
xmlHttp.open("GET","http://www.baidu.com",true);
xmlHttp.onreadystatechange=function(){ callback.call(xmlHttp) };//回调函数
xmlHttp.send(null);
}
function callback(){
if(this.readyState==4){
if(this.status == 200){
alert(this.responseText);
}
}
}
cgisir 2009-07-02
  • 打赏
  • 举报
回复
#9楼有点像但这样用
或者你自已给 FUNCTION扩展一个 bind方法, prototype有实现 可以参考

function XmlHttp()
{
var xmlHttp=createXmlHttp();//这个函数封装了创建XMLHttpRequest的代码
xmlHttp.open("GET","http://www.baidu.com",true);
xmlHttp.onreadystatechange=function(){ callback.call(xmlHttp) };//回调函数
xmlHttp.send(null);
}
function callback(xmlHttp){
if(this.readyState==4){
if(this.status == 200){
alert(this.responseText);
}
}
}
Go 旅城通票 2009-07-02
  • 打赏
  • 举报
回复
我知道你是想表达什么,但是怎么使用this对象来实现还未想出来。。。

按照xhtml的话,这样添加事件处理,在ie和ff下,this对象都是指向div这个对象
var div=document.getElementById('莫div的id');
div.onclick=function(){/*this对象为div,不会同acx在ie下this==window*/}//添加事件


但是ie下使用xhr时
xhr.onreadystatechange=function(){/*this对象为window,并不是当前的xhr对象*/}



我1楼给的例子就是让你在ie下运行,让你知道处理函数中的this对象并非xhr对象,而是window对象了
toury 2009-07-02
  • 打赏
  • 举报
回复

function XmlHttp()
{
var xmlHttp=createXmlHttp();//这个函数封装了创建XMLHttpRequest的代码
xmlHttp.open("GET","test.html",true);
xmlHttp.onreadystatechange=callback(xmlHttp);//回调函数
xmlHttp.send(null);
}
function callback(o){
if(o.readyState==4){
if (o.status==200){
//处理数据
//........
o=null;
}
}
}

ghxy_lw 2009-07-02
  • 打赏
  • 举报
回复
哦~~那同学习一下~
toury 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cqzoo 的回复:]
tobyzhou,很高兴得到你的指教,你这样写是应用了javascript闭包的特性,这样是可以实现我想要的功能。但我想再问一下,应用闭包后,xmlHttp会在什么时候被摧毁?如果我有一个鼠标单击事件,调用事件处理函数XmlHttp(),那callback()调用结束后xmlHttp会被摧毁吗?我这样问是想知道这样实现的效果和使用全局变量的效果有什么不同,哪一种方法执行的性能更高。谢谢!
[/Quote]

你可以在callback函数里销毁xmlhttp:

if(xmlhttp.readyState==4){
if (xmlhttp.status==200){
//处理数据
//........
xmlhttp=null;
}
}
cqzoo 2009-07-02
  • 打赏
  • 举报
回复
4楼还没有理解我的问题。
cqzoo 2009-07-02
  • 打赏
  • 举报
回复
tobyzhou,很高兴得到你的指教,你这样写是应用了javascript闭包的特性,这样是可以实现我想要的功能。但我想再问一下,应用闭包后,xmlHttp会在什么时候被摧毁?如果我有一个鼠标单击事件,调用事件处理函数XmlHttp(),那callback()调用结束后xmlHttp会被摧毁吗?我这样问是想知道这样实现的效果和使用全局变量的效果有什么不同,哪一种方法执行的性能更高。谢谢!
ghxy_lw 2009-07-02
  • 打赏
  • 举报
回复
XMLHttpRequest 你是怎么创建的?是不是对象没有创建成功
tobyzhou 2009-07-02
  • 打赏
  • 举报
回复

//这样实现可否?
xmlHttp.onreadystatechange = function(){
callback(xmlHttp);
}
cqzoo 2009-07-02
  • 打赏
  • 举报
回复
可能是我说得不够清楚,以至于1楼的高手可能还没有明白我的意思,是这样的:

function XmlHttp()
{
var xmlHttp=createXmlHttp();//这个函数封装了创建XMLHttpRequest的代码
xmlHttp.open("GET","test.html",true);
xmlHttp.onreadystatechange=callback;//回调函数
xmlHttp.send(null);
}
function callback()
{
//在这里,我要用到上面XmlHttp函数里面定义的局部变量xmlHttp,但我不想定义一个全局变量,可以实现吗?
}

52,797

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧