`

Ajax使用过程中常见问题汇总(转载)

 
阅读更多

在看文章前,先指定一个通用的变量xhr,xhr代码ajax对象。测试浏览器:ie为ie6,firefox为2,其他的未测试。统称ie6为ie,firefox2为ff。

最经典的就是ie下的缓存问题了

如果使用的是get,那么在ie下出现缓存问题。导致代码只执行一次。解决办法就是加时间戳或者随机数,使url变为唯一,这样就不会出现ie下的缓存问题了,或者改为post提交。

xhr.open("get","xxxx.aspx?_dc="+new Date().getTime(),true);  

 

ajax对象属性的大小写问题

在w3c浏览器,如ff中,对大小写是敏感。如 if(xhr.readystate==4)这种写法,在ie下是成立的,但是在ff下就行不通了,因为ie不区分大小写,ff是区分大小的。 标准写法为if(xhr.readyState==4),同理还有属性 responseText,responseXML。

ajax状态0问题

有些时候在测试 ajax 代码的时候,加了 xhr.status==200 的判断后,一直不执行 xhr.status==200 的代码,这个就需要注意了。xhr.status==200 是要通过服务器来浏览,并且服务器页面没有发生错误或者转向时才返回200状态的,此状态和你通过浏览器访问页面时服务器定义的状态一致。

直接拖进浏览器浏览结果或者双击运行html页面的,未发生错误时,此时的xhr.status是0,不是200。

所以可以多加一个xhr.status==0的判断。如下:

if(xhr.status==200||xhr.status==0){
  	alert('ok');
}

 

直接拖进浏览器浏览结果或者双击运行html页面时,又出现一个问题,如果请求的是xml文件,那想当然的是使用responseXML属性返回xmlDom了,但是在ie返回不了xmlDom属性,解决办法如何呢,看下面的responseXML问题。

responseXML问题

要使用responseXML属性,请求的是xml文件或者设置了响应头为"text/xml"的动态页面了。要注意如果请求的是动态页面,一定不要忘记设置contenttype为"text/xml"!!!!!!!!切记~~~~~~

asp为        response.contenttype="text/html" 
asp.net为    Response.ContentType="text/html"; 
php为        header("content-type:text/xml;");   

 

在ie下有个问题,直接拖进浏览器浏览或者双击运行html预览效果时,请求的即使是xml文件,使用responseXML返回不了xmldom。 大家测试下就知道了,如下:

showbo.xml

<?xml version="1.0" encoding="utf-8"?>
<showbo>
 <item>1</item>
 <item>2</item>
 <item>3</item>
 <item>4</item>
</showbo>

  test.html

function getajax(){
  if(window.XMLHttpRequest)return new XMLHttpRequest();
  else if(window.ActiveXObject)return new ActiveXObject("microsoft.xmlhttp");
}
var xhr=getajax();
xhr.onreadystatechange=function(){
  if(xhr.readyState==4){
    if(xhr.status==200||xhr.status==0){
      var doc=xhr.responseXML,item=doc.getElementsByTagName("item");
      alert(item.length);//在ie输出为0,在ff下为4。似乎在ie下未生成xml的树结构,具体原因要问ms了。。
    }
    else alert('发生错误\n\n'+xhr.status);
  }
}
xhr.open("get","showbo.xml?_dc="+new Date().getTime(),true);
xhr.send(null);

 解决办法就是使用microsoft.xmldom对象重新建立xml的树结构,如下

xhr.onreadystatechange=function(){
  if(xhr.readyState==4){
    if(xhr.status==200||xhr.status==0){
      var doc=xhr.responseXML;
if(document.all&&xhr.status==0){
//为ie并且直接托进浏览器的时重构xml的树结构
        doc=new ActiveXObject("microsoft.xmldom");
        doc.loadXML(xhr.responseText);
        doc=doc.documentElement;
      }
      var item=doc.getElementsByTagName("item");
      alert(item.length);//
 }
    else alert('发生错误\n\n'+xhr.status);
  }
}

 

为post提交时需要注意的

如果为post提交时,注意要设置content-type为"application/x-www-form-urlencoded",这样在动态页才可以使用request/request.form/request.querystring对象通过键获取值,否则得使用2进制数据,然后自己分析2进制数据生成字符串对象,使用正则什么的获取对应的值。

需要在open以后才能使用xhr.setRequestHeader方法,否则出错。

xhr.open("post","xxxx.aspx",true);
xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");//这里。。。。

 

跨域的问题

如果请求的页面不是当前站点的,那就跨域了,最好的解决方案就是服务器端的xhr请求

不久前放出的一个使用alexa,google的api获取alexa排名和google pr,分别使用了客户端和服务器端的xhr请求 中就是使用了服务器端的xhr请求,应为请求的是Google和alexa的页面,所以跨域了,需要使用服务器端的xhr请求。

乱码问题

对于ajax应用来说,乱码也是一个经常出现的问题。

meta声明的charset要和请求的页面返回的charset一致。最好在请求的页面中再设置下输出编码。

asp: response.charset="gb2312或者utf-8" 
asp.net: response.charset="gb2312或者utf-8" 
php: header("charset=gb2312或者utf-8") 

 文件物理存储编码要和meta声明的编码要一致。如meta指定为gb2312,则物理存储编码为ansi。如果为utf-8,则要存储为utf-8编码。 对于asp,如果指定编码为utf-8,记得还要设置

 

 

Session.CodePage=65001
Response.CharSet="utf-8"  

 

因为asp在国内服务器默认处理编码为gb2312

同步问题

问题描述如下,问题来自http://topic.csdn.net/u/20090630/16/d4d07596-65da-430c-8e89-cae60e25e03c.html,精简了下创建ajax的代码

function callServerByPost(url,data,fun) { 
        var http_request=null;     
        if (window.ActiveXObject)http_request = new ActiveXObject("Microsoft.XMLHTTP");  
        }else if (window.XMLHttpRequest)  http_request = new XMLHttpRequest(); 
        if (!http_request) { 
            alert('Giving up :Cannot create an XMLHTTP instance'); 
            return false; 
        }  
        http_request.onreadystatechange = fun;  
        http_request.open("POST", url, true); 
        http_request.setrequestheader("Content-length",data.length); 
        http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 
  
    http_request.send(data);//传送资料 
} 
function ajax_post(url,data) { 
    url=url+"?t="+new Date(); 
    callServerByPost(url,data,function fns(){         
        if(http_request.readyState == 4) {      
            if (http_request.status == 200) { 
                return http_request.responseText;//在这里明明调试时http_request.responseText已经有值但是在外边却接收不到 
              } else { 
              alert("你请求数据有错"); 
              } 
        } 
});    
} 
function getData(){ 
   var url="ajax_server.aspx"; 
   var data="name=ljp&pwd=ljp"; 
   var t=ajax_post(url,data); 
   alert(t);//在这里弹出undefined =============================
} 

为什么会出现这个问题呢??因为在执行getData中的代码var t=ajax_post(url,data);时,由于指定了异步,所以callServerByPost中的 http_request.send(data);//传送资料 这句话并不会中断其他js代码的执行,所以会继续执行getData中的下一句代码,就是alert(t),所以会出现undefined。

其实呢并不仅是ajax异步导致出现undefined的问题。认真看下代码var t=ajax_post(url,data);,t变量是接受的是ajax_post的返回值,但是ajax_post函数中并未使用return 返回任何值,所以默认是返回undefined。

你会说我这里不是使用了return http_request.responseText;//在这里明明调试时http_request.responseText已经有值但是在外边却接收不到返回了吗?大家看清楚了,那个是状态转换函数,你返回任何值是没有意义的,他只是处理ajax的状态,你返回值给谁用的呢?如何解决这个问题呢?一种是改为同步发送,一种就是为异步时使用全局变量来接受ajax的返回值,在状态转换函数中给全局变量赋值。

使用异步+全局变量时要注意的是在ajax未返回前千万不用使用全局变量,要不还是undefined。 下面给出同步的解决办法。异步+全局变量的解决方法看这篇文章

 

function callServerByPost(url,data,fun) { 
        var http_request=null;     
        if (window.ActiveXObject)http_request = new ActiveXObject("Microsoft.XMLHTTP");  
        }else if (window.XMLHttpRequest)  http_request = new XMLHttpRequest(); 
        if (!http_request) { 
            alert('Giving up :Cannot create an XMLHTTP instance'); 
            return false; 
        }  
       // http_request.onreadystatechange = fun;  //为同步时不再需要处理函数了。。。。。。。
        http_request.open("POST", url, false);//改为同步 
        http_request.setrequestheader("Content-length",data.length); 
        http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 
  
    http_request.send(data);//传送资料
return http_request.responseText;//同步时可以直接返回,因为会阻止其他的代码执行
} 
function ajax_post(url,data) { 
    url=url+"?t="+new Date(); 
    return callServerByPost(url,data,null);//不需要传递回调,并且直接返回callServerByPost的返回值
   
} 
function getData(){ 
   var url="ajax_server.aspx"; 
   var data="name=ljp&pwd=ljp"; 
   var t=ajax_post(url,data); 
   alert(t);//这里就不会输出undefined了。。。。。。。。。。。。,不过如果网路慢的话,浏览器就假死了。。
}

  最后放自己写的ajax对象应用池程序

String.prototype.trim=function(){return this.replace(/$\s*|\s*$/g,'');}
var Showbo={author:'showbo'};
//获取json对象
Showbo.getJson=function(v){if(typeof(v)=='string')return eval('('+v+')');else return v;}
//根据id获取对象
Showbo.$=function(Id){if('object'==typeof(Id))return Id;else if('string'==typeof(Id))return document.getElementById(Id);else return null;}
Showbo.IsIE=!!document.all;
//扩展IE下的XMLHttpRequest
if(Showbo.IsIE)window.XMLHttpRequest=function(){
  var acX=['msxml2.xmlhttp.5.0','msxml2.xmlhttp.4.0','msxml2.xmlhttp.3.0','msxml2.xmlhttp','microsoft.xmlhttp'],Xhr;
  for(var i=0;itry{Xhr=new ActiveXObject(acX[i]);return Xhr;}catch(e){}
  return false;
}
//ajax应用池
Showbo.Ajax={
  pools:[]//存储ajax对象的数组
  ,getObject:function(){//从数组中获取ajax对象,如果未返回则新建一个ajax对象
    for(var i=0;i<this.pools.length;i++)
      if(this.pools[i].readyState==0||this.pools[i].readyState==4)return this.pools[i];
      this.pools[this.pools.length]=new XMLHttpRequest();
      return this.pools[this.pools.length-1];
  }
  ,send:function(cfg){/*cfg示例  
    {
     url:'请求的页面'
    ,params:'键值对,注意不是json对象'
    ,method:'post/get,如果为指定则默认为get'
    ,success:成功时的回调函数
    ,failure:失败时的回调函数
    ,otherParams:提供给回调函数的其他参数,可以为json对象
    }
    
    成功或者失败的回调函数参数为  (当前的xhr对象,配置文件的中的otherParams)
    */
    if(!cfg||!cfg.url)throw("未设置配置文件!");
    var method=cfg.method,asy="boolean"==typeof(cfg.asy)?cfg.asy:true;
    if(!method||method!="post")method="get";
    if(method.toLocaleLowerCase()=='get'){
      var _dc=new Date().getTime();//加时间戳防止ie浏览器下的缓存
      cfg.params=cfg.params?cfg.params+'&_dc='+_dc:'_dc='+_dc;
      if(cfg.url.indexOf("?")!=-1)cfg.url+="&"+cfg.params;
      else cfg.url+="?"+cfg.params;cfg.params=null;
    }
    else if(!cfg.params)cfg.params='';
    var o=this.getObject();
    if(!o)throw("未能创建ajax对象!");
    o.open(method,cfg.url,asy);
    if(method.toLocaleLowerCase()=='post')o.setRequestHeader("content-type","application/x-www-form-urlencoded");
    o.send(cfg.params);
    o.onreadystatechange=function(){
      if(o.readyState==4){
        if(o.status==200||o.status==0){
          if("function"==typeof(cfg.success))cfg.success(o,cfg.otherParams);
        }
        else if("function"==typeof(cfg.failure))cfg.failure(o,cfg.otherParams);
      }
    }
  }
}

 

分享到:
评论

相关推荐

    AJAX常见面试问题

    在本文中,我们将详细讨论 AJAX 面试中常见的问题和解决方案。 1.Ajax 的基础知识 在工作中,我们经常需要和后台交互,这时我们需要使用 Ajax 将数据发送到服务器端。在使用 Ajax 时,我们需要了解其基本参数,...

    Ajax 程序开发中常见问题

    6. 在动态页面中使用Ajax时,如果缓存了客户端网页,可能会导致Ajax不运行。为了解决这个问题,可以采取措施确保动态页不会被客户端缓存。例如,在动态页输出之前,可以设置不缓存的HTTP头部指令,或者在请求URL中...

    各种版本ajax使用方法及相关问题

    此外,跨域、缓存、安全、状态管理等问题也是Ajax开发中常见的挑战。正确设置请求头(如`Access-Control-Allow-Origin`),理解并使用缓存策略(如`cache: false`),以及妥善处理异步操作的顺序,都是确保Ajax成功...

    AJAX开发中常见的三种问题

    在AJAX(Asynchronous JavaScript and XML)开发过程中,开发者可能会遇到各种挑战和问题。这篇博客主要探讨了AJAX开发中的三种常见问题,并提供了解决方案。以下是对这些关键知识点的详细解析: 1. **跨域问题**:...

    Ajax请求过程中显示“进度”的简单实现

    Ajax在Web应用中使用得越来越频繁。在进行Ajax调用过程中一般都具有这样的做法:显示一个GIF图片动画表明后台正在工作,同时阻止用户操作本页面(比如Ajax请求通过某个按钮触发,用户不能频繁点击该按钮产生多个并发...

    .net中ajax.net中使用方法

    本文将详细介绍在.NET中使用AJAX.NET进行开发的相关知识点。 首先,了解基础概念: 1. **AJAX**:AJAX不是一种编程语言,而是一种使用现有技术(如JavaScript、XML、HTML、CSS和HTTP)的综合技术,用于创建异步Web...

    使用ajax可以传中文参数

    在Web开发过程中,经常需要通过Ajax进行异步请求来实现页面的部分更新或数据交互功能。当涉及到中文等非ASCII字符时,可能会遇到一个常见的问题:中文参数在服务器端显示为乱码。本文将详细介绍如何通过正确的配置...

    纯ajax实现过程

    纯ajax实现过程纯

    jquery+asp ajax 中文乱码问题解决文档

    通过以上两步,使得从前端到后端、再到返回前端的整个过程中的字符编码保持一致,从而有效避免乱码问题。 #### 解决方案二:修改jQuery源代码支持GB2312 对于那些仍然希望使用GB2312编码的场景,可以通过修改...

    Ajax(Ajax使用js包)

    使用Ajax实现从服务器读取数据,包括Ajax实现的详细步骤

    Ajax常见面试题Ajax常见面试题

    ### Ajax常见面试题详解 #### 1. AJAX应用与传统Web应用有何不同? 在传统的JavaScript编程中,要获取服务器端数据库或文件上的信息,或发送客户端信息到服务器,通常需要建立一个HTML表单(form),并通过GET或...

    AjaxRequest(Ajax使用包)

    **AjaxRequest(Ajax使用包)** Ajax,全称Asynchronous JavaScript and XML(异步JavaScript和XML),是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。AjaxRequest是实现Ajax功能的一个工具包,它...

    ajax使用简单demo

    - **跨域问题**:出于安全考虑,浏览器限制了Ajax的跨域请求,除非服务器允许跨域(CORS策略)。 - **浏览器兼容性**:不同浏览器对XMLHttpRequest的支持程度不同,需要使用polyfill(如jQuery的$.ajax)来确保兼容...

    SpringBoot+SpringSecurity处理Ajax登录请求问题(推荐)

    SpringBoot+SpringSecurity处理Ajax登录请求问题是SpringBoot开发中的一個常见问题,本文将详细介绍如何使用SpringBoot+SpringSecurity处理Ajax登录请求问题。 知识点1:SpringBoot+SpringSecurity框架简介 ...

    ajax的详细使用

    在"ajax-demo"这个压缩包中,提供了三个示例来展示Ajax的常见应用场景。 1. **获取时间示例** 这个例子展示了如何使用Ajax获取服务器上的当前时间,并实时更新到网页上。用户可以看到时间每隔几秒就会自动更新,而...

    ajax中文参数乱码问题解决方法

    主要解决在ajax中中文参数传递过程中,服务器接收到中文乱码的问题

    ajax面试题ajax面试题

    关于Ajax的常见面试题 1,Ajax和javascript的区别? javascript是一种在浏览器端执行的脚本语言,Ajax是一种创建交互式网页应用的开发技术 ,它是利用了一系列相关的技术其中就包括javascript。 Javascript是由...

    Jquery Ajax 存储过程分页

    在IT行业中,网页开发经常会遇到数据分页的问题,特别是在处理大量数据时,为了提高用户体验,分页成为必不可少的功能。...这个过程涉及前端交互设计、后端数据库操作以及服务器端编程,是Web开发中的常见实践。

    AJAX安装包(VS中使用)

    AJAX请求通常受到同源策略限制,但在开发过程中可能需要跨域请求,这时可以使用JSONP(JSON with Padding)或者CORS(Cross-Origin Resource Sharing)来解决。 8. **错误处理** 在开发AJAX应用时,需要考虑异常...

    Ajax中文乱码问题解决方法

    在IT行业中,Ajax(Asynchronous JavaScript and XML)技术被广泛应用于网页的异步数据交互,以实现无需刷新页面即可更新内容的功能。...在实际开发过程中,良好的编码规范和测试实践也是防止乱码问题的重要手段。

Global site tag (gtag.js) - Google Analytics