Ajax完全细致亚博教程(三)

Ajax完全细致亚博教程(三)

宝塔thinkphp报错怎么解决

第一步,进入“网站目录”,将“防跨站攻击”的勾选取消。||第二步,进入“软件管理”,然后找到所安装的PHP。||第三步,点击“设置”,在“php服务”中点击“重启”即可。

在本系列的 上篇文章 中,我们将细致引见 XMLHttpRequest 对象,它是 Ajax 应用顺序的中间,担任处置惩罚效劳器端应用顺序和剧本的请求,并处置惩罚从效劳器端组件返回的数据。由于统统的 Ajax 应用顺序都要运用XMLHttpRequest 对象,因而您能够会愿望熟习这个对象,从而能够让 Ajax 实行得更好。

然则关于愿望掌握 Ajax 的开辟人员来讲,必需要周全明白:
1、HTTP 状况代码
2、HTTP 停当状况
3、XMLHttpRequest 对象。

XMLHttpRequest 对象,它是 Ajax 应用顺序的中间,担任处置惩罚效劳器端应用顺序和剧本的请求,并处置惩罚从效劳器端组件返回的数据。统统的 Ajax 应用顺序都要运用 XMLHttpRequest 对象。

重点引见这个请求对象的 3 个症结部份的内容:

•HTTP 停当状况
•HTTP 状况代码
•能够天生的请求范例

假如您不仅仅是想相识 Ajax 编程的基本学问,而是愿望相识更多内容,就须要熟习停当状况、状况代码和请求自身的内容。当应用顺序涌现题目时 —— 这类题目老是存在 —— 那末假如能够准确明白停当状况、怎样天生一个 HEAD 请求或许 400 的状况代码确实实寄义,就能够在 5 分钟内调试出题目,而不是在种种波折和疑心中渡过 5 个小时。

深切相识 HTTP 停当状况

XMLHttpRequest 对象的 readyState 的属性:这个属性确保效劳器已完成了一个请求,一般会运用一个回调函数从效劳器中读出数据来更新 Web 表单或页面的内容。清单 1 给出了一个简朴的例子:

清单 1. 在回调函数中处置惩罚效劳器的相应

function updatePage() {
   if (request.readyState == 4) {
     if (request.status == 200) {
       var response = request.responseText.split("|");
       document.getElementById("order").value = response[0];
       document.getElementById("address").innerHTML =
         response[1].replace(/\n/g, "<br />");
     } else
       alert("status is " + request.status);
   }
}

这显著是停当状况最稀有(也是最简朴)的用法。正如您从数字 “4” 中能够看出的一样,另有其他几个停当状况:

0:请求未初始化(还没有挪用 open())。
1:请求已竖立,然则还没有发送(还没有挪用 send())。
2:请求已发送,正在处置惩罚中(一般如今能够从相应中猎取内容头)。
3:请求在处置惩罚中;一般相应中已有部份数据可用了,然则效劳器还没有完成相应的天生。
4:相应已完成;您能够猎取并运用效劳器的相应了。

隐蔽停当状况

第一种停当状况的特点是 readyState 属性为 0(readyState == 0),示意未初始化状况。**一旦对请求对象挪用 open() 以后,这个属性就被设置为 1。**由于您一般都是在一对请求举行初始化以后就立时挪用 open(),因而很少会看到 readyState == 0 的状况。别的,未初始化的停当状况在现实的应用顺序中是没有真正的用途的。

不过为了满足我们的兴致,请拜见 清单 2 的内容,个中显现了怎样在 readyState 被设置为 0 时来猎取这类停当状况。

清单 2. 猎取 0 停当状况

  function getSalesData() {
     // 建立一个请求对象
     createRequest();  
     alert("Ready state is: " + request.readyState);

     // 最先(初始化)这个请求
     var url = "/boards/servlet/UpdateBoardSales";
     request.open("GET", url, true);
     request.onreadystatechange = updatePage;
     request.send(null);
   }

在这个简朴的例子中,getSalesData() 是 Web 页面挪用来启动请求(比方点击一个按钮时)所运用的函数。注重您必需在挪用 open()之前 来检察停当状况。图 1 给出了运转这个应用顺序的结果。

图 1. 停当状况 0

