JQUERY AJAX异步操作详细说明AJAX 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和XML)。
它并非一种新的技术,而是以下几种原有技术的结合体。
1)使用CSS和XHTML来表示。
2)使用DOM模型来交互和动态显示。
3)使用XMLHttpRequest来和服务器进行异步通信。
4)使用javascript来绑定和调用。
通过AJAX异步技术,可以在客户端脚本与web服务器交互数据的过程中使用XMLHttpRequest对象来完成HTTP请求(Request)/应答(Response)模型:1)不需要用户等待服务端响应。
在异步派发XMLHttpRequest请求后控制权马上就被返回到浏览器。
界面不会出现白板,在得到服务器响应之前还可以友好的给出一个加载提示。
2)不需要重新加载整个页面。
为XMLHttpRequest注册一个回调函数,待服务器响应到达时,触发回调函数,并且传递所需的少量数据。
“按需取数据”也降低了服务器的压力。
3)不需要使用隐藏或内嵌的框架。
在XHR对象之前,模拟Ajax通信通常使用hack手段,如使用隐藏的或内嵌的框架(<iframe>标签)。
下面介绍下AJAX中的重要对象:XMLHttpRequest。
XMLHttpRequest对象(XHR)XMLHttpRequest是一套可以在Javascript、VbScript、Jscript等脚本语言中通过http协议传送或接收XML及其他数据的一套API。
XMLHttpRequest对象首次以ActiveX对象形式在微软Internet Explorer(IE) 5中以引入。
其他浏览器制造商在认识到这一对象重要性后也纷纷实现了XMLHttpRequest对象,但是以一个本地JavaScript对象而不是作为一个ActiveX 对象实现。
而如今,由于安全性、标准等问题,微软已经在其IE 7中把XMLHttpRequest实现为一个本地JavaScript对象。
API描述客服端请求open(method,url,a sync, bstrUser, bstrPassword)规定请求的类型、URL 以及是否异步处理请求。
1)method:请求的类型,例如:POST、GET、PUT及PROPFIND。
大小写不敏感。
2)url:请求的URL地址,可以为绝对地址也可以为相对地址。
3)async[可选]:true(默认,异步)或 false(同步)。
注释:当您使用async=false 时,JavaScript 会等到服务器响应就绪才继续执行。
如果服务器繁忙或缓慢,应用程序会挂起或停止。
此时,不需要编写onreadystatechange回调函数,把代码放到send() 语句后面即可。
4)bstrUser[可选]:如果服务器需要验证,此处指定用户名,如果未指定,当服务器需要验证时,会弹出验证窗口。
5)bstrPassword[可选]:验证信息中的密码部分,如果用户名为空,则此值将被忽略。
getRequestHeader(name)获取指定的相应头部信息setRequestHeader( name,value)自定义HTTP头部信息。
需在open()方法之后和send()之前调用,才能成功发送请求头部信息。
传送门:HTTP 头部详解Accept浏览器能够处理的媒体类型Accept-Charset浏览器申明自己接收的字符集Accept-Encoding浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)Host客户端指定要请求的WEB服务器的域名/IP 地址和端口号Referer发出请求的页面的URIContent-Type标明发送或者接收的实体的MIME类型。
传送门:1、HTTP Content-type对照表2、格式:Content-Type:[type]/[subtype]; parameterX-Requested-With非标准HTTP头,只为firefox3标注是否为ajax异步请求,null表示为同步请求。
默认情况下,服务器对POST请求和提交Web表单不会一视同仁,将Content-Type头部信息设置为application/x-www-form-urlencoded (模拟表单提交)send(string)将请求发送到服务器。
参数string仅用于POST请求;对于GET请求的参数写在url后面,所以string参数传递null。
abort()调用此方法可取消异步请求,调用后,XHR对象停止触发事件,不允许访问任何与响应相关的属性;服务端响应onreadystatechang e事件对于异步请求,如果需要对服务器获取和操作响应结果,则在send() 之前,需要为onreadystatechange属性指定处理方法。
该函数用于对服务器响应进行处理。
readyState存有XMLHttpRequest的状态。
每当readyState改变时,就会触发onreadystatechange事件。
从 0 到 4 发生变化:0(未初始化)对象已建立,但是尚未初始化(尚未调用open方法)1(初始化)对象已建立,尚未调用send方法2(发送数据)send方法已调用,但是当前的状态及http头未知3(数据传送中)已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误4(完成)数据接收完毕,此时可以通过responseXml和responseText获取完整的回应数据status(数字表示)返回当前请求的http状态码。
传送门:HTTP状态码一览表(HTTP Status Code)1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。
2xx (成功)表示成功处理了请求的状态代码。
Eg:2003xx (重定向)表示要完成请求,需要进一步操作。
通常,这些状态代码用来重定向。
Eg:3044xx(请求错误)这些状态代码表示请求可能出错,导致服务器无法正常处理。
Eg:4045xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。
这些错误可能是服务器本身的错误,而不是请求出错。
Eg:500statusText(字符表示)返回当前请求的状态文本eg:OK (status:200)responseText将响应信息作为字符串返回responseXML将响应信息格式化为Xml Document对象并返回responseBody(只有微软的IE支持)将响应信息正文以unsigned byte数组形式返回(二进制数据)responseStream(只有IE的某些版本支持)以Ado Stream对象(二进制流)的形式返回响应信息getResponseHeader(name)从响应信息中获取指定的http头getAllResponseHeaders()获取响应的所有http头overrideMimeType通常用于重写服务器响应的MIME类型。
Eg,正常情况下XMLHttpRequest只接收文本数据,但我们可以重写MIME为“text/plain; charset=x-user-defined”,以欺骗浏览器避免浏览器格式化服务器返回的数据,以实现接收二进制数据。
XMLHttpRequest Level 2XMLHttpRequest是一个浏览器接口,使得Javascript可以进行 HTTP (S) 通信。
但是,这个接口一直没有标准化,每家浏览器的实现或多或少有点不同。
HTML 5 的概念形成后,W3C 开始考虑标准化这个接口。
2008年 2 月,提出了XMLHttpRequest Level 2 草案。
1.老版本的缺点老版本的XMLHttpRequest对象有以下几个缺点:1)只支持文本数据的传送,无法用来读取和上传二进制文件。
2)传送和接收数据时,没有进度信息,只能提示有没有完成。
3)受到"同域限制"(Same Origin Policy),只能向同一域名的服务器请求数据。
2.新版本的功能新版本的XMLHttpRequest对象,针对老版本的缺点,做出了大幅改进。
1)可以设置 HTTP 请求的时限。
2)可以使用FormData对象管理表单数据。
3)可以上传文件。
4)可以请求不同域名下的数据(跨域资源共享,Cross-origin resourcesharing,简称 CORS)。
5)可以获取服务器端的二进制数据。
6)可以获得数据传输的进度信息。
3.介绍几个XMLHttpRequest Leve2 新增的成员超时时限timeout设置ajax请求超时时限,过了这个时限,就自动停止HTTP请求。
ontimeout事件当ajax超过timeout 时限时触发的回调函数。
指定响应格式responseType(默认:“text”)在发送请求前,根据您的数据需要,将xhr.responseType设置为“text”、“arraybuffer”、“blob”或“document”。
response成功发送请求后,xhr的响应属性会包含DOMString、ArrayBuffer、Blob 或Document 形式(具体取决于responseTyp的设置)的请求数据。
进度信息progress 事件在XMLHttpRequest对象传递数据的时候用来返回进度信息。
它分成上传和下载两种情况。
下载的 progress 事件属于XMLHttpRequest对象,上传的 progress 事件属于XMLHttpRequest.upload 对象。
即:xhr.onprogress = updateProgress;xhr.upload.onprogress = updateProgress;XHR 还新增了与progress 事件相关的五个事件:1) load 事件:传输成功完成。
2) abort 事件:传输被用户取消。
3) error 事件:传输中出现错误。
4) loadstart 事件:传输开始。
5) loadEnd 事件:传输结束,但是不知道成功还是失败。
4. 一个新功能实例1) 接收二进制数据(方法A :改写MIMEType )老版本的XMLHttpRequest 对象,只能从服务器取回文本数据。
但我们可以改写数据的MIMEType ,将服务器返回的二进制数据伪装成文本数据,并且告诉浏览器这是用户自定义的字符集。
关键代码如下:服务端?1 2 3 4 5 6 7 8 9 10 11String str ="二进制数据获取"; MemoryStream _memory =new MemoryStream(); BinaryFormatter formatter =new BinaryFormatter(); formatter.Serialize(_memory, str); _memory.Position = 0; byte [] read =new byte [_memory.Length]; _memory.Read(read, 0, read.Length); _memory.Close(); context.Response.ContentType ="text/plain"; // 服务器使用OutputStream 输出二进制流 context.Response.OutputStream.Write(read, 0, read.Length); 客服端?1 2 3 4 5 6 7 8 9 10 $('#btn_mime').bind('click',null,function () {$.ajax('AjaxHandler.ashx?func=GetBinaryData',{type:'get',dataType:'text',cache:false ,mimeType:'text/plain; charset=x-user-defined',success:function (data) {if (data) {var byte = [];1 1 12 13 14 15 16 17 18 19 2 0for (var i = 0, len = data.length; i < len; ++i) { var c = data.charCodeAt(i);byte[byte.length] = c & 0xff;}alert(byte);}}});});浏览器会把相应数据当做文本数据接收,所以我们还必须再一个个字节地还原成二进制数据。