一、问题:
var xmlHttp;
function savetodata(){
createXMLHttpRequest();
var rndcode = new Date().getTime();
var Url ="a.asp?cache="+rndcode
xmlHttp.onreadystatechange = function(){
.....
}
xmlHttp.open ("GET",Url,true);
xmlHttp.send(null);
}
上面的这段代码, xmlHttp.onreadystatechange = function(){.....};可以在FF下执行,但是如果改成
xmlHttp.open ("GET",Url,false);时就不行了,今天被这个问题整的晕头转向。
原因分析:
其一:这时不能用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的闭包(这个解决方法是从GMAP中获得灵感的)。我们传递一个函数给onreadystatechange,在这个函数中处理从服务器上返回的数据,但是onreadystatechange是一个无参函数,那该怎么办呢?方法在我前面的Javascript attachEvent传递参数的办法已经介绍 了,这里再稍微介绍一下,就是传递一个参数给onreadystatechange,但是在onreadystatechange中使用return一个无参函数,在这个无参函数中可以使用这个传入的参数。这个方法在IE和FF中都可以正常运行,所以这不失是一个好方法。
这里提到采用闭包,挺复杂,另外网上有采用了在FF下用onload,也是不管用。经过对错误排除,上面摘要提到的原因,才是根本的,也就是说,在FF下,第一次执行完onreadystatechange后,继续执行到send,但后面就不会再回头执行onreadystatechange,一直傻傻的走下去。
我直接改成:
xmlHttp.onreadystatechange = xmlHandle;
xmlHttp.open ("GET",Url,false);
xmlHttp.send(null);
xmlHttp.onreadystatechange = xmlHandle; //这里加一行挡住FF,让它再搞一次。
function xmlHandle(){
if (xmlHttp.readyState < 4){
......
}else if (xmlHttp.readyState == 4 && xmlHttp.status == 200){
var cartResult = Number(xmlHttp.responseText);
if (cartResult == 1){
window.location.href='b.asp';
}else if (cartResult == 2){
......;
}else{
window.location.href='/';
}
}
}
但是这样也不行,原来ff 3改成:xmlHttp.onreadystatechange = xmlHandle();然而加了括号,IE又不行,唉,原来就觉得FF是鸡皮,现在感觉FF纯属一个打着“支持标准”的称号,却是干着浪费程序员时间的垃圾。但手上这个程序又实在重要,没办法,只有再调试看看有没有更简单的办法,如下:
xmlHttp.open ("GET",Url,false);
xmlHttp.send(null);
if(xmlHttp.status==200)
xmlHandle();
这段代码在IE和FF下可以通用。但由于是同步调用,需要在readyState<4时未取得结果前出现提示,这对于网速慢的客户很友好。然而要在本机获得这种等待反应时的情况,由于本机反应快,会造成看不到给客户提示,因此暂时先不用这个代码
只有加入浏览器类型分析。
function getOs()
{
var OsObject = "";
if(navigator.userAgent.indexOf("MSIE")>0) {
return "MSIE"; //IE浏览器
}
if(isFirefox=navigator.userAgent.indexOf("Firefox")>0){
return "Firefox"; //Firefox浏览器
}
if(isSafari=navigator.userAgent.indexOf("Safari")>0) {
return "Safari"; //Safan浏览器
}
if(isCamino=navigator.userAgent.indexOf("Camino")>0){
return "Camino"; //Camino浏览器
}
if(isMozilla=navigator.userAgent.indexOf("Gecko/")>0){
return "Gecko"; //Gecko浏览器
}
}
然后把AJAX代码改为:
var rndcode = new Date().getTime();
var CartUrl ="a.asp?cache="+rndcode
var btype=getOs();
xmlHttp.onreadystatechange = (btype!="Firefox")?(xmlHandle):(xmlHandle());
xmlHttp.open ("GET",CartUrl,false);
xmlHttp.send(null);
xmlHttp.onreadystatechange = (btype!="Firefox")?(xmlHandle):(xmlHandle());
总算OVER了,IE6、IE 7、FF通用
本文出自 51CTO.COM技术博客
分享到:
相关推荐
在IT领域,特别是Web开发中,字符编码的处理是一大挑战,尤其是在跨浏览器、跨平台的环境下,如在Ajax请求中遇到的FireFox与IE之间的乱码兼容问题。本文将深入探讨这一问题,并提供详细的解决方案。 ### Ajax与字符...
本文将基于提供的文档摘要,深入探讨Internet Explorer(IE)与Mozilla Firefox(火狐)这两种主流浏览器在处理DOM操作、事件绑定等方面存在的差异,并提出相应的解决方案。 #### 一、InnerText与InnerHTML - **...
调试JavaScript是网页开发中的重要环节,无论是在IE还是Firefox中,这些插件都提供了强大的JS调试功能。你可以设置断点,查看变量值,跟踪调用栈,这极大地提高了调试效率。对于CSS和HTML,开发者可以直接在页面上...
然而,由于浏览器之间的差异,尤其是IE(Internet Explorer)与Firefox(Firefox)对Ajax的支持不尽相同,开发者常常会遇到兼容性问题。这篇博文主要探讨了如何解决Ajax在IE和Firefox上的兼容性问题。 首先,让我们...
- IE对于跨域请求的限制比Firefox更为严格,这可能影响到使用Ajax进行数据交换的应用。 5. **DOM操作**: - IE和Firefox对DOM(文档对象模型)的理解和操作方式不同,比如IE的`document.all`与Firefox的`document...
### 解决AjaxFileUpload.js在IE9与Firefox下文件过大导致无效问题 #### 背景介绍 在处理Web前端的文件上传功能时,我们经常会遇到浏览器兼容性问题,尤其是在处理较旧版本浏览器如IE9及Firefox时。本文将详细介绍...
在本案例中,我们讨论的主题是如何利用AJAX(异步JavaScript和XML)技术来实现在网页上对图片进行拖放操作,同时兼容IE和Firefox两种主流浏览器。 首先,我们需要了解AJAX的基本概念。AJAX是一种在不重新加载整个...
标题提到的"firebug for IE6+, Firefox, Opera, Safari and Chrome",意味着这是一个跨浏览器的解决方案,旨在为开发者提供在不同浏览器上调试和优化网页的能力。 Firebug Lite是Firebug的轻量级版本,适用于不支持...
- IE的`onreadystatechange`事件在某些情况下处理方式与Firefox不同。 7. **定时器**: - `setTimeout`和`setInterval`在IE中可能存在精度问题,而Firefox通常更准确。 8. **错误处理**: - IE使用`try...catch...
ajax和xml,xslt的整合使用,调优版本,ie6和firefox2.0测试通过 <br>代码还没来得急整理,大家自己整理,顺便可以自己理解下. <br>原形是从网上抄,但我在firefox下怎么都不行, 所以自己修正了,这是修正后的版本
ajax初始化代码,ie8和Firefox 3.6测试通过
经测试,用此方法创建XMLHttpRequest对象,在运用AJAX的时候,可以的兼容IE6,IE7,IE8,Opera,Safari,Google Chrome,fireFox。主流的应该就这些吧?theWorld,遨游等浏览器都是以IE为核心的,所以肯定也没问题。 另外...
在现代Web开发中,文件上传是一个常见的功能,但要实现跨浏览器兼容性,尤其是在旧版本的Internet Explorer(如IE6、IE7、IE8、IE9)以及Firefox、Chrome和世界之窗等其他浏览器上,可能面临一些挑战。Ajax上传文件...
"支持Firefox和IE浏览器的纯js日历控件"是一个旨在兼容两种主流浏览器(Firefox和Internet Explorer)的JavaScript库,其设计灵感来源于AJAX自带的日历控件。在AJAX技术中,日历控件通常通过异步交互提供无刷新的...
IE的开发者工具可以通过F12快捷键打开,提供了类似于Firefox和Chrome的调试功能,包括DOM查看、网络请求和脚本调试。对于PHP调试,由于IE本身并不支持Xdebug的直接集成,你需要依赖第三方工具,如Visual Studio或...
本资源提供了一个利用Ajax实现增删改查、分页和级联功能的代码示例,适用于各种主流浏览器,包括IE、Firefox和Opera。 增删改查是数据库操作的基本功能,对应于数据库中的INSERT、DELETE、UPDATE和SELECT操作。在...
JavaScript 和 CSS 在不同的浏览器之间可能存在兼容性问题,尤其是在 Internet Explorer (IE) 和 Mozilla Firefox 这两个浏览器中。本文将详细探讨这些差异,并提供相应的解决策略,以确保网站在各种浏览器中都能...
本文件“js在火狐和IE浏览器的差异.zip”着重讨论了JavaScript在Mozilla Firefox(火狐)与Internet Explorer(IE)之间的区别,以下是对这些差异的详细阐述: 1. **DOM操作差异**: - Firefox和IE对Document ...
### FireFox Chrome IE浏览器调试JavaScript #### 一、Firebug简介 Firebug是一款专为Firefox浏览器设计的强大开发插件,自推出以来便受到广大Web开发者的喜爱与推崇。随着Web技术的发展,对Web开发人员的要求...
在Firefox浏览器中,Firebug是一款非常知名的JavaScript调试神器,它提供了丰富的功能,如查看和编辑HTML、CSS以及JavaScript代码,跟踪网络请求,性能分析等。然而,当我们在使用Internet Explorer(IE)浏览器时,...