显著,这并不能为您带来若干优点;须要确保 还没有 挪用 open() 函数的状况很少。在大部份 Ajax 编程的真实状况中,这类停当状况的唯一用法就是运用雷同的 XMLHttpRequest 对象在多个函数之间天生多个请求。在这类(不稀有的)状况中,您能够会在天生新请求之前愿望确保请求对象是处于未初始化状况(readyState == 0)。这现实上是要确保别的一个函数没有同时运用这个对象。

检察正在处置惩罚的请求的停当状况

除了 0 停当状况以外,请求对象还须要顺次阅历典范的要乞降相应的其他几种停当状况,末了才以停当状况 4 的情势完毕。这就是为何您在大部份回调函数中都能够看到 if (request.readyState == 4) 这行代码;它确保效劳器已完成对请求的处置惩罚,如今能够平安地更新 Web 页面或依据从效劳器返返来的数据来举行操作了。

要检察这类状况发作的历程异常简朴。假如停当状况为 4,我们不仅要运转回调函数中的代码,而且还要在每次挪用回调函数时都输出停当状况。 清单 3 给出了一个完成这类功用的例子。

清单 3. 检察停当状况

   function updatePage() {
     // 输出当前状况
     alert("updatePage() called with ready state of " + request.readyState);
   }

当 0 即是 4 时

在多个 JavaScript 函数都运用雷同的请求对象时,您须要搜检停当状况 0 来确保这个请求对象没有正在运用,这类机制会发生题目。由于 readyState == 4 示意一个已完成的请求,因而您常常会发明那些现在没在运用的处于停当状况的请求对象依旧被设置成了 4 —— 这是由于从效劳器返返来的数据已运用过了,然则从它们被设置为停当状况以后就没有举行任何变化。有一个函数 abort() 会从新设置请求对象,然则这个函数却不是真正为了这个目标而运用的。假如您 必需 运用多个函数,最好是为每一个函数都建立并运用一个函数,而不是在多个函数之间同享雷同的对象。

假如您不肯定怎样运转这个函数,就须要建立一个函数,然后在 Web 页面中挪用这个函数,并让它向效劳器端的组件发送一个请求(比方 清单 2 给出的函数,或本系列文章的第 1 部份和第 2 部份中给出的例子)。确保在竖立请求时,将回调函数设置为 updatePage();要完成这类设置,能够将请求对象的 onreadystatechange 属性设置为 updatePage()。

这段代码就是 onreadystatechange 意义的一个确实展现 —— 每次请求的停当状况发作变化时,就挪用 updatePage(),然后我们就能够看到一个正告了。

图 2. 停当状况 1

您能够本身尝试运转这段代码。将其放入 Web 页面中,然后激活事宜处置惩罚顺序(单击按钮,在域之间按 tab 键切换核心,或许运用设置的任何要领来触发请求)。这个回调函数会运转屡次 —— 每次停当状况都邑转变 —— 您能够看到每一个停当状况的正告。这是跟踪请求所阅历的各个阶段的最好要领。

阅读器的不一致性

在对这个历程有一个基本的相识以后,请试着从几个差别的阅读器中接见您的页面。您应当会注重到各个阅读器怎样处置惩罚这些停当状况并不一致。比方,在 Firefox 1.5 中,您会看到以下停当状况:

•1
•2
•3
•4

这并不新颖,由于每一个请求状况都在这里示意出来了。但是,假如您运用 Safari 来接见雷同的应用顺序,就应当看到 —— 或许看不到 —— 一些风趣的事变。下面是在 Safari 2.0.1 中看到的状况:

•2
•3
•4

Safari 现实上把第一个停当状况给抛弃了,也并没有什么显著的缘由说明为何要如许做;不过这就是 Safari 的事情体式格局。这还申清晰明了一个主要的题目:只管在运用效劳器上的数据之前确保请求的状况为 4 是一个好主意,然则依赖于每一个过渡期停当状况编写的代码确实会在差别的阅读器上取得差别的结果。

比方,在运用 Opera 8.5 时,所显现的停当状况状况就越发糟糕了:

•3
•4

末了,Internet Explorer 会显现以下状况:

•1
•2
•3
•4

假如您碰到请求方面的题目,这就是用来发明题目标 主要的处所。最好的体式格局是在 Internet Explorer 和 Firefox 都举行一下测试 —— 您会看到统统这 4 种状况,并能够搜检请求的每一个状况所处的状况。

接下来我们再来看一下相应端的状况。

显微镜下的相应数据

一旦我们明白在请求历程当中发作的各个停当状况以后,接下来就能够来看一下 XMLHttpRequest 对象的别的一个方面了 —— responseText 属性。追念一下在上一篇文章中我们引见过的内容,就能够晓得这个属性用来从效劳器上猎取数据。一旦效劳器完成对请求的处置惩罚以后,就能够将相应请求数据所须要的任何数据放到请求的 responseText 中了。然后回调函数就能够运用这些数据,如 清单 1 和 清单 4 所示。

清单 4. 运用效劳器上返回的相应

 function updatePage() {
     if (request.readyState == 4) {
       var newTotal = request.responseText;
       var totalSoldEl = document.getElementById("total-sold");
       var netProfitEl = document.getElementById("net-profit");
       replaceText(totalSoldEl, newTotal);

       /* 图 out the new net profit */
       var boardCostEl = document.getElementById("board-cost");
       var boardCost = getText(boardCostEl);
       var manCostEl = document.getElementById("man-cost");
       var manCost = getText(manCostEl);
       var profitPerBoard = boardCost - manCost;
       var netProfit = profitPerBoard * newTotal;

       /* Update the net profit on the sales form */
       netProfit = Math.round(netProfit * 100) / 100;
       replaceText(netProfitEl, netProfit);
     }
 }

清单 1 相称简朴;清单 4 轻微有点庞杂,然则它们在最先时都要搜检停当状况,并猎取 responseText 属性的值。

检察请求的相应文本

与停当状况相似,responseText 属性的值在全部请求的生命周期中也会发作变化。要检察这类变化,请运用如 清单 5 所示的代码来测试请求的相应文本,以及它们的停当状况。

清单 5. 测试 responseText 属性

   function updatePage() {
     // Output the current ready state
     alert("updatePage() called with ready state of " + request.readyState +
           " and a response text of '" + request.responseText + "'");
     }

如今在阅读器中翻开 Web 应用顺序,并激活您的请求。要更好地看到这段代码的结果,请运用 Firefox 或 Internet Explorer,由于这两个阅读器都能够报告出请求历程当中统统能够的停当状况。比方在停当状况 2 中,就没有定义 responseText ;假如 JavaScript 掌握台也已翻开了,您就会看到一个毛病。

图 3. 停当状况为 2 的相应文本

不过在停当状况 3 中,效劳器已在 responseText 属性中放上了一个值,至少在这个例子中是如许

图 4. 停当状况为 3 的相应文本

您会看到停当状况为 3 的相应在每一个剧本、每一个效劳器以至每一个阅读器上都是不一样的。不过,这在调试应用顺序中依旧是异常有用的。

猎取平安数据

统统的文档和范例都强调,只需在停当状况为 4 时数据才够平安运用。置信我,当停当状况为 3 时,您很少能找到没法从 responseText 属性猎取数据的状况。但是,在应用顺序中将本身的逻辑依赖于停当状况 3 可不是什么好主意 —— 一旦您编写了依赖于停当状况 3 的完整数据的的代码,险些就要本身来担任当时的数据不完整题目了。

比较好的做法是向用户供应一些反应,说明在处于停当状况 3 时,很快就会有相应了。只管运用 alert() 之类的函数显著不是什么好主意 —— 运用 Ajax 然后运用一个正告对话框来壅塞用户显著是毛病的 —— 不过您能够在停当状况发作变化时更新表单或页面中的域。比方,关于停当状况 1 来讲要将进度指导器的宽度设置为 25%,关于停当状况 2 来讲要将进度指导器的宽度设置为 50%,关于停当状况 3 来讲要将进度指导器的宽度设置为 75%,当停当状况为 4 时将进度指导器的宽度设置为 100%(完成)。

固然,正如您已看到的一样,这类要领异常智慧,但它是依赖于阅读器的。在 Opera 上,您永远都不会看到前两个停当状况,而在 Safari 上则没有第一个(1)。由于这个缘由,我将这段代码留作演习,而没有在本文中包括进来。

深切相识 HTTP 状况代码

有了停当状况和您在 Ajax 编程手艺中进修到的效劳器的相应,您就能够为 Ajax 应用顺序增添别的一级庞杂性了 —— 这要运用 HTTP 状况代码。这些代码关于 Ajax 来讲并没有什么新颖。从 Web 涌现以来,它们就已存在了。在 Web 阅读器中您能够已看到过几个状况代码:

401:未经受权
403:制止
404:没找到

您能够找到更多的状况代码。

有关XML解析中DOM解析的详细介绍

xml文件多用于信息的描述,所以在得到一个xml文档之后按照xml中的元素取出对应的信息就是xml的解析。Xml解析有两种方式,一种是DOM解析,另一种是SAX解析

xmlhttp.readyState的值及诠释:
0:请求未初始化(还没有挪用 open())。
1:请求已竖立,然则还没有发送(还没有挪用 send())。
2:请求已发送,正在处置惩罚中(一般如今能够从相应中猎取内容头)。
3:请求在处置惩罚中;一般相应中已有部份数据可用了,然则效劳器还没有完成相应的天生。
4:相应已完成;您能够猎取并运用效劳器的相应了。

xmlhttp.status的值及诠释:
100——客户必需继承发出请求
101——客户请求效劳器依据请求转换HTTP协定版本

200——生意业务胜利
201——提醒晓得新文件的URL
202——吸收和处置惩罚、但处置惩罚未完成
203——返回信息不肯定或不完整
204——请求收到,但返回信息为空
205——效劳器完成了请求,用户代办必需复位当前已阅读过的文件
206——效劳器已完成了部份用户的GET请求

300——请求的资本可在多处取得
301——删除请求数据
302——在其他地点发清晰明了请求数据
303——发起客户接见其他URL或接见体式格局
304——客户端已实行了GET,但文件未变化
305——请求的资本必需从效劳器指定的地点取得
306——前一版本HTTP中运用的代码,现行版本中不再运用
307——说明请求的资本临时性删除

400——毛病请求,如语法毛病
401——请求受权失利
402——保存有用ChargeTo头相应
403——请求不许可
404——没有发明文件、查询或URl
405——用户在Request-Line字段定义的要领不许可
406——依据用户发送的Accept拖,请求资本不可接见
407——相似401,用户必需起首在代办效劳器上取得受权
408——客户端没有在用户指定的饿时候内完成请求
409——对当前资本状况,请求不能完成
410——效劳器上不再有此资本且无进一步的参考地点
411——效劳器谢绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中毛病
413——请求的资本大于效劳器许可的大小
414——请求的资本URL善于效劳器许可的长度
415——请求资本不支撑请求项目花样
416——请求中包括Range请求头字段,在当前请求资本范围内没有range指导值,请求也不包括If-Range请求头字段
417——效劳器不满足请求Expect头字段指定的希冀值,假如是代办效劳器,多是下一级效劳器不能满足请求合起来

500——效劳器发生内部毛病
501——效劳器不支撑请求的函数
502——效劳器临时不可用,偶然是为了防备发作体系过载
503——效劳器过载或停息维修
504——关隘过载,效劳器运用另一个关隘或效劳来相应用户,等待时候设定值较长
505——效劳器不支撑或谢绝支请求头中指定的HTTP版本

1xx:信息相应类,示意吸收到请求而且继承处置惩罚
2xx:处置惩罚胜利相应类,示意行动被胜利吸收、明白和吸收
3xx:重定向相应类,为了完成指定的行动,必需吸收进一步处置惩罚
4xx:客户端毛病,客户请求包括语法毛病或许是不能准确实行
5xx:效劳端毛病,效劳器不能准确实行一个准确的请求

xmlhttp.readyState4 && xmlhttp.status200的诠释:请求完成而且胜利返回

要为 Ajax 应用顺序别的增添一层掌握和相应(以及更加硬朗的毛病处置惩罚)机制,您须要恰当地检察要乞降相应中的状况代码。

200:统统一般

在许多 Ajax 应用顺序中,您将看到一个回调函数,它担任搜检停当状况,然后继承应用从效劳器相应中返回的数据,如 清单 6 所示。

清单 6. 疏忽状况代码的回调函数

   function updatePage() {
     if (request.readyState == 4) {
       var response = request.responseText.split("|");
       document.getElementById("order").value = response[0];
       document.getElementById("address").innerHTML =
         response[1].replace(/\n/g, "<br />");
     }
   }

这关于 Ajax 编程来讲证实是一种短视而毛病的要领。假如剧本须要认证,而请求却没有供应有用的证书,那末效劳器就会返回诸如 403 或 401 之类的毛病代码。但是,由于效劳器对请求举行了应对,因而停当状况就被设置为 4(纵然应对并非请求所希冀的也是云云)。终究,用户没有取得有用数据,当 JavaScript 试图运用不存在的效劳器数据时便能够会涌现严峻的毛病。

它消费了最小的勤奋来确保效劳器不只完成了一个请求,而且还返回了一个 “统统优越” 的状况代码。这个代码是 “200”,它是经由过程 XMLHttpRequest 对象的 status 属性来报告的。为了确保效劳器不只完成了一个请求,而且还报告了一个 OK 状况,请在您的回调函数中增添别的一个搜检功用,如 清单 7 所示。

清单 7. 搜检有用状况代码

  function updatePage() {
     if (request.readyState == 4) {
       if (request.status == 200) {
         var response = request.responseText.split("|");
         document.getElementById("order").value = response[0];
         document.getElementById("address").innerHTML =
           response[1].replace(/\n/g, "<br />");
       } else
         alert("status is " + request.status);
     }
   }

经由过程增添这几行代码,您就能够确认是不是存在题目,用户会看到一个有用的毛病音讯,而不仅仅是看到一个由断章取义的数据所组成的页面,而没有任何诠释。

重定向和从新路由

在深切引见有关毛病的内容之前,我们有必要来议论一下有关一个在运用 Ajax 时 并不须要 体贴的题目 —— 重定向。在 HTTP 状况代码中,这是 300 系列的状况代码,包括:

301:永远挪动
302:找到(请求被从新定向到别的一个 URL/URI 上)
305:运用代办(请求必需运用一个代办来接见所请求的资本)

Ajax 顺序员能够并不太体贴有关重定向的题目,这是由于两方面的缘由:

1、起首,Ajax 应用顺序一般都是为一个特定的效劳器端剧本、servlet或应用顺序而编写的。关于那些您看不到就消逝了的组件来讲,Ajax顺序员就不太清晰了。因而偶然您会晓得资本已挪动了(由于您挪动了它,或许经由过程某种手腕挪动了它),接下来要修正请求中的URL,而且不会再碰到这类结果了。

2、更加主要的一个缘由是:Ajax 应用顺序和请求都是封装在沙盒中的。这就意味着供应天生 Ajax 请求的 Web页面的域必需是对这些请求举行相应的域。因而 ebay.com 所供应的 Web 页面就不能对一个在 amazon.com上运转的剧本天生一个 Ajax 作风的请求;在 ibm.com 上的 Ajax 应用顺序也没法对在 netbeans.org 上运转的servlets 发出请求。

结果是您的请求没法重定向到其他效劳器上,而不会发生平安性毛病。在这些状况中,您基本就不会取得状况代码。一般在调试掌握台中都邑发生一个 JavaScript 毛病。因而,在对状况代码举行充足的斟酌以后,您就能够完整疏忽重定向代码的题目了。

毛病

一旦吸收到状况代码 200 而且意想到能够很大程度上疏忽 300 系列的状况代码以后,所须要忧郁的唯一一组代码就是 400 系列的代码了,这申清晰明了差别范例的毛病。转头再来看一下 清单 7,并注重在对毛病举行处置惩罚时,只将少数稀有的毛病音讯输出给用户了。只管这是朝准确方向行进的一步,然则要通知处置应用顺序开辟的用户和顺序员终究发作了什么题目,这些音讯依旧是没有太大用途的。

起首,我们要增添对找不到的页的支撑。现实上这在大部份产物体系中都不应当涌现,然则在测试剧本位置发作变化或顺序员输入了毛病的 URL 时,这类状况并不稀有。假如您能够自然地报告 404 毛病,就能够为那些搅扰不堪的用户和顺序员供应更多协助。比方,假如效劳器上的一个剧本被删除了,我们就能够运用 清单 7 中的代码,如许用户就会看到一个非描述性毛病。

图 5. 稀有毛病处置惩罚

边境状况和难题状况

看到如今,一些新手顺序员便能够会这终究是要议论什么内容。有一点现实人人须要晓得:只需不到 5% 的 Ajax 请求须要运用诸如 2、3 之类的停当状况和诸如 403 之类的状况代码(现实上,这个比率能够更接近于 1% 以至更少)。这些状况异常主要,称为 边境状况(edge case) —— 它们只会在一些异常特别的状况下发作,个中碰到的都是最奇异的题目。虽然这些状况并不广泛,然则这些边境状况却占有了大部份用户所碰到的题目标 80%!

