您的位置:首页 > 其它

Ajax在FireFox中的一个BUG

2008-03-11 12:50 225 查看
今天在FireFox中测试Ajax,老出现问题!晕倒了..看了一大堆E文后终于找到一个离奇的解决方法.

首先,已经定义如下函数:

createXMLHTTP() ------ 兼容IE和FF的创建xmlhttp对象函数


//XMLHTTP返回数据




function getResponse(method,action,aysnc,s_str,datatype)...{


xmlhttp.open(method,action,aysnc);


if(s_str=="")


return true;


if(method=="post")


xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");




xmlhttp.onreadystatechange = function()...{




if(xmlhttp.readyState == 4)...{ //收到所有数据




if(xmlhttp.status == 200)...{ //消息正确


///..成功获得数据,处理xmlhttp.responseText或者xmlhttp.responseXML


};


xmlhttp.send(s_str);


return true;


}




//对check的onclick动作发送信息




function sendmessage()...{


var checked;


if(this.checked)


checked=1;


else


checked=0;


var s_str="id="+this.value+"&checked="+checked;


getResponse("post","**.php",true,s_str,"text/plain");


}





这还不是完整的代码,大概情况就这样吧,然后在IE中测试完全没问题.在FF中测试后,发现此问题:



听说问题是由于FF的一个很深奥的BUG,上了百度,GOOGLE找..终于找到解决的办法.

首先,要在xmlhttp.onreadystatechange下加上try..catch语句,以防止错误终止程序.try包含xmlhttp.onreadystatechange下所有语句.然后在getResponse进行之前,加入xmlhttp=false;xmlhttp=createXMLHttp; 然后把getresponse函数放进setTimeout中,时间设置为0即可,更保险的方法是再在catch中再加入setTimeout函数重启发送信息程序即可解决.

问题分析:根据其解决方法,我估计类似情况的解决方法是重启xmlhttp,即把xmlhttp重新输入对象.根据以往经验,这很可能是FF中一些残留的信息导致xmlhttp前一次的信息仍未完全注销而导致.所以重置一下xmlhttp对象,而加入setTimeout(函数,0)这样的代码,估计是setTimeout能处理的FF中BUG的一个问题的解决方法吧..

以后遇到这种类似的情况,可以试试这种方法吧~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: