AJAX 核心 —— XMLHTTPRequest 对象回顾
一、AJAX概述
不使用 AJAX 的网页,如果要更新内容,需要重载整个页面。
AJAX ( Asynchronous Javascript And XML ,异步 Javascript 和 XML)用于异步通讯,通过在后台与服务器进行少量的数据交换,在不重载整个网页的情况下,对网页局部实现异步刷新。
二、AJAX核心
JavaScript 中使用 XMLHTTPRequest 对象(XHR)实现 AJAX 请求。使用这个对象之前,先了解一下它的属性和方法:
属性 | 描述 |
readyState |
表示 XMLHttpRequest 对象的状态: 0:未初始化状态。已创建 XMLHTTPRequest 对象。 1:准备发送状态。已调用 open 方法,send 方法尚未调用。 2:已经发送状态。send 方法已经调用,尚未开始接受数据。 3:正在接收状态。已经接收到 HTTP 响应头信息,但是响应体还没有完全接收到。 4:完成响应状态。响应数据接受完成。 |
onreadystatechange |
当 readyState 值(XMLHTTPRequest 对象状态)发生改变时的响应事件。 |
responseText |
服务器响应的文本内容。 |
responseXML |
服务器响应的 XML 内容。 |
status |
服务器响应的 HTTP 状态码。200:OK。304:资源未修改。404:页面未找到。500:服务器错误。 |
statusText |
服务器响应的 HTTP 状态文本。OK、资源未修改、页面未找到、服务器错误等。 |
方法 | 描述 |
open(method,url, asynch,username, password) |
指定和服务器端交互的HTTP方法,URL地址,即其他请求信息; Method:表示http请求方法,一般使用"GET","POST"。 url:表示请求的服务器的地址。 asynch:表示是否异步(ture),默认为 true。 后边两个可以不指定。 username 和 password 分别表示用户名和密码,提供 HTTP 认证机制需要的用户名和密码。 |
setRequestHeader(header, value) |
设置请求头。header: 头名称。value: 头的值。 |
getResponseHeader(header) | 获取指定 header 的响应头信息。 |
getAllResponseHeaders() | 获取所有响应头信息。 |
send(content) |
向服务器发出请求,如果采用异步方式,该方法会立即返回。 content:POST请求时以字符串或 formData 对象传进去,GET请求时不填参数或设为 null 。 |
abort() |
中止请求。XMLHTTPRequest 对象恢复到状态0(未初始化)。 |
三、AJAX步骤
一般步骤如下:
- 实例化 XMLHTTPRequest 对象(注意 IE 兼容性)
- 绑定监听事件(onreadystatechange 属性,判断就绪用 readState 属性 == 4,判断响应成功用 status 属性 == 200,获取响应用 responseText 或 responseXML 属性。
- 建立请求(open() 方法,注意最后一个参数为 ture(因为是 AJAX ))
- 设置请求头(setRequestHeader() 方法,仅限于POST)
- 发送请求(send() 方法,POST 请求时在 send() 方法添加提交参数)
四、AJAX实现
- // 第一步,创建 XMLHTTPRequest 对象
- var xhr = window.XMLHTTPRequest ? (new XMLHTTPRequest()) : (new ActiveXObject('Microsoft.XMLHttp'));
- if(!xhr){
- alert('创建 XMLHTTPRequest 对象失败!');
- return false;
- }
- // 第二步,绑定回调函数
- xhr.onreadystatechange = function () {
- if(xhr.readyState == 4 && xhr.status = 200){ // 请求就绪 && 响应成功
- var data = xhr.responseText; // 如果是 XML 数据,用 responseXML 属性获取
- // DOM 操作
- }
- }
- // 第三步,建立请求
- xhr.open("POST", url, true); // 参数三默认为 true(异步),可以不填
- // 第四步,设置请求头(仅限于POST)
- xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset-UTF-8');
- // 第五步,发送请求
- xhr.send('fname=michael&&lname=jordan'); // 参数是POST请求体
这里,强调以下四点(引用自 廖雪峰的官方网站 ,第 4 条略作修改)
通过检测 window 对象是否有 XMLHttpRequest 属性来确定浏览器是否支持标准的 XMLHttpRequest。注意,不要根据浏览器的 navigator.userAgent 来检测浏览器是否支持某个 JavaScript 特性,一是因为这个字符串本身可以伪造,二是通过IE版本判断JavaScript特性将非常复杂。
当创建了XMLHttpRequest对象后,要先设置 onreadystatechange 的回调函数。在回调函数中,通常我们只需通过 readyState === 4 判断请求是否完成,如果已完成,再根据 status === 200 判断是否是一个成功的响应。
XMLHttpRequest 对象的 open() 方法有3个参数,第一个参数指定是 GET 或者 POST,第二个参数指定 URL 地址,第三个参数指定是否使用异步,默认是true,所以可以不写。注意,千万不要把第三个参数指定为false,否则浏览器将停止响应,直到AJAX请求完成。如果这个请求耗时 10 秒,那么 10 秒内你会发现浏览器处于“假死”状态。
最后调用 send() 方法才真正发送请求。GET 请求不需要参数(或者 null),POST 请求需要把 body 部分以字符串或者 FormData 对象传进去。
五、jQuery中的AJAX
直接用 JS 写 AJAX 步骤有些繁琐。jQuery 中封装了 AJAX 的快捷方法。
- $.ajax(url,[settings]) // 执行异步 HTTP (Ajax) 请求
- $('选择器').load(url,[data],[callback]) // 从服务器加载数据,把返回 HTML 放入匹配元素
- $.get(url,[data],[fn],[type]) // GET 请求加载数据
- $.getJSON(url,[data],[fn]) // GET 请求加载 JSON 编码数据
- $.getScript(url,[callback]) // GET 请求 JavaScript 文件,并执行
- $.post(url,[data],[fn],[type]) // POST 请求加载数据
更多jQuery 的 AJAX 请参考 jQuery 的中文手册,实例请参考 http://www.cnblogs.com/jayleke/archive/2012/08/10/2633174.html
六、推荐阅读
比较详细的 AJAX 介绍,并且文末涉及了 CORS 跨域:廖雪峰的官方网站-AJAX
七、扩展阅读
AJAX 请求不可避免的涉及到两个问题:第一是AJAX以何种格式来交换数据(通常是JSON);第二是跨域需求是怎么解决的(通常是JSONP)。这篇文章有通俗易懂的解释:【原创】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
既然 AJAX 请求涉及了跨域,那么什么是跨域?跨域的实现方式又有哪些(JSONP、CORS、服务器跨域、postmessage ...... )?推荐看看这篇文章:跨域请求的几种实现方式
还有就是GET 请求经常会读取缓存,解决方法是在 url 后面添加一个随机数,或者用 jQuery 的 $.ajaxSetup({cache: false}); 等,详细请看这篇文章: 解决jquery load,get 方法缓存数据问题
AJAX 核心 —— XMLHTTPRequest 对象回顾的更多相关文章
- 详解AJAX核心 —— XMLHttpRequest 对象 (上)
我要说的内容都是非常基础的内容,高手就免看了,如果看了欢迎给点意见啊.新手或者对低层还不是很了解的人可以看看,帮助理解与记忆. XMLHttpRequest 对象是AJAX功能的核心,要开发AJAX程 ...
- [置顶] Ajax核心--XMLHttpRequest对象
XMLHttpRequest 对象是AJAX功能的核心,学习XMLHttpRequest对象就先从创建XMLHttpRequest 对象开始,了解在不同的浏览器中创建XMLHttpRequest 对象 ...
- Ajax核心--XMLHttpRequest对象
XMLHttpRequest 对象是AJAX功能的核心,学习XMLHttpRequest对象就先从创建XMLHttpRequest 对象开始,了解在不同的浏览器中创建XMLHttpRequest 对象 ...
- AJAX——核心XMLHttpRequest对象
AJAX大家已经都知道了,是为了实现异步通讯,提高用户体验度,而将很多旧知识(XML,DOM,JavaScript,HTML,Jquery,Css……)重新融合的一个新的知识框架.而,XMLHttpR ...
- 详解AJAX核心 —— XMLHttpRequest 对象 (下)
继续上一篇的内容上一篇关于XMLHttpRequest 对象发送对服务器的请求只说到了用Get方式,没有说Post方式的.那是因为要说Post方式就需要先说另外一个东西,那就是DOM(Document ...
- AJAX核心XMLHTTPRequest对象
老早就写好了总结.今天整理发表一下. XMLHttpRequest对象是AJAX的核心技术,XMLHttpRequest 是XMLHTTP 组件的对象,通过这个对象.AJAX能够像桌面应用程序一样仅仅 ...
- js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可)
js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可) 一.总 ...
- Ajax技术---核心XMLHttpRequest对象
Ajax 的全称是Asynchronous JavaScript and XML,其中,Asynchronous 是异步的意思,它有别于传统web开发中采用的同步的方式. (一)ajax技术的意义 我 ...
- AJAX的核心XMLHttpRequest对象
为了实现异步通讯,提高用户体验度,而将很多旧知识(XML,DOM,JavaScript,HTML,jQuery,Css...)重新融合程一个新的知识框架.而XMLHttpRequest对象则是其中的重 ...
随机推荐
- C++基础知识(二)
八. 继承:让某个类的对象获得另一个类的对象的特性.通过继承可实现代码重用,即从已存在的类派生出的一个新类将自动具有原来那个类的特性. 类的继承还具有:(1)单向性:A类为B类的基类(父类),则派生类 ...
- Mac下docker搭建lamp本地开发环境
1.先在Mac上下载docker:官网下载:下载地址(选择mac版本下载,可能速度较慢) DaoCloud下载:下载地址(速度较快,可能版本较低) 2.装完之后打开: 3.检查一下是否下载成功: $ ...
- BZOJ4869:[SHOI2017]相逢是问候——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=4869 题面复制于洛谷:https://www.luogu.org/problemnew/show/P ...
- BZOJ3076 & 洛谷3081:[USACO2013 MAR]Hill Walk 山走——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3076 https://www.luogu.org/problemnew/show/P3081#sub ...
- 洛谷4577 & LOJ2521:[FJOI2018]领导集团问题——题解
https://www.luogu.org/problemnew/show/P4577 https://loj.ac/problem/2521 参考:https://www.luogu.org/blo ...
- BZOJ1022 [SHOI2008]小约翰的游戏John 【博弈论】
1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3014 Solved: 1914 [Submi ...
- bzoj2276: [Poi2011]Temperature(单调队列/堆)
这题有两种写法,而且是完全(几乎?)不一样的写法...并不是换了个方法来维护而已 单调队列O(N):用一个队列维护a[]的单调递减,对于每个i满足a[队头]<=b[i],然后就可以算出以每一位为 ...
- 跳跃表 https://61mon.com/index.php/archives/222/
跳跃表(英文名:Skip List),于 1990 年 William Pugh 发明,是一个可以在有序元素中实现快速查询的数据结构,其插入,查找,删除操作的平均效率都为 . 跳跃表的整体性能可以和二 ...
- 如何按需动态加载js文件
JavaScript无非就是script标签引入页面,但当项目越来越大的时候,单页面引入N个js显然不行,合并为单个文件减少了请求数,但请求的文件体积却很大.这时候最好的做法就是按需引入,动态引入组件 ...
- 手脱ASProtect v1.23 RC1(有Stolen Code)
1.载入PEID ASProtect v1.23 RC1 常见ASprotect版本壳: ASProtect 1.23 RC4 按shift+f9键26次后来到典型异常 ASProtect 1.31 ...