关于典范的用户来讲,应用顺序 100 次都是一般事情的这个现实一般都邑被遗忘,但是应用顺序只需一次失足就会被他们清晰地记着。假如您能够很好地处置惩罚边境状况(或难题状况),就能够为再次接见站点的用户供应惬意的报答。

用户没法推断题目终究是认证题目、没找到剧本(此处就是这类状况)、用户毛病照样代码中有些处所发生了题目。增添一些简朴的代码能够让这个毛病越发详细。请参照 清单 8,它担任处置惩罚没找到的剧本或认证发作毛病的状况,在涌现这些毛病时都邑给出详细的音讯。

清单 8. 搜检有用状况代码

   function updatePage() {
     if (request.readyState == 4) {
       if (request.status == 200) {
         var response = request.responseText.split("|");
         document.getElementById("order").value = response[0];
         document.getElementById("address").innerHTML =
           response[1].replace(/\n/g, "<br />");
       } else if (request.status == 404) {
         alert ("Requested URL is not found.");
       } else if (request.status == 403) {
         alert("Access denied.");
       } else
         alert("status is " + request.status);
     }
   }

虽然这依旧相称简朴,然则它确实多供应了一些有用的信息。图 6 给出了与 图 5 雷同的毛病,然则这一次毛病处置惩罚代码向用户或顺序员更好地申清晰明了终究发作了什么。

图 6. 特别毛病处置惩罚

在我们本身的应用顺序中,能够斟酌在发作认证失利的状况时消灭用户名和暗码,并向屏幕上增添一条毛病音讯。我们能够运用相似的要领来更好地处置惩罚找不到剧本或其他 400 范例的毛病(比方 405 示意不许可运用诸如发送 HEAD 请求之类不可吸收的请求要领,而 407 则示意须要举行代办认证)。但是不论采纳哪一种挑选,都须要从对效劳器上返回的状况代码最先入手举行处置惩罚。

其他请求范例

假如您真愿望掌握 XMLHttpRequest 对象,能够斟酌末了完成这类功用 —— 将 HEAD 请求增添到指令中。在前两篇文章中,我们已引见了怎样天生 GET 请求;在立时就要宣布的一篇文章中,您会进修有关运用 POST 请求将数据发送到效劳器上的学问。不过本着加强毛病处置惩罚和信息汇集的精力,您应当进修怎样天生 HEAD 请求。

天生请求

现实上天生 HEAD 请求异常简朴;您能够运用 “HEAD”(而不是 “GET” 或 “POST”)作为第一个参数来挪用 open() 要领,如 清单 9 所示。

清单 9. 运用 Ajax 天生一个 HEAD 请求

  function getSalesData() {
     createRequest();
     var url = "/boards/servlet/UpdateBoardSales";
     request.open("HEAD", url, true);
     request.onreadystatechange = updatePage;
     request.send(null);
   }

当您如许天生一个 HEAD 请求时,效劳器并不会像对 GET 或 POST 请求一样返回一个真正的相应。相反,效劳器只会返回资本的 头(header),这包括相应中内容末了修正的时候、请求资本是不是存在和许多其他有用信息。您能够在效劳器处置惩罚并返回资本之前运用这些信息来相识有关资本的信息。

关于这类请求您能够做的最简朴的事变就是简朴地输出统统的相应头的内容。这能够让您相识经由过程 HEAD 请求能够运用什么。清单 10 供应了一个简朴的回调函数,用来输出从 HEAD 请求中取得的相应头的内容。

清单 10. 输出从 HEAD 请求中取得的相应头的内容

  function updatePage() {
     if (request.readyState == 4) {
       alert(request.getAllResponseHeaders());
     }
   }

搜检 URL

您已看到了当 URL 不存在时应当怎样搜检 404 毛病。假如这变成一个稀有的题目 —— 多是缺少了一个特定的剧本或 servlet —— 那末您便能够会愿望在天生完整的 GET 或 POST 请求之前来搜检这个 URL。要完成这类功用,天生一个 HEAD 请求,然后在回调函数中搜检 404 毛病;清单 11 给出了一个简朴的回调函数。

清单 11. 搜检某个 URL 是不是存在

   function updatePage() {
     if (request.readyState == 4) {
       if (request.status == 200) {
         alert("URL exists");
       } else if (request.status == 404) {
         alert("URL does not exist.");
       } else {
         alert("Status is: " + request.status);
       }
     }
   }

