走进 Ajax


目录

一、什么是Ajax

二、XMLHttpRequest 对象

1.创建 XMLHttpRequest 对象

2.向服务器发送请求

3.服务器响应

三、总结


一、什么是Ajax

Ajax 是一种异步加载页面内容的技术,即用户点击了某个链接之后,可以只更新页面中的一小部分而不用重新加载整个网页。Ajax 的主要优势就是对页面的处理以异步方式发送到服务器,而服务器不会用整个页面来响应请求,它会在后台处理请求。与此同时,用户可以继续浏览页面并与页面进行交互。相应的脚本则可以按需加载和创建页面内容,而不会打断用户的浏览体验。


图1.1 Ajax 加载

二、XMLHttpRequest 对象

XMLHttpRequest 对象是 Ajax 技术的核心,这个角色充当着脚本与服务器之间中间人的角色,这个对象可以自己发送请求也可以自己处理请求。

1.创建 XMLHttpRequest 对象

考虑到所有浏览器的支持(大部分浏览器基于 XMLHttpRequest 对象来创建新对象,IE部分版本的浏览器实现方式则不同),创建新对象的方法可以这样写:

function getHTTPObject () {
  if(typeof XMLHttpRequest == "undifined")
    XMLHttpRequest = function () {
      try { return new ActiveXObject("Msxml2.XMLHTTP.6.0");}
       catch (e) {}
      try { return new ActiveXObject("Msxml2.XMLHTTP.3.0");}
       catch (e) {}
      try { return new ActiveXObject("Msxml2.XMLHTTP");}
       catch (e) {}
      return false;
    }
    return new XMLHttpRequest();
}

有了这个方法后,在脚本中要使用 XMLHttpRequest 对象时,可以直接将新对象赋值给一个新变量:

var request = getHTTPObject();

2.向服务器发送请求

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

xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();
  • open(method,url,async):规定请求的类型、URL 以及是否异步处理请求。
    其中,method:请求的类型;GET 或 POST;url:文件在服务器上的位置;async:true(异步)或 false(同步)
  • send(string):将请求发送到服务器,其中,string:仅用于 POST 请求。

如下面的代码会在页面加载完成时发起一个 get 请求,请求与本文件位于同一文件夹的 example.txt 文件:

function getNewContent() {
    var request = getHTTPObject();
    if(request) {
   //指定请求的目标
        request.open("GET","example.txt",true);
   //明确如何处理相应
        request.onreadystatechange = function () {//onreadystatechange函数会在服务器给XMLHttpRequest对象送回响应的时候被触发执行
            if(request.readyState==4) {
                var para = document.createElement("p");
                var txt = document.createTextNode(request.responseText);
                para.appendChild(txt);
                document.getElementById('new').appendChild(para);
            }
        };
   //发送请求
        request.send(null);
    } else {
        alert("Sorry,your browser doesn't support XMLHttpRequest");
    }
}

在这个例子中,onreadystatechange 事件处理函数在等到 readyState 值变为4之后,就会从responseText 属性里取得文本数据,然后把数据放到一个段落里,再将新段落添加到 DOM 里。
其中,有几个比较重要的 XMLHttpRequest 对象属性:

属性 描述
onreadystatechange 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
readyState 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。0: 请求未初始化;1: 服务器连接已建立;2: 请求已接收;3: 请求处理中;4: 请求已完成,且响应已就绪
status 200: "OK";404: 未找到页面

3.服务器响应

使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性可以获得服务器的响应:

属性 描述
responseText 获得字符串形式的响应数据。
responseXML 获得 XML 形式的响应数据。

如上面的例子代码中就运用到了 responseText 属性。下面的代码则运用了 responseXML 属性来获得服务器的响应:

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;

除了上面的简单地获取服务器中 .txt 文件的内容之外,Ajax 还可以和 web 服务器中的 ASP 页面或 PHP等脚本文件进行相关的通信,实现更加复杂多样的功能。

三、总结

Ajax 技术的运用可以减少了许多页面重新加载的次数,减少用户重复刷新页面的次数,但同时,这种缺少记录的技术会与浏览器的一些使用惯例产生冲突,如无法使用后退按钮或为指定的页面添加书签等。另外,使用了 Ajax 技术的站点,用户必须启用了 JavaScript 功能之后才能正常访问,在运用 Ajax 技术的同时,如何做到平稳退化也是一个需要好好考虑的方面。

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

推荐阅读更多精彩内容