Ajax

创建XMLHttpRequest 对象

所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象。

 创建XMLHttpRequest 对象的语法:

variable=new XMLHttpRequest();

 老版本的Internet Explorer (IE5 和 IE6)使用 ActiveX 对象: 

variable=new ActiveXObject("Microsoft.XMLHTTP");

 为了应对所有的现代浏览器,包括IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject ::

实例

var xmlhttp;if (window.XMLHttpRequest)  {// code for IE7+, Firefox, Chrome, Opera, Safari  xmlhttp=new XMLHttpRequest();  }else  {// code for IE6, IE5  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  }

XMLHttpRequest对象的属性

XMLHttpRequest对象的常见属性如下:

属性描述

onreadystatechange存储函数(或函数名),每当readyState的属性改变时,就会调用该函数。

readyState存有的XMLHttpRequest的状态从0到4发生变化。0:请求未初始化1:服务器连接已建立2:请求已接收3:请求处理中4:请求已完成,且响应已就绪

reponseText以文本形式返回响应。

responseXML以XML格式返回响应

status将状态返回为数字(例如,“Not Found”为404,“OK”为200)

statusText以字符串形式返回状态(例如,“Not Found”或“OK”)

XMLHttpRequest对象的方法

XMLHttpRequest对象的重要方法如下:

方法描述

abort()取消当前请求。

getAllResponseHeaders()以字符串形式返回完整的HTTP标头集。

getResponseHeader( headerName )返回指定HTTP标头的值。

void open(method,URL)打开指定获取或交的方法和URL的请求。

void open(method,URL,async)与上面相同,但指定异步或不。

void open(method,URL,async,userName,password)与上面相同,但指定用户名和密码。

void send(content)发送获取请求。

setRequestHeader( label,value)将标签/值对添加到要发送的HTTP标头。

向服务器发送请求

如需将请求发送到服务器,我们使用XMLHttpRequest 对象的open()和send()方法:

xmlhttp.open("GET","ajax_info.txt",true);        

xmlhttp.send();

方法描述

open(method,url,async)规定请求的类型、URL 以及是否异步处理请求。

[if !supportLists]· [endif]

method:请求的类型;GET 或 POST

[if !supportLists]· [endif]

[if !supportLists]· [endif]

url:文件在服务器上的位置

[if !supportLists]· [endif]

[if !supportLists]· [endif]

async:true(异步)或 false(同步)

[if !supportLists]· [endif]

send(string)将请求发送到服务器。

[if !supportLists]· [endif]

string:仅用于 POST 请求

[if !supportLists]· [endif]

GET 还是 POST?


 与POST相比,GET 更简单也更快,并且在大部分情况下都能用。

 然而,在以下情况中,请使用POST请求:

无法使用缓存文件(更新服务器上的文件或数据库)

向服务器发送大量数据(POST没有数据量限制)

发送包含未知字符的用户输入时,POST比GET更稳定也更可靠

GET 请求


 一个简单的GET请求:

实例

xmlhttp.open("GET","demo_get.html",true);xmlhttp.send();

 在上面的例子中,您可能得到的是缓存的结果。

 为了避免这种情况,请向URL 添加一个唯一的 ID:

实例

xmlhttp.open("GET","demo_get.html?t=" + Math.random(),true);xmlhttp.send();

 如果您希望通过GET方法发送信息,请向URL 添加信息:

实例

xmlhttp.open("GET","demo_get2.html?fname=Henry&lname=Ford",true);xmlhttp.send();

 提示:GET请求具有以下的几个特点:

GET请求可被缓存

GET请求保留在浏览器历史记录中

GET请求可被收藏为书签

GET请求不应在处理敏感数据时使用

GET请求有长度限制

GET请求只应当用于取回数据

POST 请求


 一个简单POST请求:

实例

xmlhttp.open("POST","demo_post.html",true);xmlhttp.send();

 如果需要像HTML 表单那样 POST 数据,请使用setRequestHeader()来添加HTTP 头。然后在send()方法中规定您希望发送的数据:

实例

xmlhttp.open("POST","ajax_test.html",true);xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");xmlhttp.send("fname=Henry&lname=Ford");


方法描述

setRequestHeader(header,value)向请求添加 HTTP 头。

header: 规定头的名称

value: 规定头的值

 提示:POST请求的特点如下:

POST请求不会被缓存

POST请求不会保留在浏览器历史记录中

POST请求不能被收藏为书签

POST请求对数据长度没有要求

url - 服务器上的文件


open()方法的url参数是服务器上文件的地址:

xmlhttp.open("GET","ajax_test.html",true);

 该文件可以是任何类型的文件,比如.txt和.xml,或者服务器脚本文件,比如.asp和.php(在传回响应之前,能够在服务器上执行任务)。

异步- True 或 False?

 AJAX 指的是异步JavaScript 和 XML(Asynchronous JavaScript and XML)。

 XMLHttpRequest 对象如果要用于 AJAX 的话,其open()方法的sync参数必须设置为true:

xmlhttp.open("GET","ajax_test.html",true);

 对于web 开发人员来说,发送异步请求是一个巨大的进步。很多在服务器执行的任务都相当费时。AJAX 出现之前,这可能会引起应用程序挂起或停止。

通过AJAX,JavaScript 无需等待服务器的响应,而是:

在等待服务器响应时执行其他脚本

当响应就绪后对响应进行处理

Async=true

 当使用async=true 时,请规定在响应处于 onreadystatechange 事件中的就绪状态时执行的函数:

实例

xmlhttp.onreadystatechange=function()  {  if (xmlhttp.readyState==4 && xmlhttp.status==200)    {    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;    }  }xmlhttp.open("GET","ajax_info.txt",true);xmlhttp.send();

Async = false

 如需使用async=false,请将open()方法中的第三个参数改为false:

xmlhttp.open("GET","test1.txt",false);

 我们不推荐使用async=false,但是对于一些小型的请求,也是可以的。

 请记住,JavaScript 会等到服务器响应就绪才继续执行。如果服务器繁忙或缓慢,应用程序会挂起或停止。

 注意:当您使用async=false 时,请不要编写 onreadystatechange 函数 - 把代码放到send()语句后面即可:

实例

xmlhttp.open("GET","ajax_info.txt",false);xmlhttp.send();document.getElementById("myDiv").innerHTML=xmlhttp.responseText;


XHR 响应

AJAX - 服务器响应

由于HTTP 响应是由服务端发出的,并且服务器做出响应需要时间(比如网速慢等原因),所以我们需要监听服务器响应的状态,然后才能进行处理。

状态行xhr.status状态码,如200,304,404等;

响应主体xhr.responseText与xhr.responseXML都表示响应主体。

 如需获得来自服务器的响应,请使用XMLHttpRequest 对象的responseText或responseXML属性。

属性描述

responseText获得字符串形式的响应数据。

responseXML获得 XML 形式的响应数据。

responseText 属性

 如果来自服务器的响应并非XML,请使用responseText属性。

 responseText属性返回字符串形式的响应,因此您可以这样使用:

实例

document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

responseXML 属性

 如果来自服务器的响应是XML,而且需要作为 XML 对象进行解析,请使用responseXML属性:

实例

请求cd_catalog.xml 文件,并解析响应:

xmlDoc=xmlhttp.responseXML;txt="";x=xmlDoc.getElementsByTagName("ARTIST");for (i=0;i<x.length;i++)  {  txt=txt + x[i].childNodes[0].nodeValue + "<br>";  }document.getElementById("myDiv").innerHTML=txt;

XHR readyState

AJAX - onreadystatechange 事件

当发送一个请求后,客户端需要确定这个请求什么时候会完成,因此,XMLHttpRequest对象提供了onreadystatechange事件机制来捕获请求的状态,继而实现响应。

 当请求被发送到服务器时,我们需要执行一些基于响应的任务。

 每当readyState改变时,就会触发onreadystatechange事件。

 readyState属性存有XMLHttpRequest 的状态信息。

 下面是XMLHttpRequest 对象的三个重要的属性:

属性描述

onreadystatechange存储函数(或函数名),每当readyState属性改变时,就会调用该函数。

readyState存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。

0: 请求未初始化

1: 服务器连接已建立

2: 请求已接收

3: 请求处理中

4: 请求已完成,且响应已就绪

status200: "OK"404: 未找到页面

readyState状态说明

 0:请求未初始化

 此阶段确认XMLHttpRequest对象是否创建,并为调用open()方法进行未初始化作好准备,值为0表示对象已经存在,否则浏览器会报错:对象不存在。

 1:服务器连接已建立

 此阶段对XMLHttpRequest对象进行初始化,即调用open()方法,根据参数(method,url,true)完成对象状态的设置。并调用send()方法开始向服务端发送请求。

 值为1表示正在向服务端发送请求。

 2:请求已接收

 此阶段接收服务器端的响应数据。但获得的还只是服务端响应的原始数据,并不能直接在客户端使用。

 值为2表示已经接收完全部响应数据,并为下一阶段对数据解析作好准备。

 3:请求处理中

 此阶段解析接收到的服务器端响应数据即根据服务器端响应头部返回的MIME类型把数据转换成能通过responseBody,responseText或responseXML的属性存取的格式,为在客户端调用作好准备。

 状态3表示正在解析数据。

 4:请求已完成,且响应已就绪

 此阶段确认全部数据都已经解析为客户端可用的格式,解析已经完成。值为4表示数据解析完毕,可以通过的XMLHttpRequest对象的属性取得数据。

概而括之,整个XMLHttpRequest对象的生命周期应该包含如下阶段:

1.创建2.初始化请求3.发送请求4.接收数据5.解析数据6.完成

在onreadystatechange事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。

 当readyState等于4 且状态为 200 时,表示响应已就绪:

实例

xmlhttp.onreadystatechange=function()  {  if (xmlhttp.readyState==4 && xmlhttp.status==200)    {    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;    }  }

在onreadystatechange事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。

 当readyState等于4 且状态为 200 时,表示响应已就绪:

实例

xmlhttp.onreadystatechange=function()  {  if (xmlhttp.readyState==4 && xmlhttp.status==200)    {    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;    }  }

使用回调函数


 回调函数是一种以参数形式传递给另一个函数的函数。

 如果您的网站上存在多个AJAX 任务,那么您应该为创建 XMLHttpRequest 对象编写一个标准的函数,并为每个AJAX 任务调用该函数。

 该函数调用应该包含URL 以及发生onreadystatechange事件时执行的任务(每次调用可能不尽相同):

实例

function myFunction(){loadXMLDoc("ajax_info.txt",function()  {  if (xmlhttp.readyState==4 && xmlhttp.status==200)    {    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;    }  });}


<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<script>

var xmlhttp;

function loadXMLDoc(url,cfunc)

{

if (window.XMLHttpRequest)

  {// IE7+, Firefox, Chrome, Opera, Safari 代码

  xmlhttp=new XMLHttpRequest();

  }

else

  {// IE6, IE5 代码

  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

  }

xmlhttp.onreadystatechange=cfunc;

xmlhttp.open("GET",url,true);

xmlhttp.send();

}

function myFunction()

{

loadXMLDoc("/statics/demosource/ajax_info.txt",function()

  {

  if (xmlhttp.readyState==4 && xmlhttp.status==200)

    {

    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

    }

  });

}

</script>

</head>

<body>

<div id="myDiv"><h2>使用 AJAX 修改文本内容</h2></div>

<button type="button" onclick="myFunction()">修改内容</button>

</body>

</html>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  •   2005 年,Jesse James Garrett 发表了一篇在线文章,题为“Ajax: A new App...
    霜天晓阅读 888评论 0 1
  • AJAX 原生js操作ajax 1.创建XMLHttpRequest对象 var xhr = new XMLHtt...
    碧玉含香阅读 3,192评论 0 7
  • 一、Ajax是什么 Ajax:全称是“Asynchronous Javascript And Xml”,翻译成...
    前端攻城狮子王阅读 507评论 0 4
  • Ajax学习笔记 Ajax简介 1. Ajax是什么? Ajax : Asynochronous javascri...
    月上秦少阅读 419评论 0 1
  • 最喜欢站在校门口微笑着迎接来上学的孩子们,虽然他们个个脸有忧色、睡眼惺忪。 也最喜欢站在校门口微笑地看着孩子们回家...
    小周老师阅读 416评论 0 0