一、问题:
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通用
<br/><br/><br/>本文来自<a href="http://www.code-design.cn">编程设计网</a>,转载请标明出处:<a href="http://www.code-design.cn/blogdetail267.html">http://www.code-design.cn/blogdetail267.html</a>
分享到:
相关推荐
然而,在Firefox 3中,可能由于浏览器的实现差异或者特定的兼容性问题,`onreadystatechange`事件的触发并不如其他浏览器那么可靠。这可能给开发者带来困扰,因为开发者依赖这个事件来更新UI或者处理错误。 针对这...
在Firefox浏览器中,AJAX(异步JavaScript和XML)的`onreadystatechange`事件处理与Internet Explorer(IE)存在一些差异,这些差异可能会导致在处理服务器响应时遇到问题。`onreadystatechange`是AJAX请求的核心...
接下来,我们将深入分析如何使Firefox和Google Chrome等浏览器支持Ajax,以及具体的实现细节。 ### Ajax的工作原理 Ajax的核心是`XMLHttpRequest`对象,它允许JavaScript在后台与服务器通信,从而获取或发送数据。...
然而,由于浏览器之间的差异,尤其是IE(Internet Explorer)与Firefox(Firefox)对Ajax的支持不尽相同,开发者常常会遇到兼容性问题。这篇博文主要探讨了如何解决Ajax在IE和Firefox上的兼容性问题。 首先,让我们...
在本案例中,我们讨论的主题是如何利用AJAX(异步JavaScript和XML)技术来实现在网页上对图片进行拖放操作,同时兼容IE和Firefox两种主流浏览器。 首先,我们需要了解AJAX的基本概念。AJAX是一种在不重新加载整个...
- IE的`onreadystatechange`事件在某些情况下处理方式与Firefox不同。 7. **定时器**: - `setTimeout`和`setInterval`在IE中可能存在精度问题,而Firefox通常更准确。 8. **错误处理**: - IE使用`try...catch...
但是令人头痛的是 Firefox 的标准总是和 IE 有着各种各样的不同,由于 FF 不支持 `defer`,所以使得开发者不得不另辟蹊径来解决这个问题。 实际上,我们可以在 Ajax 返回数据并 `innerHTML` 到模板之前先把 `<div>`...
首先,Ajax(Asynchronous JavaScript and XML)是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。它的核心是JavaScript的XMLHttpRequest对象,它允许JavaScript在后台与服务器交换数据并更新部分网页...
if (window.XMLHttpRequest) { // Firefox, Chrome, IE7+, Safari xhr = new XMLHttpRequest(); } else { // IE6, IE5 xhr = new ActiveXObject("Microsoft.XMLHTTP"); } xhr.onreadystatechange = function...
- **兼容性问题**:Internet Explorer使用ActiveXObject,而Firefox、Opera 8.0+、Safari等其他浏览器则使用内置的XMLHttpRequest对象。因此,编写Ajax代码时,通常需要编写兼容性代码,确保在各种浏览器中都能正常...
// Firefox, Safari, Chrome, Opera, etc. http_request = new XMLHttpRequest(); } else if (window.ActiveXObject) { // Internet Explorer http_request = new ActiveXObject("Microsoft.XMLHTTP"); } ``` ...
在标签中提到的“源码”和“工具”,可能是指在解决Ajax中文问题时,需要查看和分析服务器端的源代码,以及可能使用到的调试工具,如Chrome开发者工具、Firefox的Web Console等,这些工具可以帮助我们跟踪网络请求,...
该对象存在于所有主流浏览器中,包括IE5.5+、Firefox1.0+、Safari等。 - **方法**: - `void open(String method, String url, Boolean async)`:初始化一个HTTP请求。 - `void send(String body)`:发送请求体。 ...
所有现代浏览器(IE7+,Firefox,Chrome,Safari,Opera等)都内置了此对象。 2. 发起HTTP请求:通过XMLHttpRequest对象的open()方法设置请求类型(GET或POST),URL和是否异步执行。然后用send()方法发送请求。 3...
1. **创建XMLHttpRequest对象**:所有现代浏览器(IE7+、Firefox、Chrome、Safari、Opera等)都内置了XMLHttpRequest对象,它是Ajax的核心,用于与服务器进行通信。 2. **打开连接**:调用XMLHttpRequest对象的`...
在IE中,创建XMLHttpRequest对象通常使用`new ActiveXObject("Microsoft.XMLHTTP")`,而在Firefox及其他非IE浏览器中,使用`new XMLHttpRequest()`。 10. **AJAX的优缺点**: 优点:提高用户体验,减少网络流量,...
但需要注意,E4X不是所有浏览器都支持,主要在Firefox中使用。 3. Ajax中的数据交换: - 使用XML:在早期的Ajax应用中,XML常作为数据交换格式,可以通过XMLHttpRequest的responseXML属性获取XML数据,然后使用DOM...
本文主要探讨的是IE(Internet Explorer)与火狐(Firefox)这两种浏览器在JavaScript编程中所遇到的一些常见兼容性问题,并提出相应的解决方案。 #### 二、关键兼容性问题及解决方法 ##### 1. 获取DOM元素的方式 ...