bob体育官方平台
firefox下对ajax的onreadystatechange的支持情况分析_javascript技巧_脚本之家

生龙活虎、难题: 复制代码 代码如下: var xmlHttp; function savecarttodata(State of Qatar{ createXMLHttpRequest(卡塔尔(قطر‎; var rndcode = new Date; var CartUrl ="a.asp?cache="+rndcode xmlHttp.onreadystatechange = function(卡塔尔{ ..... } xmlHttp.open ; xmlHttp.send; } 下边包车型大巴这段代码, xmlHttp.onreadystatechange = function(卡塔尔{.....};能够在FF下施行,但是少年老成旦改成 xmlHttp.open ;时就可怜了,前天被那个主题材料整的昏头昏脑。 原因分析: 其生龙活虎:此时无法用xmlHttp.send(卡塔尔(قطر‎,须求内容,若无内容,要用NULL 其二:经测量检验后发觉,onreadystatechange在IE下都很平时,但在FF3下,只好运行readyState=0时的代码。无法运作readyState=4的代码,在互连网上找了四个原因: 在ajax的XMLHttpRequest.onreadystatechange方法的分化:在FF中当状态为1(即XMLHttpRequest已经调用open但还未调用send时),FF则会继续推行onreadystatechange前面包车型客车代码,到实施完前面包车型地铁代码后,在实行onreadystatechange留意况2,3,4的代码,而IE会等待状态2的到了,施行完onreadystatechange中状态2,3,4的代码后,继续推行前面包车型客车代码,那样难题就涌出了,平常大家在onreadystatechange的代码要拍卖从服务器上赢得的数目(那么些数据独有在onreadystatechange的情形为4时,能力够取得),所以那在IE中不设不平日,因为它会等待onreadystatechange状态4到来以后,在实行onreadystatechange后边的多寡,可是出于FF不会等到onreadystatechange状态4到来后在实施onreadystatechange前边的代码,所以后边的代码就不能够管理从服务器上赢得的数目,那该如何是好呢? 消除方式:使用javascript的闭包。我们传递一个函数给onreadystatechange,在此个函数中管理从服务器上回来的多少,不过onreadystatechange是一个无参函数,那该怎么做呢?方法在自己前边的Javascript attachEvent传递参数的秘诀已经介绍 了,这里再稍加介绍一下,正是传递八个参数给onreadystatechange,不过在onreadystatechange中动用return多个无参函数,在这里个无参函数中得以接纳这一个流传的参数。那些方法在IE和FF中都能够健康运营,所以这不失是多少个好措施。 这里涉及选用闭包,挺复杂,别的网络有采用了在FF下用onload,也是无论用。经过对不当消灭,上边摘要提到的从头至尾的经过,才是一向的,相当于说,在FF下,第叁次实施完onreadystatechange后,继续试行到send,但背后就不会再回头奉行onreadystatechange,平素傻傻的走下来。 作者平昔改成: 复制代码 代码如下: xmlHttp.onreadystatechange = xmlHandle; xmlHttp.open ; xmlHttp.send; xmlHttp.onreadystatechange = xmlHandle; //这里加风华正茂行挡住FF,让它再搞二遍。 function xmlHandle(卡塔尔(قطر‎{ if (xmlHttp.readyState < 4卡塔尔国{ ...... }else if (xmlHttp.readyState == 4 && xmlHttp.status == 200卡塔尔{ var cartResult = Number; if { window.location.href='a.asp'; }else if { ......; }else{ window.location.href='/'; } } } 可是那般也不行,原本ff 3改成:xmlHttp.onreadystatechange = xmlHandle(卡塔尔(قطر‎;可是加了括号,IE又特别,唉,原本就感觉FF是鸡皮,未来认为FF纯属多个打着“支持标准”的称号,却是干着浪费技术员时间的废料。但手上这些顺序又实在主要,不能,唯有再调试看看有未有更轻松的格局,如下: 复制代码 代码如下: xmlHttp.open ; xmlHttp.send; if xmlHandle(State of Qatar; 这段代码在IE和FF下能够通用。但由于是手拉手调用,必要在readyState<4时未得到结果前现身提示,那对于网速慢的顾客很融洽。不过要在本机得到这种等待反适时的情况,由于本机反应快,会招致看不到给客商提醒,因而暂且先不用那几个代码 独有踏向浏览器类型解析。 复制代码 代码如下: function getOs(卡塔尔国 { var OsObject = ""; if(navigator.userAgent.indexOf { return "MSIE"; //IE浏览器 } if(isFirefox=navigator.userAgent.indexOf{ return "Firefox"; //Firefox浏览器 } if(isSafari=navigator.userAgent.indexOf { return "Safari"; //Safan浏览器 } if(isCamino=navigator.userAgent.indexOf{ return "Camino"; //Camino浏览器 } if(isMozilla=navigator.userAgent.indexOf{ return "Gecko"; //Gecko浏览器 } } 然后把AJAX代码改为: 复制代码 代码如下: var rndcode = new Date; var CartUrl ="a.asp?cache="+rndcode var btype=getOs(卡塔尔; xmlHttp.onreadystatechange = ?xmlHandle(卡塔尔(قطر‎:xmlHandle; xmlHttp.open ; xmlHttp.send; xmlHttp.onreadystatechange = ?xmlHandle(卡塔尔(قطر‎:xmlHandle; 例二 复制代码 代码如下: //获取游历器的项目,为缓和onreadystatechange不宽容的题材function getOs(State of Qatar { var OsObject = ""; if(navigator.userAgent.indexOf { return "MSIE"; //IE浏览器 } if(isFirefox=navigator.userAgent.indexOf{ return "Firefox"; //Firefox浏览器 } if(isSafari=navigator.userAgent.indexOf { return "Safari"; //Safan浏览器 } if(isCamino=navigator.userAgent.indexOf{ return "Camino"; //Camino浏览器 } if(isMozilla=navigator.userAgent.indexOf{ return "Gecko"; //Gecko浏览器 } } var objHttp; function searchCommodityByGroupId { objHttp = getHttpRequest; var url="getCommodityListByGroupId.htm?commodityGroupId="+groupId+"&time="+tt; var btype=getOs(卡塔尔; objHttp.onreadystatechange=?getCommodity(卡塔尔(قطر‎:getCommodity; objHttp.open; objHttp.send; objHttp.onreadystatechange=?getCommodity(卡塔尔:getCommodity; } function getCommodity(卡塔尔(قطر‎{ if(objHttp.readyState==4State of Qatar { if { document.getElementById.innerHTML=objHttp.responseText; } } } function getHttpRequest(卡塔尔(قطر‎{ var httpRequest; if (window.XMLHttpRequest卡塔尔{ httpRequest = new XMLHttpRequest(卡塔尔; if (httpRequest.overrideMimeType卡塔尔国{ httpRequest.overrideMimeType; } }else if { try{ httpRequest = new ActiveXObject; }catch{ try { httpRequest = new ActiveXObject; }catch{} } } return httpRequest; }

返回顶部