Ajax及其工作原理
AJAX 是一种与服务器交换数据无需刷新网页的技术,最早由Google公司在谷歌地图里使用,并迅速风靡。
AJAX是不能跨域的,如需跨域,可以使用document.domain='a.com'
;或者使用服务器代理,代理XMLHttpRequest文件
AJAX是基于现有的Internet标准,并且联合使用它们:
1 | XMLHttpRequest 对象 (异步的与服务器交换数据) |
创建 XMLHttpRequest 对象
所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建XMLHttpRequest
对象。
创建Ajax对象:
1 | //IE6以上 |
连接服务器
1 | oAjax.open(方法,url,是否异步) |
我们知道,Ajax即“Asynchronous Javascript And XML”
(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。所以,Ajax
天生就是工作在异步模式的(异步为true,同步false)
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
(简单点说:同步就是只能一件一件事的来做,而异步就是可以多件事同时进行)
发送请求send()
1 | <script type="text/javascript"> |
GET 还是 POST?
与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。
然而,在以下情况中,请使用 POST 请求:
1 | 无法使用缓存文件(更新服务器上的文件或数据库) |
GET请求通常用于检索数据库的某一个条目,比如news.php?id=4
POST请求通常用于提交表单
接收返回信息
1 | oAjax.onreadystatechange = function(){ //当请求状态改变时要调用的事件处理器 |
只要readyState
属性的值发生变化时,便会触发一次readyStatechange
事件。可以利用这个事件来检测每次状态变化后readyState
的值。通常,我们只对readyState
值为4的阶段感兴趣,因为这时所有数据都已经就绪,不过,必须在调用open()
之前指定onreadystatechange
事件处理程序才能确保跨浏览器兼容性。
完整的Ajax例子:
1 | //第一步创建一个xhr对象,使用new关键字来调用一个内置构造函数 |
XHR对象
XMLHttpRequest这个对象的属性有:
1 | onreadystatechange 每次状态改变所触发事件的事件处理程序。 |
当XHR对象把一个HTTP请求发送到服务器的过程中会经历几个状态,直到请求被处理,然后才接收一个回应。readyState就是XHR请求的状态属性,它本身有5个属性值:
1 | 0(未初始化)还没有调用open()方法 |
http状态码
1字头:消息。这一类型的状态码,代表请求已被接受,需要继续处理。
2字头:成功。这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
3字头:重定向。这类状态码代表需要客户端采取进一步的操作才能完成请求。
4字头:客户端错误。这类状态码代表了客户端看起来可能发生错误,妨碍了服务器的处理。
5字头:服务器错误。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生
w3cschool HTTP 状态消息:http://www.w3school.com.cn/tags/html_ref_httpmessages.asp
status和statusText
statusText
是响应返回的文本信息,仅当readyState
值为3或4的时候才能使用。当readyState
为其它值时视图存取statusText
属性将引发异常。
jQuery中的Ajax
.load()
方法是局部方法,因为他需要一个包含元素的jQuery对象作为前缀,而$.get()
和$.post()
是全局方法,无需指定某个元素,对于用途而言,.load()
适合做静态文件的异步获取,而对于需要传递参数到服务器页面的,$.get()
和$.post()
更加合适。
GET和POST传入的data是一个键值对 对象,不同的是GET传入的data是通过地址栏传输的,而POST是通过表单提交的,
1 | $(function () { |
POST
提交不能使用url
传参。post
提交可以使用字符串形式的键值对形式传参,自动转换为http消息实体传参
1 | $(function () { |
1 | //post提交可以使用对象键值对 |
$.get()
方法有四个参数,前面三个参数和.load()
一样,多了一个第四参数type,即服务器返回的内容格式,包括xml,json,script,html,text
等,第一个参数为必选参数,后面三个为可选参数
$.ajax()
是所有Ajax方法中最底层的方法,所有其他方法都是基于$.ajax()
方法的封装,这个方法只有一个参数,传递一个
各个功能键值对的对象。
1 | $(function () { |
表单序列化
Ajax
用的最多的地方莫过于表单操作,而传统的表单操作是通过submit
提交将数据传输到服务器,如果使用Ajax
异步处理
的话,我们需要将每个表单元素获取才能提交,这样工作效率就大大降低
1 | <body> |
表单元素特别多的情况下应采用表单序列化,即data:$(“form”).serialize();//得到的是字符串键值对,并且对url进行编码
serialize()
方法不但可以序列化表单内的元素,还可以直接获取单选框,复选框和下拉列表框等内容
1 | <body> |
传统Ajax问题
传统的ajax有如下的问题:
1 | 1、可以无刷新改变页面内容,但无法改变页面URL |