当前位置: 游戏平台 > 互联网科技 > 正文

javascript 实现原生ajax的几种方法

时间:2019-11-23 17:14来源:互联网科技
基本的============================================ 1,最经典的就是ie下的缓存问题了。 如果使用的是get,那么在ie下出现缓存问题。导致代码只执行一次。解决办法就是加时间戳或者随机数,使

基本的============================================
1,最经典的就是ie下的缓存问题了。
如果使用的是get,那么在ie下出现缓存问题。导致代码只执行一次。解决办法就是加时间戳或者随机数,使url变为唯一,这样就不会出现ie
下的缓存问题了,或者改为post提交。
xhr.open("get","xxxx.aspx?_dc="+new Date().getTime(),true);

ajax原生态的写法现在己经很少见了,大家都是直接使用jquery的ajax,因为jquery提供了大量的ajax方法,使用简单方便快捷了,下面我还是给各位提供一些ajax原生态写法。

2,ajax对象属性的大小写问题 在w3c浏览器,如ff中,对大小写是敏感。如
if(xhr.readystate==4)这种写法,在ie下是成立的,但是在ff下就行不通了,因为ie不区分大小写,ff是区分大小的。
标准写法为if(xhr.readyState==4),同理还有属性 responseText,responseXML,status。
还有状态转换函数xhr.onreadystatechange,要注意全部为小写

自从javascript有了各种框架之后,比如jquery,使用ajax已经变的相当简单了。但有时候为了追求简洁,可能项目中不需要加载jquery这种庞大的js插件。但又要使用到ajax这种功能该如何办呢?下面和大家分享几种利用javascript实现原生ajax的方法。

3,ajax状态0问题
有些时候在测试ajax代码的时候,加了 xhr.status==200的判断后,一直不执行xhr.status==200的代码,这个就需要注意了。
xhr.status==200是要通过服务器来浏览,并且服务器页面没有发生错误或者转向时才返回200状态的,此状态和你通过浏览器访问页面时服务器定义的状态一致。
直接拖进浏览器浏览结果或者双击运行html页面的,未发生错误时,此时的xhr.status是0,不是200。
所以可以多加一个xhr.status==0的判断。如下

 实现ajax之前必须要创建一个 XMLHttpRequest 对象。如果不支持创建该对象的浏览器,则需要创建 ActiveXObject,具体方法如下:

复制代码 代码如下:

 

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

 代码如下

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

复制代码

复制代码 代码如下:

var xmlHttp;
function createxmlHttpRequest() {
if (window.ActiveXObject) {
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
    xmlHttp=new XMLHttpRequest();

<showbo>
<item>1item>
<item>2item>
<item>3item>
<item>4item>
</showbo>

 

test.html

(1)下面使用上面创建的xmlHttp实现最简单的ajax get请求:

复制代码 代码如下:

 

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('发生错误nn'+xhr.status);
}
}
xhr.open("get","showbo.xml?_dc="+new Date().getTime(),true);
xhr.send(null);

 代码如下

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

复制代码

复制代码 代码如下:

function doGet(url){
    // 注意在传参数值的时候最好使用encodeURI处理一下,以防出现乱码
    createxmlHttpRequest();
    xmlHttp.open("GET",url);
    xmlHttp.send(null);
    xmlHttp.onreadystatechange = function() {
        if ((xmlHttp.readyState == 4) && (xmlHttp.status == 200)) {
            alert('success');
        } else {
            alert('fail');
        }
    }

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('发生错误nn'+xhr.status);
}
}

(2)使用上面创建的xmlHttp实现最简单的ajax post请求:

5,为post提交时需要注意的。
1)如果为post提交时,注意要设置content-type为"application/x-www-form-urlencoded",这样在动态页才可以使用request/request.form/request.querystring对象通过键获取值,否则得使用2进制数据,然后自己分析2进制数据生成字符串对象,使用正则什么的获取对应的值。
2)需要在open以后才能使用xhr.setRequestHeader方法,否则出错。
xhr.open("post","xxxx.aspx",true);
xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");//这里。。。。
6.还有一个问题忘记总结了,跨域的问题
如果请求的页面不是当前站点的,那就跨域了,最好的解决方案就是服务器端的xhr请求
可以参考下面的的解决方案
AJAX跨域问题解决办法
不久前放出的一个
使用alexa,google的api获取alexa排名和google pr,分别使用了客户端和服务器端的xhr请求
中就是使用了服务器端的xhr请求,应为请求的是Google和alexa的页面,所以跨域了,需要使用服务器端的xhr请求。
乱码问题============================================
对于ajax应用来说,乱码也是一个经常出现的问题。
1)meta声明的charset要和请求的页面返回的charset一致。最好在请求的页面中再设置下输出编码。
asp: response.charset="gb2312或者utf-8"
asp.net: response.charset="gb2312或者utf-8"
php: header("charset=gb2312或者utf-8")
2)文件物理存储编码要和meta声明的编码要一致。如meta指定为gb2312,则物理存储编码为ansi。如果为utf-8,则要存储为utf-8编码。
对于asp,如果指定编码为utf-8,记得还要设置
<%@language="vbscript" codepage="65001"%>

 

编辑:互联网科技 本文来源:javascript 实现原生ajax的几种方法

关键词: