




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第2章 使用XMLHttpRequest對象我們已經(jīng)討論了動態(tài)Web應用的發(fā)展歷史,并簡要介紹了Ajax,下面再來討論問題的關鍵:如何使用XMLHttpRequest對象。盡管Ajax不只是一個技術,更應是一種技巧,但如果沒有對XMLHttpRequest的廣泛支持,Google Suggest和Ta-da List可能不會像我們看到的有今天這樣的發(fā)展。而你可能也不會看手上的這本書!XMLHttpRequest最早在Internet Explorer 5中實現(xiàn)為ActiveX組件。由于只能在Internet Explorer中使用,所以大多數(shù)開發(fā)人員都沒有用XMLHttpRequest,直到最
2、近Mozilla 1.0和Safari 1.2把它采用為事實上的標準,情況才有改觀。需要說明重要的一點, XMLHttpRequest并不是一個W3C標準,不過許多功能已經(jīng)涵蓋在一個新提案中:DOM Level 3加載和保存規(guī)范(DOM Level 3 Load and Save Specification)。因為它不是一個標準,所以在不同瀏覽器上的表現(xiàn)可能稍有區(qū)別,不過大多數(shù)方法和屬性都得到了廣泛的支持。當前,F(xiàn)irefox、Safari、Opera、Konqueror和Internet Explorer都以類似的方式實現(xiàn)了XMLHttpRequest對象的行為。前面已經(jīng)說過,如果大量用戶還
3、是在用較老的瀏覽器訪問你的網(wǎng)站或應用,就要三思了。第1章討論過,在這種情況下,如果要使用Ajax技術,就要么需要開發(fā)一個候選網(wǎng)站,要么你的應用應當能妥善地降級。大多數(shù)使用統(tǒng)計表明,當前使用的瀏覽器中,只有極少數(shù)不支持XMLHttpRequest,所以一般情況下不會存在這個問題。不過,還是應該查看Web日志,確定你的用戶在使用什么樣的客戶端來訪問你的網(wǎng)站。 1.1 XMLHttpRequest對象概述在使用XMLHttpRequest對象發(fā)送請求和處理響應之前,必須先用JavaScript創(chuàng)建一個XMLHttpRequest對象。由于XMLHttpRequest不是一個W3C標準,所以可以采用多
4、種方法使用JavaScript來創(chuàng)建XMLHttpRequest的實例。Internet Explorer把XMLHttpRequest實現(xiàn)為一個ActiveX對象,其他瀏覽器(如Firefox、Safari和Opera)會把它實現(xiàn)為一個本地JavaScript對象。由于存在這樣一些差別,JavaScript代碼中必須包含有關的邏輯,從而使用ActiveX技術或者使用本地JavaScript技術來創(chuàng)建XMLHttpRequest的一個實例。很多人可能還記得從前的那段日子,那時不同瀏覽器上的JavaScript和DOM實現(xiàn)簡直千差萬別,聽了上面這段話之后,這些人可能又會不寒而栗。幸運的是,在這里
5、為了明確該如何創(chuàng)建XMLHttpRequest對象的實例,并不需要那么詳細地編寫代碼來區(qū)別瀏覽器類型。你要做的只是檢查瀏覽器是否提供對ActiveX對象的支持。如果你的瀏覽器支持ActiveX對象,就使用ActiveX來創(chuàng)建XMLHttpRequest對象。否則,就要使用本地JavaScript對象技術來創(chuàng)建。代碼清單2-1展示了編寫跨瀏覽器的JavaScript代碼來創(chuàng)建XMLHttpRequest對象實例是多么的簡單。代碼清單2-1創(chuàng)建XMLHttpRequest對象的一個實例var xmlHttp;function createXMLHttpRequest() if (window.Ac
6、tiveXObject) xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");else if (window.XMLHttpRequest) xmlHttp = new XMLHttpRequest();可以看到,創(chuàng)建XMLHttpRequest對象相當容易。首先,要創(chuàng)建一個全局作用域變量xmlHttp來保存這個對象的引用。createXMLHttpRequest方法完成創(chuàng)建XMLHttpRequest實例的具體工作。這個方法中只有簡單的分支邏輯(選擇邏輯),來確定如何創(chuàng)建對象。對window.ActiveXObject的調(diào)用會
7、返回一個對象,也可能返回null,if語句會把調(diào)用返回的結果看作是true或false(如果返回對象則為true,返回null則為false),以此指示瀏覽器是否支持ActiveX控件,相應地得知瀏覽器是不是Internet Explorer。如果確實是,則實例化ActiveXObject的一個新實例來創(chuàng)建XMLHttpRequest對象,并傳入一個串指示要創(chuàng)建何種類型的ActiveX對象。在這個例子中,為構造函數(shù)提供的串是Microsoft.XMLHTTP,這說明你想創(chuàng)建XMLHttpRequest的一個實例。如果window.ActiveXObject調(diào)用失?。ǚ祷豱ull),JavaSc
8、ript就會轉到else語句分支,確定瀏覽器是否把XMLHttpRequest實現(xiàn)為一個本地JavaScript對象。如果存在window.XMLHttpRequest,就會創(chuàng)建XMLHttpRequest的一個實例。由于JavaScript具有動態(tài)類型特性,而且XMLHttpRequest實現(xiàn)在不同瀏覽器上是兼容的,所以可以以同樣的方式訪問XMLHttpRequest實例的屬性和方法,而不論這個實例是如何創(chuàng)建的。這就大大簡化了開發(fā)過程,而且在JavaScript中也不必編寫特定于瀏覽器的邏輯。1.2 方法和屬性表2-1顯示了XMLHttpRequest對象的一些典型方法。不要擔心;稍后就會詳
9、細介紹這些方法。表2-1標準XMLHttpRequest操作方法描述abort()停止當前請求。(譯者注:原文此處不對)getAllResponseHeaders()把HTTP請求的所有響應首部作為鍵/值對返回。getResponseHeader("header")返回指定首部的串值。open("method", "url")建立對服務器的調(diào)用。method(方法)參數(shù)可以是GET、POST或PUT。url參數(shù)可以是相對URL或絕對URL。這個方法還包括3個可選的參數(shù).send(content)向服務器發(fā)送請求。setRequestH
10、eader("header", "value")把指定首部設置為所提供的值。在設置任何首部之前必須先調(diào)用open()。下面來更詳細地討論這些方法。void open(string method, string url, boolean asynch, string username, string password):這個方法會建立對服務器的調(diào)用。這是初始化一個請求的純腳本方法。它有兩個必要的參數(shù),還有3個可選參數(shù)。要提供調(diào)用的特定方法(GET、POST或PUT),還要提供所調(diào)用資源的URL。另外還可以傳遞一個Boolean值,指示這個調(diào)用是異步還是同步
11、的,默認值為true,這表示請求本質上是異步的。如果這個參數(shù)為false,處理就會等待,直到從服務器返回響應為止。由于異步調(diào)用是使用Ajax的主要優(yōu)點之一,所以倘若將這個參數(shù)設置為false,從某種程度上講與使用XMLHttpRequest對象的初衷不太相符。不過,前面已經(jīng)說過,在某些情況下這個參數(shù)設置為false也是有用的,比如在持久存儲頁面之前你可能想先驗證用戶的輸入。最后兩個參數(shù)不說自明,允許你指定一個特定的用戶名和口令。void send(content):這個方法具體向服務器發(fā)出請求。如果請求聲明為異步的,這個方法就會立即返回,否則它會等待,直到接收到響應為止。參數(shù)是可選的,可以是一
12、個DOM對象的實例、一個輸入流,或者是一個串。傳入這個對象的內(nèi)容會作為請求體的一部分發(fā)送。void setRequestHeader(string header, string value): 這個方法為HTTP請求中一個給定的首部設置值。它有兩個參數(shù),第一個串表示要設置的首部,第二個串表示要在首部中放置的值。需要說明,這個方法必須在open()之后才能調(diào)用。在所有這些方法中,最有可能用到的就是open()和send()。XMLHttpRequest對象還有許多屬性,在設計Ajax交互時這些屬性非常有用。void abort(): 顧名思義,這個方法就是要停止請求。string getAllR
13、esponseHeaders(): 這個方法的核心功能對Web應用開發(fā)人員應該很熟悉了,它會返回一個串,其中包含HTTP請求的所有響應首部。首部包括Content-Length、Date和URI。string getResponseHeader(string header): 這個方法與getAllResponseHeaders()是對應的,不過它有一個參數(shù)來表示你希望得到哪一個首部值,并且會把這個值作為一個串返回。除了這些標準方法,XMLHttpRequest對象還提供了許多屬性,如表2-2所示。處理XMLHttpRequest時可以大量使用這些屬性。表2-2標準XMLHttpRequest
14、屬性屬性描述onreadystatechange每個狀態(tài)改變時都會觸發(fā)這個事件處理器,通常會調(diào)用一個JavaScript函數(shù)。readyState請求的狀態(tài)。有5個可取值:0 = 未初始化,1 = 正在加載, 2 = 已加載, 3 = 交互中, 4 = 完成。responseText服務器的響應,表示為一個串。responseXML服務器的響應,表示為XML。這個對象可以解析為一個DOM對象。status服務器的HTTP狀態(tài)碼(200對應OK,404對應Not Found(未找到),等等)statusTextHTTP狀態(tài)碼的相應文本(OK或Not Found(未找到)等等)。1.3 一個交互示
15、例看到這里,你可能想知道典型的Ajax交互是什么樣子。圖2-1顯示了Ajax應用中標準的交互模式。圖見P261圖2-1標準Ajax交互圖中文字對照:Ajax-Enabled Web Application:使用Ajax的Web應用Web Container:Web容器Event:事件Client:客戶Server:服務器Server Resource:服務器資源Data Store:數(shù)據(jù)庫不同于標準Web客戶中所用的標準請求/響應方法,Ajax應用的做法稍有點差別。1. 一個客戶端事件觸發(fā)一個Ajax事件。從簡單的onchange事件,到某個特定的用戶動作,很多這樣的事件都可以觸發(fā)Ajax事件
16、??梢杂腥缦碌拇a:<input type="text"d="email" name="email" onblur="validateEmail()">2. 創(chuàng)建XMLHttpRequest對象的一個實例。使用open()方法建立調(diào)用,并設置URL以及所希望的HTTP方法(通常是GET或POST)。請求實際上通過一個send()方法調(diào)用觸發(fā)。代碼可能如下所示:var xmlHttp;function validateEmail() var email = document.getElementById(
17、"email");var url = "validate?email=" + escape(email.value);if (window.ActiveXObject) xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");else if (window.XMLHttpRequest) xmlHttp = new XMLHttpRequest();xmlHttp.open("GET", url);xmlHttp.onreadystatechange = callback;
18、xmlHttp.send(null);3. 向服務器做出請求??赡軙{(diào)用一個servlet、一個CGI腳本,或者使用任何其他服務器端技術。4. 服務器可以做你想做的事情,包括訪問數(shù)據(jù)庫,甚至訪問另一個系統(tǒng)。5. 請求返回到瀏覽器。Content-Type首部設置為text/xmlXMLHttpRequest對象只能處理text/html類型的結果。在另外一些的情況下,響應可能更為復雜,還包括JavaScript、DOM管理以及其他相關的技術。需要說明,你還需要設置另外一些首部,使瀏覽器不會在本地緩存結果。為此可以使用下面的代碼:response.setHeader("Cache-Co
19、ntrol", "no-cache");response.setHeader("Pragma", "no-cache"); Pragma和Cache-Control它們不是一樣的嗎?不錯是,它們是一樣的,不過定義Pragma是為了保證向后兼容。6. 在這個例子中,XMLHttpRequest對象配置為處理返回時要調(diào)用callback()函數(shù)。這個函數(shù)會檢查XMLHttpRequest對象的readyState屬性,然后查看服務器返回的狀態(tài)碼。如果一切正常,callback()函數(shù)就會在客戶端上做些有意思的工作。以下就是一個典
20、型的回調(diào)方法:function callback() if (xmlHttp.readyState = 4) if (xmlHttp.status = 200) /do something interesting here可以看到,這與正常的請求/響應模式有所不同,但對Web開發(fā)人員來說,并不是完全陌生的。顯然,在創(chuàng)建和建立XMLHttpRequest對象時還可以做些事情,另外當“回調(diào)”函數(shù)完成了狀態(tài)檢查之后也可以有所作為。一般地,你會把這些標準調(diào)用包裝在一個庫中,以便在整個應用中使用,或者可以使用Web上提供的庫。這個領域還很新,但是開源群體中已經(jīng)如火如荼地展開了許多這方面的工作。通常,網(wǎng)上
21、有許多框架和工具包能負責基本的連接和瀏覽器抽象,有些還增加了用戶界面組件。有一些純粹基于客戶,還有一些需要服務器上的工作。這些框架很多只是剛剛才開始開發(fā),或者才發(fā)布不久;情況還在不斷發(fā)生變化,經(jīng)常會有新的庫和新的版本出現(xiàn)。隨著這個領域日漸成熟,孰優(yōu)孰劣就會很清楚了。一些比較成熟的庫包括libXmlRequest、RSLite、sarissa、JavaScript對象注解(JavaScript Object Notation,JSON)、JSRS、直接Web遠程通信(Direct Web Remoting,DWR)和Rails的Ruby。這個領域日新月異,所以應當適當?shù)嘏渲媚愕腞SS收集器,及時
22、收集有關Ajax的所有網(wǎng)站上的信息!1.4 GET vs. POST你可能不清楚GET和POST之間有什么區(qū)別,不知道在這兩種方法中該使用哪一個。理論上講,如果請求是冪等的(idempotent),就可以使用GET,所謂冪等是指多個同樣的請求返回的結果也一樣。實際上,相應的服務器方法可能會以某種方式修改狀態(tài),所以一般情況下這是不成立的。這只是一種標準。更實際的區(qū)別在于負載的大小,在許多情況下,盡管能隨URL向服務器發(fā)送數(shù)據(jù),但瀏覽器和服務器會限制URL的長度。一般來講,可以使用GET從服務器獲取數(shù)據(jù);換句話說,要避免使用GET調(diào)用修改服務器上的狀態(tài)。一般地,要修改服務器上的狀態(tài)時,就應當使用P
23、OST方法。不同于GET,要設置XMLHttpRequest對象的Content-Type首部,如下所示:xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");與GET不同,POST不會限制發(fā)送給服務器的負載的大小, 而且POST請求不能保證是冪等的。你做的大多數(shù)請求可能都是GET請求,不過,如果需要,也完全可以使用POST。1.5 遠程腳本我們已經(jīng)介紹了Ajax,下面來簡單談談遠程腳本。你可能會問“Ajax有什么大不了的?我早就用IFRAME做過同樣的
24、事情”。實際上,我們自己也曾用過這種方法。從前所做的一般稱為遠程腳本(remote scripting),很多人認為這只是一種修修補補。不過,這確實提供了一種能避免頁面刷新的機制。1.5.1 遠程腳本概述基本說來,遠程腳本是一種遠程過程調(diào)用。可以像一個正常的Web應用一樣與服務器交互,但是不用刷新整個頁面。與Ajax類似,可以調(diào)用任何服務器端技術來接收請求、處理請求并返回一個有意義的結果。不光是服務器端有很多選擇,客戶端同樣有許多實現(xiàn)遠程腳本的選擇??梢栽趹弥星度胍粋€Flash動畫、一個Java applet,或者一個ActiveX組件。甚至可以使用XML-RPC,但是這種方法太過復雜,因此
25、除非你對這種技術確實很了解,否則這種方法不太合適。實現(xiàn)遠程腳本的通常做法是將腳本與一個IFRAME(隱藏或不隱藏)結合,由服務器返回 JavaScript,然后再在瀏覽器中運行這個JavaScript。Microsoft提供了自己的遠程腳本解決方案,并聰明地稱之為Microsoft遠程腳本(Microsoft Remote Scripting,MSRS)。采用這種方法,可以像調(diào)用本地腳本一樣調(diào)用服務器腳本。頁面中嵌入一個Java applet,以便與服務器通信,在一個.asp頁面中放置服務器端腳本,并用一個.htm文件管理客戶端的布局擺放。在Netscape和Internet Explorer
26、 4.0及更高版本上都可以使用Microsoft的這種解決方案??梢酝秸{(diào)用,也可以異步調(diào)用。不過,這種解決方案需要Java,這意味著可能需要再安裝Java,而且還需要Internet Information Services(IIS),因此會限制服務器端的選擇。Brent Ashley為遠程腳本創(chuàng)建了兩個免費的跨平臺庫。 JSRS是一個客戶端JavaScript庫,充分利用了DHTML向服務器做遠程調(diào)用。相當多的操作系統(tǒng)和瀏覽器上都能使用JSRS。如果采用一些常用的流行服務器端實現(xiàn)(如 PHP、Python和Perl CGI),一般都能在你的網(wǎng)站上安裝并運行JSRS。Ashley免費提供了J
27、SRS,而且還可以從他的網(wǎng)站()上得到源代碼。如果你覺得JSRS太過笨重,Ashley還創(chuàng)建了RSLite,這個庫使用了cookie,僅限于發(fā)送少量的數(shù)據(jù),只能做簡單的調(diào)用,不過大多數(shù)瀏覽器都能提供支持。1.5.2 遠程腳本的一個例子為了進行比較,這里向你展示如何使用IFRAME來實現(xiàn)類Ajax的技術。這非常簡單,而且過去我們就用過這種方法(在XMLHttpRequest問世之前)。這個例子并沒有真正調(diào)用服務器,只是想讓你對如何使用IFRAME實現(xiàn)遠程腳本有所認識。這個例子包括兩個文件:iframe.html(見代碼清單2-2)和server.html(見代碼清單2-3)。server.htm
28、l模擬了本應從服務器返回的響應。代碼清單2-2 iframe.html文件<html><head><title>Example of remote scripting in an IFRAME</title></head><script type="text/javascript">function handleResponse() alert('this function is called from server.html');</script><body>&
29、lt;h1>Remote Scripting with an IFRAME</h1><iframe id="beforexhr"name="beforexhr"style="width:0px; height:0px; border: 0px"src="blank.html"></iframe><a href="server.html" target="beforexhr">call the server</a>
30、;</body></html>代碼清單2-3 server.html文件<html><head><title>the server</title></head><script type="text/javascript"></script><body></body></html>圖2-2顯示了最初的頁面。運行這個代碼生成的結果如圖2-3所示。圖見P311圖2-2 最初的頁面圖見P3121圖2-3 調(diào)用“服務器”之后的頁面1.6 如何
31、發(fā)送簡單的請求現(xiàn)在已經(jīng)準備開始使用XMLHttpRequest對象了。我們剛剛討論了如何創(chuàng)建這個對象,下面來看如何向服務器發(fā)送請求,以及如何處理服務器的響應。如果沒有以查詢參數(shù)或提交表單數(shù)據(jù)的形式向服務器發(fā)送任何信息,這就是最簡單的請求。實際中,往往都希望向服務器發(fā)送一些信息。使用XMLHttpRequest對象發(fā)送請求的基本步驟如下:1. 得到XMLHttpRequest對象實例的一個引用,為此,可以創(chuàng)建一個新的實例,也可以訪問包含有XMLHttpRequest實例的一個變量。2. 告訴XMLHttpRequest對象,哪個函數(shù)會處理XMLHttpRequest對象狀態(tài)的改變。為此要把對象的
32、onreadystatechange屬性設置為指向一個JavaScript函數(shù)的指針。3. 指定請求的屬性。XMLHttpRequest對象的open()方法會指定將發(fā)出的請求。open()方法取3個參數(shù):一個是指示所用方法(通常是GET或POST)的串,另一個是表示目標資源URL的串,還有一個Boolean值,指示請求是否是異步的。4. 將請求發(fā)送給服務器。XMLHttpRequest對象的send()方法會把請求傳送到指定的目標資源。send()方法接受一個參數(shù),這通常是一個串或一個DOM對象。這個參數(shù)會作為請求體的一部分傳送到目標URL。向send()方法提供參數(shù)時,要確保open()中
33、指定的方法是POST。如果沒有數(shù)據(jù)要作為請求體的一部分發(fā)送,則使用null。這些步驟很直觀:你需要XMLHttpRequest對象的一個實例,要告訴它如果狀態(tài)有變化該怎么做,還要告訴它向哪里發(fā)送請求,以及如何發(fā)送請求,最后還需要指導XMLHttpRequest傳送請求。不過,除非你對C或C+很了解,否則可能不明白函數(shù)指針(function pointer)是什么意思。函數(shù)指針與任何其他變量類似,只不過它指向的不是像串、數(shù)字、甚至對象實例之類的數(shù)據(jù),而指向一個函數(shù)。在JavaScript中,所有函數(shù)在內(nèi)存中都編有地址,可以使用函數(shù)名引用。這就提供了很大的靈活性,可以把函數(shù)指針作為參數(shù)傳遞給其他函
34、數(shù),或者在一個對象的屬性中存儲函數(shù)指針。對于XMLHttpRequest對象,onreadystatechange屬性就存儲了回調(diào)函數(shù)的指針。當XMLHttpRequest對象的內(nèi)部狀態(tài)發(fā)生變化時,就會調(diào)用這個回調(diào)函數(shù)。如果做了一個異步調(diào)用,發(fā)出請求后,腳本會立即繼續(xù)處理,在腳本繼續(xù)工作之前,不必等待請求結束。一旦發(fā)出了請求,對象的readyState屬性會經(jīng)過幾個變化。盡管針對每個狀態(tài)都可以做一些處理,不過你最感興趣的狀態(tài)可能是服務器響應結束時的狀態(tài)。通過設置回調(diào)函數(shù),就可以有效地告訴XMLHttpRequest對象:“只要響應到來,就調(diào)用這個函數(shù)來處理響應?!?.6.1 一個簡單的請求例子
35、第一個例子很簡單。這是一個很小的HTML頁面,只有一個按鈕。點擊這個按鈕會初始化一個發(fā)至服務器的異步請求。服務器將發(fā)回一個簡單的靜態(tài)文本文件作為響應。處理這個響應時,會在一個警告窗口中顯示該靜態(tài)文本文件的內(nèi)容。代碼清單2-4顯示了這個HTML頁面和相關的JavaScript。代碼清單2-4simpleRequest.html 頁面<!DOCTYPE html PUBLIC "-/W3C/DTD XHTML 1.0 Strict/EN"<head><title>Simple XMLHttpRequest</title><scri
36、pt type="text/javascript">var xmlHttp;function createXMLHttpRequest() if (window.ActiveXObject) xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");else if (window.XMLHttpRequest) xmlHttp = new XMLHttpRequest();function startRequest() createXMLHttpRequest();xmlHttp.onreadystatech
37、ange = handleStateChange;xmlHttp.open("GET", "simpleResponse.xml", true);xmlHttp.send(null);function handleStateChange() if(xmlHttp.readyState = 4) if(xmlHttp.status = 200) alert("The server replied with: " + xmlHttp.responseText);</script></head><body>
38、;<form action="#"><input type="button" value="Start Basic Asynchronous Request"onclick="startRequest();"/></form></body></html>服務器的響應文件simpleResponse.xml只有一行文本。點擊HTML頁面上的按鈕會生成一個警告框,其中顯示simpleResponse.xml文件的內(nèi)容。在圖2-4中可以看到分別在Internet
39、 Explorer和Firefox中顯示服務器響應的警告框。圖見P341圖2-4 第一個簡單的異步請求對服務器的請求是異步發(fā)送的,因此瀏覽器可以繼續(xù)響應用戶輸入,并在后臺等待服務器的響應。如果選擇同步操作,而且倘若服務器的響應要花好幾秒才能到達,瀏覽器就會表現(xiàn)得很遲鈍,在等待期間不能響應用戶的輸入。這樣一來,瀏覽器好像被凍住一樣,無法響應用戶輸入,而異步做法可以避免這種情況,從而讓最終用戶有更好的體驗,盡管這種改善很細微,但確實很有意義。這樣用戶就能繼續(xù)工作,而且服務器會在后臺處理先前的請求。能與服務器通信而不打斷用戶的工作流,這樣就可以采用很多技術來改善用戶體驗。例如,假設有一個驗證用戶輸入
40、的應用。用戶在輸入表單上填寫各個域時,瀏覽器可以定期地向服務器發(fā)送表單值來進行驗證,此時并不打斷用戶,他還可以繼續(xù)填寫余下的表單域。如果某個驗證規(guī)則失敗,用戶會立即得到通知,而不必等表單真正發(fā)送到服務器進行處理時才知道有錯誤,這就能大大節(jié)省用戶的時間,也能減輕服務器上的負載壓力,因為不必在表單提交不成功時完全重建表單的內(nèi)容。1.6.2 關于安全討論基于瀏覽器的技術時,如果沒有提到安全,那么討論就是不完整的。XMLHttpRequest對象要受制于瀏覽器的安全“沙箱”。XMLHttpRequest對象請求的所有資源都必須與調(diào)用腳本在同一個域(domain)內(nèi)。這個安全限制使得XMLHttpReq
41、uest對象不能請求腳本所在域之外的資源。這個安全限制的強度如何因瀏覽器而異(見圖2-5)。Internet Explorer會顯示一個警告,指出可能存在一個安全風險,但是用戶可以選擇是否繼續(xù)發(fā)出請求。Firefox則會斷然停止請求,并在JavaScript控制臺顯示一個錯誤消息。圖見P351圖2-5 對于可能的安全威脅,Internet Explorer和Firefox有不同的響應Firefox確實提供了一些JavaScript技巧,使得XMLHttpRequest也可以請求外部URL的資源。不過,由于這些技術針對特定的瀏覽器,最好不要用,而且要避免使用XMLHttpRequest訪問外部U
42、RL。1.7 DOM Level 3 加載和保存規(guī)范到目前為止,我們討論的解決方案都不是標準。盡管XMLHttpRequest得到了廣泛支持,但是你已經(jīng)看到了,創(chuàng)建XMLHttpRequest對象的過程會隨瀏覽器不同而有所差異。許多人錯誤地認為Ajax得到了W3C的支持,但實際上并非如此。W3C提出了一個新的標準,力圖解決這樣一些問題,這個標準的名字相當長:DOM Level 3 加載和保存規(guī)范(DOM Level 3 Load and Save Specification)。這個規(guī)范設計為允許以一種獨立于平臺和語言的方式,用XML內(nèi)容修改DOM文檔的內(nèi)容。2004年4月提出了1.0版本,但到
43、目前為止,還沒有哪個瀏覽器實現(xiàn)這個規(guī)范。什么時候“加載和保存”(Load and Save)規(guī)范能取代Ajax?誰也不知道。想想看有多少瀏覽器沒有完全支持現(xiàn)有的標準,所以這很難說,但是隨著越來越多的網(wǎng)站和應用利用了Ajax技術,可能以后的版本會得到支持。不過,較早的DOM版本就花了很長時間才得到采納,所以你得耐心一點。在一次訪談中,DOM Activity主席Philippe Le Hégaret稱,需要花“相當長的時間”才能得到廣泛采納。DOM Level 3也得到了一些支持,Opera的 XMLHttpRequest實現(xiàn)就基于DOM Level 3,而且面向XML的Java API(Java API for XML Processing,JAXP)1.3版本也支持DOM Level 3。不過,從出現(xiàn)了相應的W3C規(guī)范這一點來看,起碼可以表明Ajax技術的重要性。從1997年8月起,人們就一直在為解決瀏覽器之間的不兼容而努力,“加載和保存”規(guī)范則達到了極致。你可能注意到,標題里寫的是“Level 3”,那么Level 1 和Level 2呢?Level 1在1998年10完成,為我們帶來了HTML 4.0和XML
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 痛風病中醫(yī)調(diào)理的市場前景與商機分析
- 社交媒體運營的創(chuàng)意與執(zhí)行力
- 電商平臺的數(shù)據(jù)分析與決策支持系統(tǒng)建設
- 轉讓地塊合同范本
- 案例研究企業(yè)如何成功構建健康安全教育體系
- 初一日記100字大全6篇
- 消費者調(diào)研在高效營銷中的作用與運用
- 裝修廠房合同范本
- 科技引領未來洗浴中心現(xiàn)代化裝修設計
- 科技發(fā)展下的移動營業(yè)廳產(chǎn)品創(chuàng)新與定價決策
- 初中數(shù)學新課程標準(2024年版)
- GB/T 19342-2024手動牙刷一般要求和檢測方法
- 2024年山東鐵投集團招聘筆試參考題庫含答案解析
- 8款-組織架構圖(可編輯)
- 中國郵政銀行“一點一策”方案介紹PPT課件
- 國內(nèi)外創(chuàng)造性思維培養(yǎng)模式的對比研究綜述
- 2022年露天煤礦安全資格證考試題庫-上(單選、多選題庫)
- 計價格(2002)10號文
- 青果巷歷史街區(qū)改造案例分析
- 樁身強度自動驗算表格Excel
- 《鋼鐵是怎樣煉成的》讀書報告
評論
0/150
提交評論