本條目存在以下問題,請協助改善本條目或在討論頁針對議題發表看法。 此條目可能包含原创研究。 (2019年1月20日)请协助補充参考资料、添加相关内联标签和删除原创研究内容以改善这篇条目。详细情况请参见讨论页。 此條目需要补充更多来源。 (2019年1月20日)请协助補充多方面可靠来源改善这篇条目无法查证的内容可能會因為异议提出而被移除。致使用者:请搜索一下条目的标题(来源搜索:"AJAX"网页新闻书籍学术图像),以检查网络上是否存在该主题的更多可靠来源(判定指引)。 此條目可参照德語維基百科相應條目来扩充。若您熟悉来源语言和主题,请协助参考外语维基百科扩充条目。请勿直接提交机械翻译,也不要翻译不可靠、低品质内容。依版权协议,译文需在编辑摘要注明来源,或于讨论页顶部标记((Translated page))标签。
Ajax
编程范型Webapp, HTML, JavaScript, DHTML, DOM, XMLHttpRequest, JSON, XML, XSLT, XHTML, CSS
設計者杰西·詹姆士·贾瑞特
发行时间2005年2月18日,​19年前​(2005-02-18

AJAX即“Asynchronous JavaScript and XML”(非同步的JavaScriptXML技術),指的是一套综合了多項技術的瀏覽器網頁開發技術。Ajax的概念由傑西·詹姆士·賈瑞特所提出[1]

传统的Web应用允许用户端填写表单(form),当送出表单时就向網頁伺服器发送一个请求。伺服器接收并处理传来的表单,然后送回一个新的网页,但这个做法浪费了许多带宽,因为在前后两个页面中的大部分HTML码往往是相同的。由于每次应用的沟通都需要向伺服器发送请求,应用的回應时间依赖于伺服器的回應时间。这导致了用户界面的回應比本機应用慢得多。

与此不同,AJAX应用可以仅向伺服器发送并取回必須的数据,并在客户端采用JavaScript处理来自伺服器的回應。因为在伺服器和浏览器之间交换的数据大量减少,伺服器回應更快了。同时,很多的处理工作可以在发出请求的客户端机器上完成,因此Web伺服器的负荷也减少了。

类似于DHTMLLAMP,AJAX不是指一种单一的技术,而是有机地利用了一系列相关的技术。虽然其名称包含XML,但实际上数据格式可以由JSON代替以进一步减少数据量。而客户端与服务器也并不需要异步。一些基于AJAX的“派生/合成”式(derivative/composite)的技术也正在出现,如AFLAX

应用

发展史

20世纪90年代,几乎所有的网站都由HTML页面实现,服务器处理每一个用户请求都需要重新加载网页。这样的处理方式效率不高。用户的体验是所有页面都会消失,再重新载入,即使只是一部分页面元素改变也要重新载入整个页面,不仅要刷新改变的部分,连没有变化的部分也要刷新。这会加重服务器的负担。

这可以用异步加载来解决。1995年,JAVA语言的第一版发布,随之发布的的Java applets(JAVA小程序)首次实现了异步加载。浏览器通过运行嵌入网页中的Java applets与服务器交换数据,不必刷新网页。1996年,Internet Explorer将iframe元素加入到HTML,支持局部刷新网页。

1998年前后,Outlook Web Access小组写成了允许客户端脚本发送HTTP请求(XMLHTTP)的第一个组件。该组件原属于微软Exchange Server,并且迅速地成为了Internet Explorer 4.0[2]的一部分。部分观察家认为,Outlook Web Access是第一个应用了Ajax技术的成功的商业应用程序,并成为包括Oddpost的网络邮件产品在内的许多产品的领头羊。但是,2005年初,许多事件使得Ajax被大众所接受。Google在它著名的交互应用程序中使用了异步通讯,如Google讨论组、Google地图、Google搜索建议、Gmail等。Ajax这个词由《Ajax: A New Approach to Web Applications》一文所创,该文的迅速流传提高了人们使用该项技术的意识。另外,对Mozilla/Gecko的支持使得该技术走向成熟,变得更为简单易用。2006 年 4 月 5 日,万维网联盟 (W3C) 发布了 XMLHttpRequest 对象的第一个规范草案,试图创建正式的 Web standard 标准。XMLHttpRequest 对象的最新草案于 2016 年 10 月 6 日发布,XMLHttpRequest 规范现已成为现行标准。

Ajax 前景非常乐观,可以提高系统性能,优化用户界面。Ajax 现有直接框架 AjaxPro,可以引入 AjaxPro.2.dll 文件,可以直接在前台页面 JavaScript 调用后台页面的方法。但此框架与表单验证有冲突。另外微软也引入了 Ajax 组件,需要添加 AjaxControlToolkit.dll 文件,可以在控件列表中出现相关控件。

优缺点

使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变的信息。

Ajax不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。就像DHTML应用程序那样,Ajax应用程序必须在众多不同的浏览器和平台上经过严格的测试。随着Ajax的成熟,一些简化Ajax使用方法的程序库也相继问世。同样,也出现了另一种辅助程序设计的技术,为那些不支持JavaScript的用户提供替代功能。

对应用Ajax最主要的批评就是,它可能破坏浏览器的后退與加入收藏書籤功能[3]。在动态更新页面的情况下,用户无法回到前一个页面状态,这是因为浏览器仅能记下历史记录中的静态页面。一个被完整读入的页面与一个已经被动态修改过的页面之间的可能差别非常微妙;用户通常都希望单击后退按钮,就能够取消他们的前一次操作,但是在Ajax应用程序中,却无法这样做。不过开发者已想出了种种办法来解决这个问题,HTML5 之前的方法大多是在用户单击后退按钮访问历史记录时,通过建立或使用一个隐藏的IFRAME来重现页面上的变更。(例如,当用户在Google Maps中单击后退时,它在一个隐藏的IFRAME中进行搜索,然后将搜索结果反映到Ajax元素上,以便将应用程序状态恢复到当时的状态)。

关于無法將狀態加入收藏或書籤的問題,HTML5之前的一種方式是使用URL片断标识符(通常被称为锚点,即URL中#后面的部分)来保持追蹤,允许用户回到指定的某个应用程序状态。(许多浏览器允许JavaScript动态更新锚点,这使得Ajax应用程序能够在更新显示内容的同时更新锚点。)HTML5 以後可以直接操作瀏覽歷史,並以字串形式儲存網頁狀態,將網頁加入網頁收藏夾或書籤時狀態會被隱形地保留。上述兩個方法也可以同時解決無法後退的問題。

进行Ajax开发时,网络延迟——即用户发出请求到服务器发出响应之间的间隔——需要慎重考虑。如果不给予用户明确的回应[4],没有恰当的预读数据[5],或者对XMLHttpRequest的不恰当处理[6],都会使用户感到厌烦[7]。通常的解决方案是,使用一个可视化的组件来告诉用户系统正在进行后台操作并且正在读取数据和内容。

兼容性

JavaScript编程的最大问题来自不同的浏览器对各种技术和标准的支持。

XmlHttpRequest对象在不同浏览器中不同的创建方法,以下是跨瀏覽器的通用方法:

// Provide the XMLHttpRequest class for IE 5.x-6.x:
// Other browsers (including IE 7.x-8.x) ignore this
//   when XMLHttpRequest is predefined
var xmlHttp;
if (typeof XMLHttpRequest != "undefined") {
    xmlHttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {
    var aVersions = ["Msxml2.XMLHttp.5.0", "Msxml2.XMLHttp.4.0", "Msxml2.XMLHttp.3.0", "Msxml2.XMLHttp", "Microsoft.XMLHttp"];
    for (var i = 0; i < aVersions.length; i++) {
        try {
            xmlHttp = new ActiveXObject(aVersions[i]);
            break;
        } catch (e) {}
    }
}

AJAX支持的浏览器有:Internet ExplorerChromeFirefoxOperaKonqueror及Mac OS的Safari。但是Opera不支持XSL格式对象,也不支持XSLT[8]

开发挑战及解决方案

此章節的中立性有争议。加上此模板的編輯者需在討論頁說明此章節中立性有爭議的原因,以便讓各編輯者討論和改善。

对程序员而言,开发Ajax应用最头痛的问题莫过于以下几点:

Ajax是以异步的方式向服务器提交需求。对服务器而言,其与传统的提交窗体需求并无不同,而且由于是以异步之方式提交,如果同时有多个Ajax需求及窗体提交需求,将无法保证哪一个需求先获得服务器的响应。这会造成应用程序典型的多进程(process)或多线程(thread)的竞争(racing)问题。程序员因此必须自行处理或在JavaScript里面动手脚以避免这类竞争问题的发生(如Ajax需求未响应之前,先disable送出按钮),这又不必要的增加了程序员的负担。目前已知有自动处理此问题之开发框架似乎只有ZK[來源請求]

参考文献

  1. ^ (英文)Ajax:網頁應用程式的新方法页面存档备份,存于互联网档案馆)—Jesse James Garrett,最近存取日2007年11月7日
  2. ^ (英文)微軟XML Parser(MSXML)版本列表页面存档备份,存于互联网档案馆),最近存取日2007年11月7日
  3. ^ (英文)Web设计10大错误(1999年)页面存档备份,存于互联网档案馆)—Jakob Nielsen著
  4. ^ (英文)Remote Scripting with AJAX, Part 2页面存档备份,存于互联网档案馆
  5. ^ (英文)延遲必死:預讀資料以降低延遲页面存档备份,存于互联网档案馆)—JonathanBoutelle.com
  6. ^ (英文)不可靠網路下的非同步要求页面存档备份,存于互联网档案馆)—Harry Fuecks著,2005年2月
  7. ^ (英文)小朋友們聽著, AJAX不怎麼酷页面存档备份,存于互联网档案馆)—Marcus Baker著,2005年6月3日
  8. ^ (英文)Opera 9支援的網頁規格 Archive.is存檔,存档日期2012-06-04—XSLT, XPath, and XSL-FO部分論及不支持XSL-FO與XSLT,最近存取日2007年11月7日

外部链接

工具

图书

參見