Ajax的使用

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面,而AJAX 最大的优点是在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。ajax是基于XMLHttpRequest 对象实现的。

1、创建XMLHttpRequest 对象

if (window.XMLHttpRequest){
    var xmlhttp = new XMLHttpRequest();     //其他浏览器
}else{
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");   // IE6, IE5 浏览器执行代码,IE6、IE5不支持XMLHttpRequest()方法
}

2、向服务器发送请求

使用 XMLHttpRequest 对象的 open() 和 send() 方法来将请求发送到服务器

xmlhttp.open(type, url, boolean);  //type:请求的类型,GET或者POST,值为字符串;  url:请求地址,值为字符串;  boolean:true表示异步请求,false表示同步请求
xmlhttp.send();   // xmlhttp.send(str); 用于post方法中

2.1、异步和同步请求:

当使用同步请求(即open函数的第三个参数为false)时,JavaScript 会等到服务器响应了才能继续执行。如果服务器繁忙或缓慢,应用程序会挂起或停止处于假死状态。

当使用异步请求(即open函数的第三个参数为true)时,JavaScript 无需等到服务器响应后面的脚本代码也能继续执行。

如果要用于 AJAX 的话,必须设为异步请求。在onreadystatechange 事件中监听响应状态并判断是否就绪以对响应数据进行处理。如果使用同步请求就不要编写 onreadystatechange 函数,直接把代码放到 send() 语句后面即可因为不用监听只能等到响应就绪才能继续执行代码

2.2、用 post 或者 get 的场景:

GET请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给WEB服务器。

(1)发送大量数据时使用POST方法:POST 没有数据量限制,而GET方法有限制

(2)GET方式请求的数据会被浏览器缓存起来,如果同样的GET请求再次发出,浏览器就会显示缓冲的结果而不是重新运行整个请求,此时使用GET方法比较快速,但其他人也可以从浏览器的历史记录中读取到这些数据,因此有严重的安全问题

(3)传输密码等重要信息使用POST方法:由于GET方法传输参数在URL上,别人也可以看到,而且GET方法会将返回结果缓存在浏览器中,因此不安全

(4)当服务器通过请求的参数无其它副行为(如只进行搜索)时,使用GET方法,当通过请求的参数有其它副行为(如更新服务器上的文件或数据库、添加数据行等)时,使用POST方法。

2.3、GET发送请求的方式

最简单的:

xhttp.open("GET", "demo_get.asp", true);
xhttp.send();

加上参数的情况:

xmlhttp.open("GET","demo_get2.php?fname=Henry&lname=Ford",true);   //在 ? 后面添加参数,以键值对形式添加,每个参数以 & 符号隔开
xmlhttp.send();

但是以上都有可能只是获得浏览器缓存的数据,要想避免这种情况,应保证每次请求的URL都是不一样的,我们可以添加一个无关紧要的参数

xmlhttp.open("GET","demo_get2.php?fname=Henry&lname=Ford&t=" + new Date().getTime(),true);  
xmlhttp.send();

2.4、POST发送请求的方式

最简单的:

xmlhttp.open("POST","/try/ajax/demo_post.php",true);
xmlhttp.send();

加上参数:

xmlhttp.open("POST","/try/ajax/demo_post2.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");  //设置请求头  setRequestHeader(header,value)  header: 请求头的名称,这里的Content-type表示传送给服务器的数据类型    value:请求头的值  
xmlhttp.send("fname=Henry&lname=Ford");   //POST方法加参数应在send()方法里添加

xmlObj.setRequestHeader() 方法用来设置请求头,有时候并不是必须要的,这得看后端的要求,需要什么类型的请求头一般也是后端提出要求。ContentType 默认为text/html,表单数据默认为application/x-www-form-urlencoded。

如果是使用 get 请求,传参与Content-Type无关,无需设置。当使用是post请求时,如果数据是由from表单提交,此时就必须把content-Type设为application/x-www-form-urlencoded(也可以不指定content-Type),否则后台是无法接收到数据的。

(1)Content-type:application/x-www-form-urlencoded:默认的。如果不指定content-type,默认使用此格式。参数格式:key1=value1&key2=value2

(2)Content-type:application/json:参数为json格式 

(3)Content-type:multipart/form-data:上传文件用这个

3、监听服务器响应

当请求被发送到服务器时,用 onreadystatechange 事件来监听服务器的响应。每当 XMLHttpRequest 对象的属性 readyState 发生改变时,onreadystatechange 事件就会触发,readyState 属性存有 XMLHttpRequest 的状态信息。

3.1、XMLHttpRequest 对象的三个属性

0 (未初始化)
对象已建立,但是尚未初始化(尚未调用open方法)
1 (初始化)
已调用send()方法,正在发送请求
2 (发送数据)
send方法调用完成,但是当前的状态及http头未知
3 (数据传送中)
已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误,
4 (完成)
数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据

当 readyState 等于 4 且状态 status 为 200 时,此时响应已就绪

xmlhttp.onreadystatechange = function(){
  if (xmlhttp.readyState==4 && xmlhttp.status==200){
    ...
  }
}

通常可以把 Ajax 任务封装为一个函数,然后该函数可以作为回调函数存在,这样就不会引起程序停滞。

4、获取服务器响应的数据

通过 XMLHttpRequest 对象的 responseText 或 responseXML 属性来获取服务器的响应数据。

如果来自服务器的响应不是 XML,就使用 responseText 属性来获取数据,responseText 属性返回字符串形式的响应。

xmlhttp.onreadystatechange = function () {
  if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
  }
}

如果来自服务器的响应是 XML,那就使用 responseXML 属性,对 XML 对象进行解析。

XML文件示例:

<CATALOG>
  <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
  </CD>
  <CD>
    <TITLE>Hide your heart</TITLE>
    <ARTIST>Bonnie Tyler</ARTIST>
    <COUNTRY>UK</COUNTRY>
  </CD>
</CATALOG>
xmlhttp.onreadystatechange = function () {
  if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    xmlDoc = xmlhttp.responseXML;
    txt = "";
    x = xmlDoc.getElementsByTagName("ARTIST");
    for (i = 0; i < x.length; i++) {
      txt = txt + x[i].childNodes[0].nodeValue + "<br>";
    }
    document.getElementById("myDiv").innerHTML = txt;
  }
}

5、ajax代码实例

var xmlhttp;
if (window.XMLHttpRequest) {
  //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
  xmlhttp = new XMLHttpRequest();
} else {
  // IE6, IE5 浏览器执行代码
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function () {
  if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
  }
}
xmlhttp.open("GET", "/try/ajax/ajax_info.txt", true);
xmlhttp.send();
原文地址:https://www.cnblogs.com/wenxuehai/p/10349535.html