第一张图尤其说明了传统Web 应用程序的结构与采用了 AJAX 技术的 Web应用程序的结构上的差别
主要的差别,其实不是 JavaScript,不是 HTML/XHTML和 CSS,而是采用了 XMLHttpRequest 来向服务器异步的请求 XML 数据
再来看第二张图,传统的 Web 应用模式,用户的体验是割裂的,点击->等待->看到新的页面->再点击->再等待。而采用了AJAX技术之后,大部分的计算工作,都是在用户不察觉的情况下,交由服务器去完成了
二、创建ajax的步骤
Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。原生创建ajax可分为以下四步
1、创建XMLHttpRequest对象
Ajax的核心是XMLHttpRequest对象,它是Ajax实现的关键,发送异步请求、接受响应以及执行回调都是通过它来完成
所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象。
创建 XMLHttpRequest对象的语法:
var xhr = new XMLHttpRequest();老版本的 Internet Explorer(IE5 和 IE6)使用ActiveX 对象:
var xhr = new ActiveXObject("Microsoft.XMLHTTP");为了应对所有的现代浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest对象。如果支持,则创建XMLHttpRequest对象。如果不支持,则创建ActiveXObject:
function createRequest (){ try { xhr = new XMLHttpRequest(); }catch (tryMS){ try { xhr = new ActiveXObject("Msxm12.XMLHTTP"); } catch (otherMS) { try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); }catch (failed) { xhr = null; } } } return xhr;}2、准备请求
xhr.open(method,url,async);第一个参数表示请求类型的字符串,其值可以是GET或者POST。
xhr.open("GET",demo.php?name=tsrot&age=24,true);POST请求:
xhr.open("POST",demo.php,true);第二个参数是要作为请求发送目标的URL。
xhr.send();一般情况下,使用Ajax提交的参数多是些简单的字符串,可以直接使用GET方法将要提交的参数写到open方法的url参数中,此时send方法的参数为null或为空。
xhr.open("GET",demo.php?name=tsrot&age=24,true);xhr.send(null);POST请求:
setRequestHeader()
来添加 HTTP 头。然后在send()
方法中规定您希望发送的数据:xhr.open("POST",demo.php,true);xhr.setRequestHeder("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");xhr.sen4、处理响应
xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ console.log(xhr.responseText); }}onreadystatechange :当处理过程发生变化的时候执行下面的函数
open()
)。send()
)。JSON.stringify
JSON.parse()
JSON.parse(xhr.responseText)
转化为JSON对象JSON.parse(xhr.responseText)
转化为JSON对象function example(responseText){var saleDiv= document.getElementById("sales");var sales = JSON.parse(responseText); for(var i=0;i<sales.length;i++){ var sale = sales[i]; var div = document.createElement("div"); div.setAttribute("class","salseItem"); div.innerHTML = sale.name + sale.sales; salseDiv.appendChild(div); }}
5、完整例子
var xhr = false; if(XMLHttpRequest){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject("Microsoft.XMLHTTP");};if(xhr) {//如果xhr创建失败,还是原来的false xhr.open("GET","./data.json",true); xhr.send(); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ console.log(JSON.parse(xhr.responseText).name); } }}data.json
{ "name":"tsrot", "age":24}这个过程是一定要记在脑子里的
function ajax(url, success, fail){ // 1. 创建连接 var xhr = null; xhr = new XMLHttpRequest() // 2. 连接服务器 xhr.open("get", url, true) // 3. 发送请求 xhr.send(null); // 4. 接受请求 xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ if(xhr.status == 200){ success(xhr.responseText); } else { // fail fail && fail(xhr.status); } } }}XMLHttpRequest 在异步请求远程数据时的工作流程
JSON.parse
把字符串转化成对象,使用jsonp时,script标志会解析并执行返回的代码,等我们处理数据时,已经是一个JavaScript对象了<meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <script type="text/javascript">function jsonpCallback(result) {alert(result.a);alert(result.b);alert(result.c);for(var i in result) {alert(i+":"+result[i]);//循环输出a:1,b:2,etc.}} </script> <script type="text/javascript" src="http://crossdomain.com/services.php?callback=jsonpCallback"></script> <!--callback参数指示生成JavaScript代码时要使用的函数jsonpcallback-->注意浏览器的缓存问题
//ajax请求后台数据var btn = document.getElementsByTagName("input")[0];btn.onclick = function(){ajax({//json格式 type:"post", url:"post.php", data:"username=poetries&pwd=123456", asyn:true, success:function(data){ document.write(data); } });}//封装ajaxfunction ajax(aJson){ var ajx = null; var type = aJson.type || "get"; var asyn = aJson.asyn || true; var url = aJson.url; // url 接收 传输位置 var success = aJson.success;// success 接收 传输完成后的回调函数 var data = aJson.data || "";// data 接收需要附带传输的数据if(window.XMLHttpRequest){//兼容处理 ajx = new XMLHttpRequest();//一般浏览器 }else { ajx = new ActiveXObject("Microsoft.XMLHTTP");//IE6+ } if (type == "get" && data) { url +="/?"+data+"&"+Math.random(); }//初始化ajax请求 ajx.open( type , url , asyn ); //规定传输数据的格式 ajx.setRequestHeader("content-type","application/x-www-form-urlencoded"); //发送ajax请求(包括post数据的传输) type == "get" ?ajx.send():ajx.send(aJson.data);//处理请求 ajx.onreadystatechange = function(aJson){if(ajx.readState == 4){if (ajx.status == 200 && ajx.status<300)//200是HTTP 请求成功的状态码 { //请求成功处理数据 success && success(ajx.responseText); }else{ alert("请求出错"+ajx.status);} }}jQuery中的Ajax的一些方法
$.ajax()
方法属于最底层的方法,第2层是load()
、$.get()
、$.post();
第3层是$.getScript()
、$.getJSON()
,第2层使用频率很高load()
方法是jquery中最简单和常用的ajax方法,能载入远程HTML代码并插入DOM中 结构为:load(url,[data],[callback])
load()
方法的传递方式根据参数data来自动指定,如果没有参数传递,则采用GET方式传递,反之,采用POST$("#testTest").load("test.html",function(responseText,textStatus,XMLHttpRequest){ //respnoseText 请求返回的内容 //textStatus 请求状态 :sucess、error、notmodified、timeout //XMLHttpRequest })load方法参数
参数名称 | 类型 | 说明 |
url | String | 请求HTML页面的URL地址 |
data(可选) | Object | 发送至服务器的key / value数据 |
callback(可选) | Function | 请求完成时的回调函数,无论是请求成功还是失败 |
load()
方法通常用来从web服务器上获取静态的数据文件。在项目中需要传递一些参数给服务器中的页面,那么可以使用$.get()
和$.post()
或$.ajax()
方法$.get()
和$.post()
方法是jquery中的全局函数$.get()
方法使用GET方式来进行异步请求$.get(url,[data],callback,type)
header("Content-Type:text/xml:charset=utf-8") //php
参数 | 类型 | 说明 |
url | String | 请求HTML页的地址 |
data(可选) | Object | 发送至服务器的key/ value 数据会作为QueryString附加到请求URL中 |
callback(可选) | Function | 载入成功的回调函数(只有当Response的返回状态是success才调用该方法) |
type(可选) | String | 服务器返回内容的格式,包括xml、html、script、json、text和_default |
$.get()
方法的结构和使用方式相同,有如下区别$_GET[]
获取;POST方式用$_POST[]
获取;两种方式都可用$_REQUEST[]
来获取load()
、$.get()
和$.post()
方法完成了一些常规的Ajax程序,如果还需要复杂的Ajax程序,就需要用到$.ajax()
方式$.ajax()
方法是jquery最底层的Ajax实现,它的结构为$.ajax(options)
$.ajax()
方式所需要的请求设置以及回调函等信息,参数以key / value存在,所有参数都是可选的参数 | 类型 | 说明 |
url | String | (默认为当前页地址)发送请求的地址 |
type | String | 请求方式(POST或GET)默认为GET |
timeout | Number | 设置请求超时时间(毫秒) |
dataType | String | 预期服务器返回的类型。可用的类型如下 xml:返回XML文档,可用jquery处理 html:返回纯文本的HTML信息,包含的script标签也会在插入DOM时执行 script:返回纯文本的javascript代码。不会自动缓存结果,除非设置cache参数。注意:在远程请求时,所有的POST请求都将转为GET请求 json:返回JSON数据 jsonp:JSONP格式,使用jsonp形式调用函数时,例如:myurl?call back=?,jquery将自动替换后一个?为正确的函数名,以执行回调函数 text:返回纯文本字符串 |
beforeSend | Function | 发送请求前可以修改XMLHttpRequest对象的函数,例如添加自定义HTTP头。在beforeSend中如果返回false可以取消本次Ajax请求。XMLHttpRequest对象是唯一的参数 function(XMLHttpRequest){ this;//调用本次Ajax请求时传递的options参数 } |
complete | Function | 请求完成后的回调函数(请求成功或失败时都调用) 参数:XMLHttpRequest对象和一个描述成功请求类型的字符串 function(XMLHttpRequest,textStatus){ this;//调用本次Ajax请求时传递的options参数 } |
success | Function | 请求成功后调用的回调函数,有两个参数 (1)由服务器返回,并根据dataTyppe参数进行处理后的数据 (2)描述状态的字符串 function(data,textStatus){ //data可能是xmlDoc、``jsonObj、html、text等 this;//调用本次Ajax请求时传递的options参数 } |
error | Function | 请求失败时被调用的函数 |
global | Boolean | 默认为true。表示是否触发全局Ajax事件,设置为false将不会触发。AjaxStart或AjaxStop可用于控制各种Ajax事件 |