[js点击]JavaScript之Ajax技术01
来源:互联网 发布:淘宝差评如何巧妙回复 编辑:程序博客网 时间:2024/06/05 06:41
AJAX
浏览器与服务器之间,采用HTTP协议通信。用户在浏览器地址栏键入一个网址,或者通过网页表单向服务器提交内容,这时浏览器就会向服务器发出HTTP请求。
1999年,微软公司发布IE浏览器5.0版,第一次引入新功能:允许JavaScript脚本向服务器发起HTTP请求。这个功能当时并没有引起注意,直到2004年Gmail发布和2005年Google Map发布,才引起广泛重视。2005年2月,AJAX这个词第一次正式提出,指围绕这个功能进行开发的一整套做法。从此,AJAX成为脚本发起HTTP通信的代名词,W3C也在2006年发布了它的国际标准。
具体来说,AJAX包括以下几个步骤。
- 创建AJAX对象
- 发出HTTP请求
- 接收服务器传回的数据
- 更新网页数据
概括起来,就是一句话,AJAX通过原生的XMLHttpRequest
对象发出HTTP请求,得到服务器返回的数据后,再进行处理。
AJAX可以是同步请求,也可以是异步请求。但是,大多数情况下,特指异步请求。因为同步的Ajax请求,对浏览器有“堵塞效应”。
XMLHttpRequest对象
XMLHttpRequest
对象用来在浏览器与服务器之间传送数据。
var ajax = new XMLHttpRequest();ajax.open('GET', 'http://www.example.com/page.php', true);
上面代码向指定的服务器网址,发出GET请求。
然后,AJAX指定回调函数,监听通信状态(readyState
属性)的变化。
ajax.onreadystatechange = handleStateChange;
一旦拿到服务器返回的数据,AJAX不会刷新整个网页,而是只更新相关部分,从而不打断用户正在做的事情。
注意,AJAX只能向同源网址(协议、域名、端口都相同)发出HTTP请求,如果发出跨源请求,就会报错(详见《同源政策》和《CORS机制》两节)。
虽然名字里面有XML
,但是实际上,XMLHttpRequest可以报送各种数据,包括字符串和二进制,而且除了HTTP,它还支持通过其他协议传送(比如File和FTP)。
下面是XMLHttpRequest
对象的典型用法。
var xhr = new XMLHttpRequest();// 指定通信过程中状态改变时的回调函数xhr.onreadystatechange = function(){ // 通信成功时,状态值为4 if (xhr.readyState === 4){ if (xhr.status === 200){ console.log(xhr.responseText); } else { console.error(xhr.statusText); } }};xhr.onerror = function (e) { console.error(xhr.statusText);};// open方式用于指定HTTP动词、请求的网址、是否异步xhr.open('GET', '/endpoint', true);// 发送HTTP请求xhr.send(null);
open
方法的第三个参数是一个布尔值,表示是否为异步请求。如果设为false
,就表示这个请求是同步的,下面是一个例子。
var request = new XMLHttpRequest();request.open('GET', '/bar/foo.txt', false);request.send(null);if (request.status === 200) { console.log(request.responseText);}
XMLHttpRequest实例的属性
readyState
readyState
是一个只读属性,用一个整数和对应的常量,表示XMLHttpRequest请求当前所处的状态。
- 0,对应常量
UNSENT
,表示XMLHttpRequest实例已经生成,但是open()
方法还没有被调用。 - 1,对应常量
OPENED
,表示send()
方法还没有被调用,仍然可以使用setRequestHeader()
,设定HTTP请求的头信息。 - 2,对应常量
HEADERS_RECEIVED
,表示send()
方法已经执行,并且头信息和状态码已经收到。 - 3,对应常量
LOADING
,表示正在接收服务器传来的body部分的数据,如果responseType
属性是text
或者空字符串,responseText
就会包含已经收到的部分信息。 - 4,对应常量
DONE
,表示服务器数据已经完全接收,或者本次接收已经失败了。
在通信过程中,每当发生状态变化的时候,readyState
属性的值就会发生改变。这个值每一次变化,都会触发readyStateChange
事件。
if (ajax.readyState == 4) { // Handle the response.} else { // Show the 'Loading...' message or do nothing.}
上面代码表示,只有readyState
变为4时,才算确认请求已经成功,其他值都表示请求还在进行中。
onreadystatechange
onreadystatechange
属性指向一个回调函数,当readystatechange
事件发生的时候,这个回调函数就会调用,并且XMLHttpRequest实例的readyState
属性也会发生变化。
另外,如果使用abort()
方法,终止XMLHttpRequest请求,onreadystatechange
回调函数也会被调用。
var xmlhttp = new XMLHttpRequest();xmlhttp.open( 'GET', 'http://example.com' , true );xmlhttp.onreadystatechange = function () { if ( XMLHttpRequest.DONE != xmlhttp.readyState ) { return; } if ( 200 != xmlhttp.status ) { return; } console.log( xmlhttp.responseText );};xmlhttp.send();
response
response
属性为只读,返回接收到的数据体(即body部分)。它的类型可以是ArrayBuffer、Blob、Document、JSON对象、或者一个字符串,这由XMLHttpRequest.responseType
属性的值决定。
如果本次请求没有成功或者数据不完整,该属性就会等于null
。
responseType
responseType
属性用来指定服务器返回数据(xhr.response
)的类型。
- ”“:字符串(默认值)
- “arraybuffer”:ArrayBuffer对象
- “blob”:Blob对象
- “document”:Document对象
- “json”:JSON对象
- “text”:字符串
text类型适合大多数情况,而且直接处理文本也比较方便,document类型适合返回XML文档的情况,blob类型适合读取二进制数据,比如图片文件。
var xhr = new XMLHttpRequest();xhr.open('GET', '/path/to/image.png', true);xhr.responseType = 'blob';xhr.onload = function(e) { if (this.status == 200) { var blob = new Blob([this.response], {type: 'image/png'}); // 或者 var blob = oReq.response; }};xhr.send();
如果将这个属性设为ArrayBuffer,就可以按照数组的方式处理二进制数据。
var xhr = new XMLHttpRequest();xhr.open('GET', '/path/to/image.png', true);xhr.responseType = 'arraybuffer';xhr.onload = function(e) { var uInt8Array = new Uint8Array(this.response); for (var i = 0, len = binStr.length; i < len; ++i) { // var byte = uInt8Array[i]; }};xhr.send();
如果将这个属性设为“json”,支持JSON的浏览器(Firefox>9,chrome>30),就会自动对返回数据调用JSON.parse()
方法。也就是说,你从xhr.response属性(注意,不是xhr.responseText属性)得到的不是文本,而是一个JSON对象。
XHR2支持Ajax的返回类型为文档,即xhr.responseType=”document” 。这意味着,对于那些打开CORS的网站,我们可以直接用Ajax抓取网页,然后不用解析HTML字符串,直接对XHR回应进行DOM操作。
responseText
responseText
属性返回从服务器接收到的字符串,该属性为只读。如果本次请求没有成功或者数据不完整,该属性就会等于null
。
如果服务器返回的数据格式是JSON,就可以使用responseText
属性。
var data = ajax.responseText;data = JSON.parse(data);
responseXML
responseXML
属性返回从服务器接收到的Document对象,该属性为只读。如果本次请求没有成功,或者数据不完整,或者不能被解析为XML或HTML,该属性等于null
。
返回的数据会被直接解析为DOM对象。
/* 返回的XML文件如下 <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <book> <chapter id="1">(Re-)Introducing JavaScript</chapter> <chapter id="2">JavaScript in Action</chapter> </book>*/var data = ajax.responseXML;var chapters = data.getElementsByTagName('chapter');
如果服务器返回的数据,没有明示Content-Type
头信息等于text/xml
,可以使用overrideMimeType()
方法,指定XMLHttpRequest对象将返回的数据解析为XML。
status
status
属性为只读属性,表示本次请求所得到的HTTP状态码,它是一个整数。一般来说,如果通信成功的话,这个状态码是200。
- 200, OK,访问正常
- 301, Moved Permanently,永久移动
- 302, Move temporarily,暂时移动
- 304, Not Modified,未修改
- 307, Temporary Redirect,暂时重定向
- 401, Unauthorized,未授权
- 403, Forbidden,禁止访问
- 404, Not Found,未发现指定网址
- 500, Internal Server Error,服务器发生错误
基本上,只有2xx和304的状态码,表示服务器返回是正常状态。
if (ajax.readyState == 4) { if ( (ajax.status >= 200 && ajax.status < 300) || (ajax.status == 304) ) { // Handle the response. } else { // Status error! }}
statusText
statusText
属性为只读属性,返回一个字符串,表示服务器发送的状态提示。不同于status
属性,该属性包含整个状态信息,比如”200 OK“。
timeout
timeout
属性等于一个整数,表示多少毫秒后,如果请求仍然没有得到结果,就会自动终止。如果该属性等于0,就表示没有时间限制。
var xhr = new XMLHttpRequest(); xhr.ontimeout = function () { console.error("The request for " + url + " timed out."); }; xhr.onload = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { callback.apply(xhr, args); } else { console.error(xhr.statusText); } } }; xhr.open("GET", url, true); xhr.timeout = timeout; xhr.send(null);}
- [js点击]JavaScript之Ajax技术01
- [js点击]JavaScript之Ajax技术02
- [js点滴]JavaScript之WebSocket 技术
- [js点滴]JavaScript之cookie技术
- Javascript Ajax技术运用
- js的ajax技术
- js中的ajax技术
- javascript之json+ajax技术实现网页异步更新
- JS:javascript技术总结
- Ajax 及javascript技术分享
- JavaScript ajax技术原理解析
- JavaScript——ajax技术
- AJAX技术之简介
- jQuery之ajax技术
- Ajax之技术缺陷
- AJAX技术之JSON
- ajax 之javascript 应用
- javascript之AJAX框架
- 动态www服务器的请求流程原理
- JQuey淡入淡出,滑动方法-6.7
- 设计模式详解——迭代器模式
- Hibernate将HQL语句转换成SQL语句
- 需要获得一组具有相同的ID和name的input的几种尝试
- [js点击]JavaScript之Ajax技术01
- 只给出先序遍历和后序遍历不能唯一确定二叉树的例子
- 【代码笔记】iOS-NSJSONSerializationDemo
- 在线预览PDF/SWF
- [转] HBase-1.2.4LruBlockCache实现分析
- 设计模式详解——工厂模式(一)
- 【WEB开发技术】apache-tomcat-7.0.30的安装、配置、发布项目、教程说明
- 最新版PS CC 2017版下载,可汉化可激活
- weblogic部署项目报java.lang.NoClassDefFoundError 错误,BeanCreationException,FatalBeanException