诚实地说,这段代码的代价并不太大。效劳器必需对请求举行相应,并组织一个相应来添补内容长度的相应头,因而并不能节约任何处置惩罚时候。别的,这消费的时候与天生请求并运用 HEAD 请求来检察 URL 是不是存在所须要的时候一样多,由于它要天生运用 GET 或 POST 的请求,而不仅仅是如 清单 7 所示一样来处置惩罚毛病代码。不过,偶然确实地相识现在什么可用也是异常有用的;您永远不会晓得什么时候创造力就会迸发或许什么时候须要 HEAD 请求!

有用的 HEAD 请求

您会发明 HEAD 请求异常有用的一个范畴是用来检察内容的长度或内容的范例。如许能够肯定是不是须要发还大批数据来处置惩罚请求,和效劳器是不是试图返回二进制数据,而不是 HTML、文本或 XML(在 JavaScript 中,这 3 种范例的数据都比二进制数据更轻易处置惩罚)。

在这些状况中,您只运用了恰当的头名,并将其传递给 XMLHttpRequest 对象的 getResponseHeader() 要领。因而:

要猎取相应的长度,只须要挪用
request.getResponseHeader(“Content-Length”);
要猎取内容范例,请运用
request.getResponseHeader(“Content-Type”);

在许多应用顺序中,天生 HEAD 请求并没有增添任何功用,以至能够会致使请求速率变慢(经由过程强迫天生一个 HEAD 请求来猎取有关相应的数据,然后在运用一个 GET 或 POST 请求来真正猎取相应)。但是,在涌现您不肯定有关剧本或效劳器端组件的状况时,运用 HEAD 请求能够猎取一些基本的数据,而不须要对相应数据真正举行处置惩罚,也不须要大批的带宽来发送相应。

完毕语

关于许多 Ajax 和 Web 顺序员来讲,本文中引见的内容似乎是太高等了。天生 HEAD 请求的代价是什么呢?到底在什么状况下须要在 JavaScript 中显式地处置惩罚重定向状况代码呢?这些都是很好的题目;关于简朴的应用顺序来讲,答案是这些高等手艺的代价并非异常大。

但是,Web 已不再是只需完成简朴应用顺序的处所了;用户已变得越发高等,客户希冀能够取得更好的稳定性、更高等的毛病报告,假如应用顺序有 1% 的时候停机,那末司理便能够会因而而被开除。

因而您的事情就不能仅仅局限于简朴的应用顺序了,而是须要更深切明白 XMLHttpRequest。

•假如您能够斟酌种种停当状况 —— 而且明白了这些停当状况在差别阅读器之间的区分 —— 就能够疾速调试应用顺序了。您以至能够基于停当状况而开辟一些创造性的功用,并向用户和客户报答请求的状况。•假如您要对状况代码举行掌握,就能够设置应用顺序来处置惩罚剧本毛病、非预期的相应以及边沿状况。结果是应用顺序在统统的时候都能够一般事情,而不仅仅是只能统统都一般的状况下才运转。•增添这类天生 HEAD 请求的才能,搜检某个 URL 是不是存在,以及确认某个文件是不是被修正过,如许就能够确保用户能够取得有用的页面,用户所看到的信息都是最新的,(最主要的是)让他们惊奇这个应用顺序是怎样硬朗和通用。

本文的目标并非是要让您的应用顺序显得非常华美,而是协助您去掉黄色聚光灯后重点昭显笔墨的优美,或许外表更像桌面一样。只管这些都是 Ajax 的功用(在后续几篇文章中就会引见),不过它们却像是蛋糕外表的一层奶油。假如您能够运用 Ajax 来构建一个坚固的基本,让应用顺序能够很好地处置惩罚毛病和题目,用户就会返回您的站点和应用顺序。在接下来的文章中,我们将增添这类直观的技能,这会让客户高兴得股栗 。

更多相干题目请接见亚博映像:Ajax视频教程

本文系列文章:

Ajax完整细致教程(一)

Ajax完整细致教程(二)

Python中你必须了解的知识

python中常用的单行注释是# ,常用多行注释是三对单引号”’ ”’。python中的关键字:False、None、True、and、as、assert、break、class、continue、def、del,等等。

Up Next:

怎样设置thinkphp验证码的宽高

怎样设置thinkphp验证码的宽高