日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求

發布時間:2023/12/18 javascript 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro2/

掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 發出異步請求

在 Web 請求中使用 XMLHttpRequest

多數 Web 應用程序都使用請求/響應模型從服務器上獲得完整的 HTML 頁面。常常是點擊一個按鈕,等待服務器響應,再點擊另一個按鈕,然后再等待,這樣一個反復的過程。有了 Ajax 和 XMLHttpRequest 對象,就可以使用不必讓用戶等待服務器響應的請求/響應模型了。本文中,Brett McLaughlin 介紹了如何創建能夠適應不同瀏覽器的 XMLHttpRequest 實例,建立和發送請求,并響應服務器。

Brett McLaughlin?(brett@newInstance.com), 作家,編輯, O'Reilly Media Inc.

2006 年 2 月 16 日

  • 內容

在 IBM Bluemix 云平臺上開發并部署您的下一個應用。

本系列的上一期文章(請參閱?參考資料?中的鏈接),我們介紹了 Ajax 應用程序,考察了推動 Ajax 應用程序的基本概念。其中的核心是很多您可能已經了解的技術:JavaScript、HTML 和 XHTML、一點動態 HTML 以及 DOM(文檔對象模型)。本文將放大其中的一點,把目光放到具體的 Ajax 細節上。

本文中,您將開始接觸最基本和基礎性的有關 Ajax 的全部對象和編程方法:XMLHttpRequest?對象。該對象實際上僅僅是一個跨越所有 Ajax 應用程序的公共線程,您可能已經預料到,只有徹底理解該對象才能充分發揮編程的潛力。事實上,有時您會發現,要正確地使用?XMLHttpRequest,顯然不能?使用XMLHttpRequest。這到底是怎么回事呢?

Web 2.0 一瞥

在深入研究代碼之前首先看看最近的觀點 —— 一定要十分清楚 Web 2.0 這個概念。聽到 Web 2.0 這個詞的時候,應該首先問一問 “Web 1.0 是什么?” 雖然很少聽人提到 Web 1.0,實際上它指的就是具有完全不同的請求和響應模型的傳統 Web。比如,到 Amazon.com 網站上點擊一個按鈕或者輸入搜索項。就會對服務器發送一個請求,然后響應再返回到瀏覽器。該請求不僅僅是圖書和書目列表,而是另一個完整的 HTML 頁面。因此當 Web 瀏覽器用新的 HTML 頁面重繪時,可能會看到閃爍或抖動。事實上,通過看到的每個新頁面可以清晰地看到請求和響應。

Web 2.0(在很大程度上)消除了這種看得見的往復交互。比如訪問 Google Maps 或 Flickr 這樣的站點(到這些支持 Web 2.0 和 Ajax 站點的鏈接請參閱?參考資料)。比如在 Google Maps 上,您可以拖動地圖,放大和縮小,只有很少的重繪操作。當然這里仍然有請求和響應,只不過都藏到了幕后。作為用戶,體驗更加舒適,感覺很像桌面應用程序。這種新的感受和范型就是當有人提到 Web 2.0 時您所體會到的。

需要關心的是如何使這些新的交互成為可能。顯然,仍然需要發出請求和接收響應,但正是針對每次請求/響應交互的 HTML 重繪造成了緩慢、笨拙的 Web 交互的感受。因此很清楚,我們需要一種方法使發送的請求和接收的響應只?包含需要的數據而不是整個 HTML 頁面。惟一需要獲得整個新 HTML 頁面的時候就是希望用戶看到?新頁面的時候。

但多數交互都是在已有頁面上增加細節、修改主體文本或者覆蓋原有數據。這些情況下,Ajax 和 Web 2.0 方法允許在不?更新整個 HTML 頁面的情況下發送和接收數據。對于那些經常上網的人,這種能力可以讓您的應用程序感覺更快、響應更及時,讓他們不時地光顧您的網站。

XMLHttpRequest 簡介

要真正實現這種絢麗的奇跡,必須非常熟悉一個 JavaScript 對象,即?XMLHttpRequest。這個小小的對象實際上已經在幾種瀏覽器中存在一段時間了,它是本專欄今后幾個月中要介紹的 Web 2.0、Ajax 和大部分其他內容的核心。為了讓您快速地大體了解它,下面給出將要用于該對象的很少的幾個?方法和屬性。

  • open():建立到服務器的新請求。
  • send():向服務器發送請求。
  • abort():退出當前請求。
  • readyState:提供當前 HTML 的就緒狀態。
  • responseText:服務器返回的請求響應文本。

如果不了解這些(或者其中的任何?一個),您也不用擔心,后面幾篇文章中我們將介紹每個方法和屬性?,F在應該?了解的是,明確用XMLHttpRequest?做什么。要注意這些方法和屬性都與發送請求及處理響應有關。事實上,如果看到?XMLHttpRequest?的所有方法和屬性,就會發現它們都?與非常簡單的請求/響應模型有關。顯然,我們不會遇到特別新的 GUI 對象或者創建用戶交互的某種超極神秘的方法,我們將使用非常簡單的請求和非常簡單的響應。聽起來似乎沒有多少吸引力,但是用好該對象可以徹底改變您的應用程序。

簡單的 new

首先需要創建一個新變量并賦給它一個?XMLHttpRequest?對象實例。這在 JavaScript 中很簡單,只要對該對象名使用?new?關鍵字即可,如?清單 1?所示。

清單 1. 創建新的 XMLHttpRequest 對象
<script language="javascript" type="text/javascript"> var request = new XMLHttpRequest(); </script>

不難吧?記住,JavaScript 不要求指定變量類型,因此不需要像?清單 2?那樣做(在 Java 語言中可能需要這樣)。

清單 2. 創建 XMLHttpRequest 的 Java 偽代碼
XMLHttpRequest request = new XMLHttpRequest();

因此在 JavaScript 中用?var?創建一個變量,給它一個名字(如 “request”),然后賦給它一個新的?XMLHttpRequest?實例。此后就可以在函數中使用該對象了。

錯誤處理

在實際上各種事情都可能出錯,而上面的代碼沒有提供任何錯誤處理。較好的辦法是創建該對象,并在出現問題時優雅地退出。比如,任何較早的瀏覽器(不論您是否相信,仍然有人在使用老版本的 Netscape Navigator)都不支持?XMLHttpRequest,您需要讓這些用戶知道有些地方出了問題。清單 3?說明如何創建該對象,以便在出現問題的時候發出 JavaScript 警告。

清單 3. 創建具有錯誤處理能力的 XMLHttpRequest
<script language="javascript" type="text/javascript"> var request = false; try {request = new XMLHttpRequest(); } catch (failed) {request = false; } if (!request)alert("Error initializing XMLHttpRequest!"); </script>

一定要理解這些步驟:

  • 創建一個新變量?request?并賦值 false。后面將使用 false 作為判定條件,它表示還沒有創建?XMLHttpRequest?對象。
  • 增加 try/catch 塊:
  • 嘗試創建?XMLHttpRequest?對象。
  • 如果失敗(catch (failed))則保證?request?的值仍然為 false。
  • 檢查?request?是否仍為 false(如果一切正常就不會是 false)。
  • 如果出現問題(request?是 false)則使用 JavaScript 警告通知用戶出現了問題。
  • 代碼非常簡單,對大多數 JavaScript 和 Web 開發人員來說,真正理解它要比讀寫代碼花更長的時間。現在已經得到了一段帶有錯誤檢查的XMLHttpRequest?對象創建代碼,還可以告訴您哪兒出了問題。

    應付 Microsoft

    看起來似乎一切良好,至少在用 Internet Explorer 試驗這些代碼之前是這樣的。如果這樣試驗的話,就會看到?圖 1?所示的糟糕情形。

    圖 1. Internet Explorer 報告錯誤

    Microsoft 參與了嗎?

    關于 Ajax 和 Microsoft 對該領域不斷增長的興趣和參與已經有很多文章進行了介紹。事實上,據說 Microsoft 最新版本的 Internet Explorer —— version 7.0,將在 2006 年下半年推出 —— 將開始直接支持?XMLHttpRequest,讓您使用?new?關鍵字代替所有的?Msxml2.XMLHTTP?創建代碼。但不要太激動,仍然需要支持舊的瀏覽器,因此跨瀏覽器代碼不會很快消失。

    顯然有什么地方不對勁,而 Internet Explorer 很難說是一種過時的瀏覽器,因為全世界有 70% 在使用 Internet Explorer。換句話說,如果不支持 Microsoft 和 Internet Explorer 就不會受到 Web 世界的歡迎!因此我們需要采用不同的方法處理 Microsoft 瀏覽器。

    經驗證發現 Microsoft 支持 Ajax,但是其?XMLHttpRequest?版本有不同的稱呼。事實上,它將其稱為幾種?不同的東西。如果使用較新版本的 Internet Explorer,則需要使用對象?Msxml2.XMLHTTP,而較老版本的 Internet Explorer 則使用?Microsoft.XMLHTTP。我們需要支持這兩種對象類型(同時還要支持非 Microsoft 瀏覽器)。請看看?清單 4,它在前述代碼的基礎上增加了對 Microsoft 的支持。

    清單 4. 增加對 Microsoft 瀏覽器的支持
    <script language="javascript" type="text/javascript"> var request = false; try {request = new XMLHttpRequest(); } catch (trymicrosoft) {try {request = new ActiveXObject("Msxml2.XMLHTTP");} catch (othermicrosoft) {try {request = new ActiveXObject("Microsoft.XMLHTTP");} catch (failed) {request = false;}} } if (!request)alert("Error initializing XMLHttpRequest!"); </script>

    很容易被這些花括號迷住了眼睛,因此下面分別介紹每一步:

  • 創建一個新變量?request?并賦值 false。使用 false 作為判斷條件,它表示還沒有創建?XMLHttpRequest?對象。
  • 增加 try/catch 塊:
  • 嘗試創建?XMLHttpRequest?對象。
  • 如果失敗(catch (trymicrosoft)):
  • 嘗試使用較新版本的 Microsoft 瀏覽器創建 Microsoft 兼容的對象(Msxml2.XMLHTTP)。
  • 如果失敗(catch (othermicrosoft))嘗試使用較老版本的 Microsoft 瀏覽器創建 Microsoft 兼容的對象(Microsoft.XMLHTTP)。
  • 如果失敗(catch (failed))則保證?request?的值仍然為 false。
  • 檢查?request?是否仍然為 false(如果一切順利就不會是 false)。
  • 如果出現問題(request?是 false)則使用 JavaScript 警告通知用戶出現了問題。
  • 這樣修改代碼之后再使用 Internet Explorer 試驗,就應該看到已經創建的表單(沒有錯誤消息)。我實驗的結果如?圖 2?所示。

    圖 2. Internet Explorer 正常工作

    靜態與動態

    再看一看清單?1、3?和?4,注意,所有這些代碼都直接嵌套在?script?標記中。像這種不放到方法或函數體中的 JavaScript 代碼稱為靜態 JavaScript。就是說代碼是在頁面顯示給用戶之前的某個時候運行。(雖然根據規范不能完全精確地?知道這些代碼何時運行對瀏覽器有什么影響,但是可以保證這些代碼在用戶能夠與頁面交互之前運行。)這也是多數 Ajax 程序員創建?XMLHttpRequest?對象的一般方式。

    就是說,也可以像?清單 5?那樣將這些代碼放在一個方法中。

    清單 5. 將 XMLHttpRequest 創建代碼移動到方法中
    <script language="javascript" type="text/javascript"> var request; function createRequest() {try {request = new XMLHttpRequest();} catch (trymicrosoft) {try {request = new ActiveXObject("Msxml2.XMLHTTP");} catch (othermicrosoft) {try {request = new ActiveXObject("Microsoft.XMLHTTP");} catch (failed) {request = false;}}}if (!request)alert("Error initializing XMLHttpRequest!"); } </script>

    如果按照這種方式編寫代碼,那么在處理 Ajax 之前需要調用該方法。因此還需要?清單 6?這樣的代碼。

    清單 6. 使用 XMLHttpRequest 的創建方法
    <script language="javascript" type="text/javascript"> var request; function createRequest() {try {request = new XMLHttpRequest();} catch (trymicrosoft) {try {request = new ActiveXObject("Msxml2.XMLHTTP");} catch (othermicrosoft) {try {request = new ActiveXObject("Microsoft.XMLHTTP");} catch (failed) {request = false;}}}if (!request)alert("Error initializing XMLHttpRequest!"); } function getCustomerInfo() {createRequest();// Do something with the request variable } </script>

    此代碼惟一的問題是推遲了錯誤通知,這也是多數 Ajax 程序員不采用這一方法的原因。假設一個復雜的表單有 10 或 15 個字段、選擇框等,當用戶在第 14 個字段(按照表單順序從上到下)輸入文本時要激活某些 Ajax 代碼。這時候運行?getCustomerInfo()?嘗試創建一個XMLHttpRequest?對象,但(對于本例來說)失敗了。然后向用戶顯示一條警告,明確地告訴他們不能使用該應用程序。但用戶已經花費了很多時間在表單中輸入數據!這是非常令人討厭的,而討厭顯然不會吸引用戶再次訪問您的網站。

    如果使用靜態 JavaScript,用戶在點擊頁面的時候很快就會看到錯誤信息。這樣也很煩人,是不是?可能令用戶錯誤地認為您的 Web 應用程序不能在他的瀏覽器上運行。不過,當然要比他們花費了 10 分鐘輸入信息之后再顯示同樣的錯誤要好。因此,我建議編寫靜態的代碼,讓用戶盡可能早地發現問題。

    用 XMLHttpRequest 發送請求

    得到請求對象之后就可以進入請求/響應循環了。記住,XMLHttpRequest?惟一的目的是讓您發送請求和接收響應。其他一切都是 JavaScript、CSS 或頁面中其他代碼的工作:改變用戶界面、切換圖像、解釋服務器返回的數據。準備好?XMLHttpRequest?之后,就可以向服務器發送請求了。

    歡迎使用沙箱

    Ajax 采用一種沙箱安全模型。因此,Ajax 代碼(具體來說就是?XMLHttpRequest?對象)只能對所在的同一個域發送請求。以后的文章中將進一步介紹安全和 Ajax,現在只要知道在本地機器上運行的代碼只能對本地機器上的服務器端腳本發送請求。如果讓 Ajax 代碼在 www.breakneckpizza.com 上運行,則必須 www.breakneck.com 中運行的腳本發送請求。

    設置服務器 URL

    首先要確定連接的服務器的 URL。這并不是 Ajax 的特殊要求,但仍然是建立連接所必需的,顯然現在您應該知道如何構造 URL 了。多數應用程序中都會結合一些靜態數據和用戶處理的表單中的數據來構造該 URL。比如,清單 7?中的 JavaScript 代碼獲取電話號碼字段的值并用其構造 URL。

    清單 7. 建立請求 URL
    <script language="javascript" type="text/javascript">var request = false;try {request = new XMLHttpRequest();} catch (trymicrosoft) {try {request = new ActiveXObject("Msxml2.XMLHTTP");} catch (othermicrosoft) {try {request = new ActiveXObject("Microsoft.XMLHTTP");} catch (failed) {request = false;} }}if (!request)alert("Error initializing XMLHttpRequest!");function getCustomerInfo() {var phone = document.getElementById("phone").value;var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone);} </script>

    這里沒有難懂的地方。首先,代碼創建了一個新變量?phone,并把 ID 為 “phone” 的表單字段的值賦給它。清單 8?展示了這個表單的 XHTML,其中可以看到?phone?字段及其?id?屬性。

    清單 8. Break Neck Pizza 表單
    <body><p><img src="breakneck-logo_4c.gif" alt="Break Neck Pizza" /></p><form action="POST"><p>Enter your phone number:<input type="text" size="14" name="phone" id="phone" onChange="getCustomerInfo();" /></p><p>Your order will be delivered to:</p><div id="address"></div><p>Type your order in here:</p><p><textarea name="order" rows="6" cols="50" id="order"></textarea></p><p><input type="submit" value="Order Pizza" id="submit" /></p></form></body>

    還要注意,當用戶輸入電話號碼或者改變電話號碼時,將觸發?清單 8?所示的?getCustomerInfo()?方法。該方法取得電話號碼并構造存儲在url?變量中的 URL 字符串。記住,由于 Ajax 代碼是沙箱型的,因而只能連接到同一個域,實際上 URL 中不需要域名。該例中的腳本名為/cgi-local/lookupCustomer.php。最后,電話號碼作為 GET 參數附加到該腳本中:"phone=" + escape(phone)。

    如果以前沒用見過?escape()?方法,它用于轉義不能用明文正確發送的任何字符。比如,電話號碼中的空格將被轉換成字符?%20,從而能夠在 URL 中傳遞這些字符。

    可以根據需要添加任意多個參數。比如,如果需要增加另一個參數,只需要將其附加到 URL 中并用 “與”(&)字符分開 [第一個參數用問號(?)和腳本名分開]。

    打開請求

    open() 是打開嗎?

    Internet 開發人員對?open()?方法到底做什么沒有達成一致。但它實際上并不是?打開一個請求。如果監控 XHTML/Ajax 頁面及其連接腳本之間的網絡和數據傳遞,當調用?open()?方法時將看不到任何通信。不清楚為何選用了這個名字,但顯然不是一個好的選擇。

    有了要連接的 URL 后就可以配置請求了??梢杂?XMLHttpRequest?對象的?open()?方法來完成。該方法有五個參數:

    • request-type:發送請求的類型。典型的值是?GET?或?POST,但也可以發送?HEAD?請求。
    • url:要連接的 URL。
    • asynch:如果希望使用異步連接則為 true,否則為 false。該參數是可選的,默認為 true。
    • username:如果需要身份驗證,則可以在此指定用戶名。該可選參數沒有默認值。
    • password:如果需要身份驗證,則可以在此指定口令。該可選參數沒有默認值。

    通常使用其中的前三個參數。事實上,即使需要異步連接,也應該指定第三個參數為 “true”。這是默認值,但堅持明確指定請求是異步的還是同步的更容易理解。

    將這些結合起來,通常會得到?清單 9?所示的一行代碼。

    清單 9. 打開請求
    function getCustomerInfo() {var phone = document.getElementById("phone").value;var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone);request.open("GET", url, true);}

    一旦設置好了 URL,其他就簡單了。多數請求使用?GET?就夠了(后面的文章中將看到需要使用?POST?的情況),再加上 URL,這就是使用open()?方法需要的全部內容了。

    挑戰異步性

    本系列的后面一篇文章中,我將用很多時間編寫和使用異步代碼,但是您應該明白為什么?open()?的最后一個參數這么重要。在一般的請求/響應模型中,比如 Web 1.0,客戶機(瀏覽器或者本地機器上運行的代碼)向服務器發出請求。該請求是同步的,換句話說,客戶機等待服務器的響應。當客戶機等待的時候,至少會用某種形式通知您在等待:

    • 沙漏(特別是 Windows 上)。
    • 旋轉的皮球(通常在 Mac 機器上)。
    • 應用程序基本上凍結了,然后過一段時間光標變化了。

    這正是 Web 應用程序讓人感到笨拙或緩慢的原因 —— 缺乏真正的交互性。按下按鈕時,應用程序實際上變得不能使用,直到剛剛觸發的請求得到響應。如果請求需要大量服務器處理,那么等待的時間可能很長(至少在這個多處理器、DSL 沒有等待的世界中是如此)。

    而異步請求不?等待服務器響應。發送請求后應用程序繼續運行。用戶仍然可以在 Web 表單中輸入數據,甚至離開表單。沒有旋轉的皮球或者沙漏,應用程序也沒有明顯的凍結。服務器悄悄地響應請求,完成后告訴原來的請求者工作已經結束(具體的辦法很快就會看到)。結果是,應用程序感覺不?那么遲鈍或者緩慢,而是響應迅速、交互性強,感覺快多了。這僅僅是 Web 2.0 的一部分,但它是很重要的一部分。所有老套的 GUI 組件和 Web 設計范型都不能克服緩慢、同步的請求/響應模型。

    發送請求

    一旦用?open()?配置好之后,就可以發送請求了。幸運的是,發送請求的方法的名稱要比?open()?適當,它就是?send()。

    send()?只有一個參數,就是要發送的內容。但是在考慮這個方法之前,回想一下前面已經通過 URL 本身發送過數據了:

    var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone);

    雖然可以使用?send()?發送數據,但也能通過 URL 本身發送數據。事實上,GET?請求(在典型的 Ajax 應用中大約占 80%)中,用 URL 發送數據要容易得多。如果需要發送安全信息或 XML,可能要考慮使用?send()?發送內容(本系列的后續文章中將討論安全數據和 XML 消息)。如果不需要通過?send()?傳遞數據,則只要傳遞?null?作為該方法的參數即可。因此您會發現在本文中的例子中只需要這樣發送請求(參見?清單 10)。

    清單 10. 發送請求
    function getCustomerInfo() {var phone = document.getElementById("phone").value;var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone);request.open("GET", url, true);request.send(null);}

    指定回調方法

    現在我們所做的只有很少一點是新的、革命性的或異步的。必須承認,open()?方法中 “true” 這個小小的關鍵字建立了異步請求。但是除此之外,這些代碼與用 Java servlet 及 JSP、PHP 或 Perl 編程沒有什么兩樣。那么 Ajax 和 Web 2.0 最大的秘密是什么呢?秘密就在于XMLHttpRequest?的一個簡單屬性?onreadystatechange。

    首先一定要理解這些代碼中的流程(如果需要請回顧?清單 10)。建立其請求然后發出請求。此外,因為是異步請求,所以 JavaScript 方法(例子中的?getCustomerInfo())不會等待服務器。因此代碼將繼續執行,就是說,將退出該方法而把控制返回給表單。用戶可以繼續輸入信息,應用程序不會等待服務器。

    這就提出了一個有趣的問題:服務器完成了請求之后會發生什么?答案是什么也不發生,至少對現在的代碼而言如此!顯然這樣不行,因此服務器在完成通過?XMLHttpRequest?發送給它的請求處理之后需要某種指示說明怎么做。

    在 JavaScript 中引用函數

    JavaScript 是一種弱類型的語言,可以用變量引用任何東西。因此如果聲明了一個函數?updatePage(),JavaScript 也將該函數名看作是一個變量。換句話說,可用變量名?updatePage?在代碼中引用函數。

    現在?onreadystatechange?屬性該登場了。該屬性允許指定一個回調函數?;卣{允許服務器(猜得到嗎?)反向調用?Web 頁面中的代碼。它也給了服務器一定程度的控制權,當服務器完成請求之后,會查看?XMLHttpRequest?對象,特別是?onreadystatechange?屬性。然后調用該屬性指定的任何方法。之所以稱為回調是因為服務器向網頁發起調用,無論網頁本身在做什么。比方說,可能在用戶坐在椅子上手沒有碰鍵盤的時候調用該方法,但是也可能在用戶輸入、移動鼠標、滾動屏幕或者點擊按鈕時調用該方法。它并不關心用戶在做什么。

    這就是稱之為異步的原因:用戶在一層上操作表單,而在另一層上服務器響應請求并觸發?onreadystatechange?屬性指定的回調方法。因此需要像?清單 11?一樣在代碼中指定該方法。

    清單 11. 設置回調方法
    function getCustomerInfo() {var phone = document.getElementById("phone").value;var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone);request.open("GET", url, true);request.onreadystatechange = updatePage;request.send(null);}

    需要特別注意的是該屬性在代碼中設置的位置?—— 它是在調用?send()之前?設置的。發送請求之前必須設置該屬性,這樣服務器在回答完成請求之后才能查看該屬性?,F在剩下的就只有編寫?updatePage()?方法了,這是本文最后一節要討論的重點。

    處理服務器響應

    發送請求,用戶高興地使用 Web 表單(同時服務器在處理請求),而現在服務器完成了請求處理。服務器查看?onreadystatechange?屬性確定要調用的方法。除此以外,可以將您的應用程序看作其他應用程序一樣,無論是否異步。換句話說,不一定要采取特殊的動作編寫響應服務器的方法,只需要改變表單,讓用戶訪問另一個 URL 或者做響應服務器需要的任何事情。這一節我們重點討論對服務器的響應和一種典型的動作 —— 即時改變用戶看到的表單中的一部分。

    回調和 Ajax

    現在我們已經看到如何告訴服務器完成后應該做什么:將?XMLHttpRequest?對象的?onreadystatechange?屬性設置為要運行的函數名。這樣,當服務器處理完請求后就會自動調用該函數。也不需要擔心該函數的任何參數。我們從一個簡單的方法開始,如?清單 12?所示。

    清單 12. 回調方法的代碼
    <script language="javascript" type="text/javascript">var request = false;try {request = new XMLHttpRequest();} catch (trymicrosoft) {try {request = new ActiveXObject("Msxml2.XMLHTTP");} catch (othermicrosoft) {try {request = new ActiveXObject("Microsoft.XMLHTTP");} catch (failed) {request = false;} }}if (!request)alert("Error initializing XMLHttpRequest!");function getCustomerInfo() {var phone = document.getElementById("phone").value;var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone);request.open("GET", url, true);request.onreadystatechange = updatePage;request.send(null);}function updatePage() {alert("Server is done!");} </script>

    它僅僅發出一些簡單的警告,告訴您服務器什么時候完成了任務。在自己的網頁中試驗這些代碼,然后在瀏覽器中打開(如果希望查看該例中的 XHTML,請參閱?清單 8)。輸入電話號碼然后離開該字段,將看到一個彈出的警告窗口(如?圖 3?所示),但是點擊 OK 又出現了……

    圖 3. 彈出警告的 Ajax 代碼

    根據瀏覽器的不同,在表單停止彈出警告之前會看到兩次、三次甚至四次警告。這是怎么回事呢?原來我們還沒有考慮 HTTP 就緒狀態,這是請求/響應循環中的一個重要部分。

    HTTP 就緒狀態

    前面提到,服務器在完成請求之后會在?XMLHttpRequest?的?onreadystatechange?屬性中查找要調用的方法。這是真的,但還不完整。事實上,每當 HTTP 就緒狀態改變時它都會調用該方法。這意味著什么呢?首先必須理解 HTTP 就緒狀態。

    HTTP 就緒狀態表示請求的狀態或情形。它用于確定該請求是否已經開始、是否得到了響應或者請求/響應模型是否已經完成。它還可以幫助確定讀取服務器提供的響應文本或數據是否安全。在 Ajax 應用程序中需要了解五種就緒狀態:

    • 0:請求沒有發出(在調用?open()?之前)。
    • 1:請求已經建立但還沒有發出(調用?send()?之前)。
    • 2:請求已經發出正在處理之中(這里通常可以從響應得到內容頭部)。
    • 3:請求已經處理,響應中通常有部分數據可用,但是服務器還沒有完成響應。
    • 4:響應已完成,可以訪問服務器響應并使用它。

    與大多數跨瀏覽器問題一樣,這些就緒狀態的使用也不盡一致。您也許期望任務就緒狀態從 0 到 1、2、3 再到 4,但實際上很少是這種情況。一些瀏覽器從不報告 0 或 1 而直接從 2 開始,然后是 3 和 4。其他瀏覽器則報告所有的狀態。還有一些則多次報告就緒狀態 1。在上一節中看到,服務器多次調用?updatePage(),每次調用都會彈出警告框 —— 可能和預期的不同!

    對于 Ajax 編程,需要直接處理的惟一狀態就是就緒狀態 4,它表示服務器響應已經完成,可以安全地使用響應數據了。基于此,回調方法中的第一行應該如?清單 13?所示。

    清單 13. 檢查就緒狀態
    function updatePage() {if (request.readyState == 4)alert("Server is done!");}

    修改后就可以保證服務器的處理已經完成。嘗試運行新版本的 Ajax 代碼,現在就會看到與預期的一樣,只顯示一次警告信息了。

    HTTP 狀態碼

    雖然?清單 13?中的代碼看起來似乎不錯,但是還有一個問題 —— 如果服務器響應請求并完成了處理但是報告了一個錯誤怎么辦?要知道,服務器端代碼應該明白它是由 Ajax、JSP、普通 HTML 表單或其他類型的代碼調用的,但只能使用傳統的 Web 專用方法報告信息。而在 Web 世界中,HTTP 代碼可以處理請求中可能發生的各種問題。

    比方說,您肯定遇到過輸入了錯誤的 URL 請求而得到 404 錯誤碼的情形,它表示該頁面不存在。這僅僅是 HTTP 請求能夠收到的眾多錯誤碼中的一種(完整的狀態碼列表請參閱?參考資料?中的鏈接)。表示所訪問數據受到保護或者禁止訪問的 403 和 401 也很常見。無論哪種情況,這些錯誤碼都是從完成的響應?得到的。換句話說,服務器履行了請求(即 HTTP 就緒狀態是 4)但是沒有返回客戶機預期的數據。

    因此除了就緒狀態外,還需要檢查 HTTP 狀態。我們期望的狀態碼是 200,它表示一切順利。如果就緒狀態是 4 而且狀態碼是 200,就可以處理服務器的數據了,而且這些數據應該就是要求的數據(而不是錯誤或者其他有問題的信息)。因此還要在回調方法中增加狀態檢查,如?清單 14?所示。

    清單 14. 檢查 HTTP 狀態碼
    function updatePage() {if (request.readyState == 4)if (request.status == 200)alert("Server is done!");}

    為了增加更健壯的錯誤處理并盡量避免過于復雜,可以增加一兩個狀態碼檢查,請看一看?清單 15?中修改后的?updatePage()?版本。

    清單 15. 增加一點錯誤檢查
    function updatePage() {if (request.readyState == 4)if (request.status == 200)alert("Server is done!");else if (request.status == 404)alert("Request URL does not exist");elsealert("Error: status code is " + request.status);}

    現在將?getCustomerInfo()?中的 URL 改為不存在的 URL 看看會發生什么。應該會看到警告信息說明要求的 URL 不存在 —— 好極了!很難處理所有的錯誤條件,但是這一小小的改變能夠涵蓋典型 Web 應用程序中 80% 的問題。

    讀取響應文本

    現在可以確保請求已經處理完成(通過就緒狀態),服務器給出了正常的響應(通過狀態碼),最后我們可以處理服務器返回的數據了。返回的數據保存在?XMLHttpRequest?對象的?responseText?屬性中。

    關于?responseText?中的文本內容,比如格式和長度,有意保持含糊。這樣服務器就可以將文本設置成任何內容。比方說,一種腳本可能返回逗號分隔的值,另一種則使用管道符(即?|?字符)分隔的值,還有一種則返回長文本字符串。何去何從由服務器決定。

    在本文使用的例子中,服務器返回客戶的上一個訂單和客戶地址,中間用管道符分開。然后使用訂單和地址設置表單中的元素值,清單 16?給出了更新顯示內容的代碼。

    清單 16. 處理服務器響應
    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, "
    ");
    } elsealert("status is " + request.status);}}

    首先,得到?responseText?并使用 JavaScript?split()?方法從管道符分開。得到的數組放到?response?中。數組中的第一個值 —— 上一個訂單 —— 用?response[0]?訪問,被設置為 ID 為 “order” 的字段的值。第二個值?response[1],即客戶地址,則需要更多一點處理。因為地址中的行用一般的行分隔符(“\n”字符)分隔,代碼中需要用 XHTML 風格的行分隔符?<br />?來代替。替換過程使用?replace()?函數和正則表達式完成。最后,修改后的文本作為 HTML 表單?div?中的內部 HTML。結果就是表單突然用客戶信息更新了,如圖 4 所示。

    圖 4. 收到客戶數據后的 Break Neck 表單

    結束本文之前,我還要介紹?XMLHttpRequest?的另一個重要屬性?responseXML。如果服務器選擇使用 XML 響應則該屬性包含(也許您已經猜到)XML 響應。處理 XML 響應和處理普通文本有很大不同,涉及到解析、文檔對象模型(DOM)和其他一些問題。后面的文章中將進一步介紹 XML。但是因為?responseXML?通常和?responseText?一起討論,這里有必要提一提。對于很多簡單的 Ajax 應用程序?responseText?就夠了,但是您很快就會看到通過 Ajax 應用程序也能很好地處理 XML。

    結束語

    您可能對?XMLHttpRequest?感到有點厭倦了,我很少看到一整篇文章討論一個對象,特別是這種簡單的對象。但是您將在使用 Ajax 編寫的每個頁面和應用程序中反復使用該對象。坦白地說,關于?XMLHttpRequest?還真有一些可說的內容。下一期文章中將介紹如何在請求中使用?POST?及GET,來設置請求中的內容頭部和從服務器響應讀取內容頭部,理解如何在請求/響應模型中編碼請求和處理 XML。

    再往后我們將介紹常見 Ajax 工具箱。這些工具箱實際上隱藏了本文所述的很多細節,使得 Ajax 編程更容易。您也許會想,既然有這么多工具箱為何還要對底層的細節編碼。答案是,如果不知道應用程序在做什么,就很難發現應用程序中的問題。

    因此不要忽略這些細節或者簡單地瀏覽一下,如果便捷華麗的工具箱出現了錯誤,您就不必撓頭或者發送郵件請求支持了。如果了解如何直接使用?XMLHttpRequest,就會發現很容易調試和解決最奇怪的問題。只有讓其解決您的問題,工具箱才是好東西。

    因此請熟悉?XMLHttpRequest?吧。事實上,如果您有使用工具箱的 Ajax 代碼,可以嘗試使用?XMLHttpRequest?對象及其屬性和方法重新改寫。這是一種不錯的練習,可以幫助您更好地理解其中的原理。

    下一期文章中將進一步討論該對象,探討它的一些更有趣的屬性(如?responseXML),以及如何使用?POST?請求和以不同的格式發送數據。請開始編寫代碼吧,一個月后我們再繼續討論。

    參考資料

    學習

    • 您可以參閱本文在 developerWorks 全球站點上的?英文原文。
    • 掌握 Ajax,第 1 部分: Ajax 簡介(developerWorks,2005 年 12 月)幫助您了解 Ajax,這是一種構建網站的高生產率方法。(本文中的參考資料列表都值得訪問!)
    • 面向 Java 開發人員的 Ajax: 構建動態的 Java 應用程序(developerWorks,2005 年 9 月)從 Java 的角度考察了 Ajax 服務器端。
    • 面向 Java 開發人員的 Ajax: Ajax 的 Java 對象序列化(developerWorks,2005 年 10 月)從 Java 的角度分析了如何通過網絡發送對象以及與 Ajax 交互。
    • 使用 AJAX 調用 SOAP Web 服務,第 1 部分: 構建 Web 服務客戶機(developerWorks,2005 年 10 月)是關于集成 Ajax 和現有基于 SOAP 的 web 服務的相當高級的文章。
    • Google GMail?是一個很好的例子,說明了基于 Ajax 的應用程序如何改變 Web 的工作方式。
    • Google Maps?是另一種基于 Google 的 Web 2.0 應用程序。
    • Flickr?是一個很好的例子,說明如何使用 Ajax 創建類似桌面的 Web 應用程序。
    • Ajax: A New Approach to Web Applications?發明了 Ajax 一詞,所有 Ajax 開發人員都應該讀一讀。
    • Why Ajax Matters Now?告訴您為什么 Ajax 很重要。
    • 如果使用的是 Microsoft 瀏覽器 Internet Explorer,請訪問?Microsoft Developer Network's XML Developer Center。
    • 請通過?在線文檔?進一步了解 MSXML,Microsoft XML 解析器。
    • 看一看響應中包含的所有?HTTP 狀態碼?列表。
    • developerWorks?Web Architecture 專區?專門發表各種基于 Web 的解決方案的文章。

    獲得產品和技術

    • Elisabeth Freeman、Eric Freeman 和 Brett McLaughlin 合著的?Head Rush Ajax(2005 年 2 月,O'Reilly Media, Inc.)以 Head First 風格將本文中所述的內容灌輸到您的頭腦中。
    • Java and XML, Second Edition(Brett McLaughlin,2001 年 8 月,O'Reilly Media, Inc.)包括作者關于 XHTML 和 XML 轉換的討論。
    • JavaScript: The Definitive Guide(David Flanagan,2001 年 11 月,O'Reilly Media, Inc.)詳細介紹了如何使用 JavaScript、動態網頁,第二版增加了關于 Ajax 的兩章。
    • Head First HTML with CSS & XHTML(Elizabeth 和Eric Freeman,2005 年 12 月,O'Reilly Media, Inc.)是學習 XHTML、CSS 以及如何將兩者結合起來的完整參考。

    討論

    • 參與論壇討論。
    • developerWorks blogs:加入 developerWorks 社區。

    轉載于:https://www.cnblogs.com/anruy/p/5038467.html

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产精品久久久影视 | 黄色录像av| 人人超碰在线 | 国产精品剧情在线亚洲 | 91九色蝌蚪在线 | 91成人精品一区在线播放69 | 久久精品黄| 97夜夜澡人人双人人人喊 | 9在线观看免费高清完整版 玖玖爱免费视频 | 韩日av一区二区 | 久久久午夜剧场 | 国产xx视频| 特级a毛片| 波多野结衣视频一区 | 免费影视大全推荐 | 在线观看中文字幕一区 | 就操操久久 | 亚洲午夜不卡 | 99久久婷婷国产精品综合 | 成人免费观看完整版电影 | 亚洲国产97在线精品一区 | 91看毛片| 综合激情久久 | 高清av在线免费观看 | 久久精品网站免费观看 | 成人午夜在线观看 | 97人人艹 | 国产一区二区免费在线观看 | 正在播放国产一区二区 | 欧美日韩视频在线观看免费 | 狠狠色噜噜狠狠狠 | 欧美 日韩 国产 中文字幕 | 四虎www| 欧美一级片在线 | 亚洲性xxxx | 99热亚洲精品 | 亚洲精品高清视频在线观看 | 日韩在线看片 | 亚洲一区网站 | 91在线91拍拍在线91 | 中文字幕av最新更新 | 五月天婷亚洲天综合网鲁鲁鲁 | 久久精品久久99 | 在线影院中文字幕 | 亚洲深夜影院 | 91精品国产自产在线观看 | 亚洲春色奇米影视 | 男女免费视频观看 | 久久伊人八月婷婷综合激情 | 久久99最新地址 | 亚洲精品xx | 中文字幕乱码电影 | 91av电影在线观看 | 99精品欧美一区二区三区 | 中文字幕在线影视资源 | 欧美一二三区在线观看 | 日韩欧美91 | 天天插狠狠插 | 国产成人精品久久二区二区 | 激情视频网页 | 婷婷色中文网 | 黄色三级免费看 | 精品在线播放视频 | wwwwww黄| 国内综合精品午夜久久资源 | 中文不卡视频在线 | 成人免费 在线播放 | 国产精品视频你懂的 | 日韩视频一区二区三区在线播放免费观看 | 免费福利片2019潦草影视午夜 | 色综合在| 国产免费亚洲高清 | 91亚洲夫妻 | 91久久久久久久一区二区 | 欧美成人黄色片 | 久久视频在线观看中文字幕 | 欧美俄罗斯性视频 | 亚洲精品国产精品国自产在线 | 国产精品美女www爽爽爽视频 | 99热精品国产 | 久草免费看 | 性色av免费在线观看 | 四虎国产精品成人免费4hu | 天天操天天干天天操天天干 | 亚洲精品字幕在线观看 | 亚洲mv大片欧洲mv大片免费 | 99高清视频有精品视频 | 又长又大又黑又粗欧美 | 国产精品一区二区久久国产 | 亚洲精品mv在线观看 | 色婷婷视频在线 | 天天色 天天 | 欧美色久 | www.com黄| 一区二区三区动漫 | 黄色网中文字幕 | 最近日本韩国中文字幕 | 69精品在线| 亚洲精品66 | 成人午夜电影免费在线观看 | 国产一区免费视频 | 欧美aaa视频 | 成人在线小视频 | 91视频久久久| 在线观看完整版免费 | h动漫中文字幕 | 亚洲精品自拍视频在线观看 | 国产精品久久久久久久久久久久 | 超碰公开在线观看 | 久久亚洲人 | 婷婷激情av | 国产精品久久久久久久久久久免费 | 欧美一二三区在线观看 | 日韩欧美在线视频一区二区 | 国产裸体视频bbbbb | 欧美一区二区三区在线视频观看 | 天天夜夜亚洲 | 日韩专区av | 97精品国产97久久久久久免费 | 在线观看岛国av | 久久久影院官网 | 99热在线网站 | 日本黄色免费看 | 午夜久久久精品 | 81精品国产乱码久久久久久 | 久久久久色 | 西西444www大胆高清视频 | 欧美日韩调教 | 五月婷婷在线视频观看 | 又黄又刺激视频 | av在线播放不卡 | 九九热免费在线视频 | 中文字幕第一页在线播放 | 亚洲最新视频在线播放 | 综合色伊人| 久久理论电影网 | 国产伦精品一区二区三区高清 | 国产一级在线观看 | 亚洲精品视频在线看 | 成人黄在线观看 | 国产日韩视频在线观看 | 久久精品视频在线 | 97电院网手机版 | 伊人伊成久久人综合网小说 | 人人爽人人爽人人爽学生一级 | 97av视频| 婷婷电影在线观看 | 不卡在线一区 | 国产成人精品亚洲日本在线观看 | 激情av一区二区 | 一区二区不卡视频在线观看 | av电影在线播放 | 毛片1000部免费看 | 青青草华人在线视频 | 五月在线视频 | 国产精品自拍在线 | 日韩精品中文字幕有码 | 91porny九色在线播放 | 成人app在线免费观看 | 国产高清av免费在线观看 | 欧美大香线蕉线伊人久久 | 亚洲一区二区三区四区精品 | 中文字幕资源网 国产 | 国产系列精品av | 精品免费一区 | 国产激情小视频在线观看 | 在线免费av播放 | 97超视频在线观看 | 成人免费在线观看av | 免费大片av| 99爱在线 | 九九热99视频 | 91黄站| 99久久久久 | 久久久免费毛片 | 97电影网站 | 精品日韩中文字幕 | 婷婷丁香在线视频 | 在线观看中文字幕dvd播放 | 国产一级性生活 | 91精品专区 | 高清av中文在线字幕观看1 | 97国产精品久久 | 亚洲精品高清视频 | 午夜成人影视 | 国产高清免费视频 | 免费福利片2019潦草影视午夜 | 免费在线观看av | 西西www4444大胆在线 | 成人午夜精品福利免费 | 涩涩爱夜夜爱 | 色婷婷久久 | 中文字幕一区二区三区四区视频 | 欧美日韩久久久 | 久久公开视频 | 在线你懂| 久久精品成人热国产成 | 在线亚洲小视频 | 国产欧美精品在线观看 | 国产午夜精品一区二区三区 | 久久成人一区二区 | 成人国产一区 | 欧美另类交在线观看 | 麻豆视频一区二区 | 香蕉一区 | 丁香婷婷亚洲 | 中文字幕在线观看一区二区三区 | 欧美在线视频a | 久久99精品国产一区二区三区 | 免费在线播放黄色 | 草莓视频在线观看免费观看 | 天操夜夜操| www日韩在线 | 国产小视频91 | 国产综合福利在线 | 国产黄网站在线观看 | 欧美亚洲国产一卡 | 黄色片视频免费 | 国产在线精品区 | 一区二区三区在线视频观看58 | 国产亚洲欧美在线视频 | 波多野结衣在线视频免费观看 | 日韩特级毛片 | 久久在线视频在线 | 精品99999 | 亚洲91精品在线观看 | 久久午夜免费观看 | 色在线高清 | 免费av影视 | 免费看av在线 | 国产精品一区久久久久 | 狠狠的日| 国产高清视频色在线www | 911亚洲精品第一 | 在线视频专区 | 国产精品视频 | 久久久久免费精品国产小说色大师 | 韩日精品视频 | 亚洲国产精品日韩 | 国产91在线免费视频 | 日韩一区二区三区免费视频 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 国产精品美女999 | 欧美天堂视频在线 | 成人午夜免费福利 | 夜夜操网站 | 91大神免费视频 | 天天插天天 | 91精品国产电影 | 91精品区 | 亚洲一区二区高潮无套美女 | 四虎影视精品 | 亚洲黄色片 | 500部大龄熟乱视频 欧美日本三级 | 国产精品在线看 | 四虎国产精品成人免费影视 | 日韩一三区| 在线视频麻豆 | 超碰999| 人人射人人爱 | 2023天天干| 综合天天网 | 国产精品美乳一区二区免费 | 午夜a区 | 日韩国产精品毛片 | 国内精品美女在线观看 | 久草在线资源观看 | 99久久精品国产观看 | 精品久久久久久久久久岛国gif | japanesefreesexvideo高潮 | 亚洲欧美视频一区二区三区 | 国内丰满少妇猛烈精品播 | 成 人 黄 色 视频免费播放 | 久久精品视频一 | 黄色三级免费看 | 欧美成年人在线观看 | 天天色天天操综合网 | 久久96国产精品久久99软件 | 亚洲午夜精品在线观看 | 最近中文字幕免费观看 | 99精品国产免费久久久久久下载 | 国产永久免费高清在线观看视频 | 免费高清影视 | 亚洲第一香蕉视频 | 免费久久久久久 | 欧美精品一区二区在线播放 | 国产天天爽 | 亚洲免费在线视频 | 在线黄色av电影 | 四虎视频 | 久久久久久久久久久久电影 | 久久热亚洲 | 在线成人一区二区 | 国产精品久久久久久久久免费 | 最新色视频 | 一级a性色生活片久久毛片波多野 | 国产自制av | 伊人婷婷 | 亚洲乱码中文字幕综合 | 成人免费在线观看电影 | 青青河边草手机免费 | 精品a在线 | 日本黄色大片免费看 | 欧美色婷 | 在线观看片 | 精品国产一区二区三区免费 | 久久视频6 | 夜夜骑首页 | 国产传媒中文字幕 | 懂色av一区二区在线播放 | 久艹在线播放 | 日本三级大片 | 99热只有精品在线观看 | 午夜18视频在线观看 | 黄色影院在线免费观看 | 私人av| 天天夜夜亚洲 | 97超碰资源| 亚洲免费在线观看视频 | 久久精品久久精品久久 | 欧美福利网站 | 91免费观看网站 | 欧美一级在线 | 91精品亚洲影视在线观看 | 日日草天天草 | 久久黄色免费视频 | 中文字幕免费成人 | 日韩一二区在线 | 欧美日韩高清一区二区 国产亚洲免费看 | 日韩三级视频在线观看 | 在线观看网站黄 | 在线观看视频中文字幕 | 亚洲免费不卡 | 亚洲无吗视频在线 | 久久久18| 日本最新一区二区三区 | 草久久久久 | 中文字幕av网站 | 九九热免费在线观看 | 亚洲日本国产 | 色天堂在线视频 | 欧美电影黄色 | 韩国一区二区在线观看 | 国产精品国产三级国产专区53 | 日韩日韩日韩日韩 | 在线免费黄色av | 欧美激情视频一二区 | 精品一区二区久久久久久久网站 | 色欧美成人精品a∨在线观看 | av丝袜在线 | 日韩av中文字幕在线免费观看 | 亚洲精品白浆高清久久久久久 | 91av在线免费 | 日韩视频在线一区 | 97国产情侣爱久久免费观看 | 亚洲一区二区视频 | 国产香蕉视频在线观看 | 日韩视频免费 | 91精品在线播放 | 久久成人免费电影 | 欧美精品被 | 日韩免费中文 | 欧美日韩国产一区二区三区在线观看 | 精品国产一区二区三区男人吃奶 | 九九国产精品视频 | 国内精品久久久久久久久久久 | 伊人永久| 91视频啊啊啊| 在线免费观看黄网站 | 中文在线最新版天堂 | 888av| 久久久性 | 天天躁日日躁狠狠躁av中文 | 精品色综合 | 国产毛片在线 | 黄色精品一区 | 在线观看免费91 | 成片视频在线观看 | 婷婷色九月| 成人蜜桃视频 | 免费福利视频网 | 日韩视频1| 欧美午夜激情网 | 成人免费在线网 | 久久综合久色欧美综合狠狠 | 欧美色精品天天在线观看视频 | 四虎精品成人免费网站 | av免费播放 | 91福利视频网站 | 亚洲狠狠婷婷 | 久草在线视频首页 | 麻豆免费精品视频 | 免费视频二区 | 国产精品久久久久久吹潮天美传媒 | 欧美激情精品久久 | 免费看的黄色网 | 国产又粗又猛又黄又爽的视频 | 黄色一级性片 | 五月婷香蕉久色在线看 | 婷婷色在线资源 | 日韩电影在线观看中文字幕 | 欧美怡红院视频 | 国产精品资源在线观看 | 精品成人在线 | 天天躁日日躁狠狠躁av中文 | 免费在线观看一区 | 最新精品国产 | 美腿丝袜一区二区三区 | 欧美日韩一区二区久久 | 色婷婷播放 | 亚洲精品看片 | 日韩欧美国产激情在线播放 | 国产视频精品在线 | 91欧美精品 | 精品视频在线播放 | a级国产毛片 | 亚洲女人天堂成人av在线 | 国产精品手机播放 | 天天干人人 | 99久高清在线观看视频99精品热在线观看视频 | 日本在线视频网址 | 久久伊人热 | 91精品少妇偷拍99 | 99精品国产视频 | www成人av | 三级黄色在线观看 | 啪啪av在线 | 免费精品在线观看 | a级黄色片视频 | 六月婷婷网 | 成人免费 在线播放 | 欧美色综合天天久久综合精品 | 国产精品不卡在线播放 | 日韩免费观看一区二区三区 | 一区三区在线欧 | 九九热精 | 色综合久久中文字幕综合网 | 色五月色开心色婷婷色丁香 | 中文字幕免费观看全部电影 | 天天草天天干 | 亚洲国产中文字幕在线 | 伊人国产在线播放 | 精品一二 | 超碰日韩 | 日韩精品视频在线观看网址 | 综合网久久 | 日韩av视屏| 在线观看 国产 | 欧美一级片播放 | 日韩h在线观看 | 日韩精品久久久久久久电影99爱 | 91插插影库 | 久久久久久久久久久电影 | 久久午夜剧场 | 探花国产在线 | 国产精品免费看 | 不卡国产在线 | 五月天丁香综合 | 久久久鲁 | 免费福利在线播放 | 免费网址你懂的 | 国产精品99免视看9 国产精品毛片一区视频 | 日韩a在线 | 国产精品欧美久久 | 午夜少妇一区二区三区 | 欧美一区二区精美视频 | 91自拍视频在线观看 | 91亚洲精品国偷拍 | 成人av在线亚洲 | 中文字幕有码在线 | 九九热在线播放 | 久久视频在线观看免费 | 免费观看的黄色 | 久久国产精品精品国产色婷婷 | 日韩视频免费 | 成人av电影在线 | 国产在线观看地址 | 久久毛片网 | 日本性高潮视频 | 国产精品一区免费在线观看 | 综合天堂av久久久久久久 | 日产中文字幕 | 五月婷婷丁香在线观看 | 在线观看中文字幕 | 国产精品99久久久久久有的能看 | 国产精品一区二区免费 | 国产精品久久久久婷婷 | 国产精品成人av电影 | 精品视频亚洲 | 伊人天天狠天天添日日拍 | 亚洲综合网 | 日韩在线播放欧美字幕 | 99久久电影| 亚洲精品自拍 | 久久精品视频在线观看 | 日韩电影一区二区三区在线观看 | 主播av在线 | a黄色片 | 一区二区三区免费在线 | 日韩一区二区免费播放 | 久久久久国产精品一区二区 | 亚洲成a人片在线观看网站口工 | 欧美黄色软件 | 精品久久精品 | 欧美性视频网站 | 久久久综合电影 | 伊人va| 国产最新视频在线观看 | 人人爽人人爽人人爽学生一级 | 中文在线字幕免费观 | 日本黄色免费网站 | 亚洲最大成人免费网站 | 久久精品毛片基地 | 亚洲乱码在线观看 | 最近中文字幕免费 | 久久99最新地址 | 日韩精品一区电影 | 久久免费福利 | 亚洲精品一区二区久 | 888av| 国产.精品.日韩.另类.中文.在线.播放 | 亚洲 中文 在线 精品 | 成人va天堂 | 精品美女国产在线 | 欧美视频99 | 69av国产 | 最新av在线网站 | 亚洲成av人影院 | 黄色av一级 | 狠狠操狠狠干天天操 | 欧美日韩在线第一页 | 天天骚夜夜操 | 亚洲欧美日韩一二三区 | 超碰av在线免费观看 | 国产精品破处视频 | 国产精品黄色av | 国产精品久久久久久久av电影 | 日本久久久久久 | 亚洲国产免费看 | 久久国产亚洲 | 人人看人人爱 | 国产成人精品在线播放 | wwxxxx日本| 日韩欧美国产免费播放 | 国产一区欧美二区 | 欧美成人va | 精品一区二区精品 | 国产高清视频免费在线观看 | 国产精品久久久久9999 | 国产精品无av码在线观看 | 天天爽天天碰狠狠添 | 97在线观看免费高清完整版在线观看 | 蜜桃av人人夜夜澡人人爽 | 国产高清成人 | 久久精品99国产精品亚洲最刺激 | 免费裸体视频网 | av片中文 | 亚洲国产小视频在线观看 | 狠狠色狠狠色 | 久久久精品 一区二区三区 国产99视频在线观看 | 久久精品视频一 | 夜夜夜影院| 久草在线久 | 水蜜桃亚洲一二三四在线 | 天堂在线一区二区三区 | 九九亚洲精品 | 天天摸日日摸人人看 | 日日爱视频 | 99久久久久国产精品免费 | 亚洲天堂网在线视频 | 在线精品视频免费观看 | 天天色天天干天天 | 视频直播国产精品 | 亚洲视频 视频在线 | 国产精品综合久久久 | 日韩二区精品 | 500部大龄熟乱视频使用方法 | 99r在线视频 | 天天看天天干 | 亚洲最新视频在线播放 | 日本黄色一级电影 | 一区二区三区免费 | 99视频在线免费看 | 国产黄在线播放 | 国产精品99免费看 | 久久久噜噜噜久久久 | 国产精品不卡av | 一本一本久久a久久精品综合小说 | 一区二区三区中文字幕在线观看 | 久久综合久久综合这里只有精品 | 日本黄色大片儿 | 国产小视频在线免费观看视频 | 久久免费电影 | 又色又爽又激情的59视频 | 成年人天堂com | 99久e精品热线免费 99国产精品久久久久久久久久 | 天天干天天操 | 亚洲国产美女精品久久久久∴ | www天天干| 在线成人欧美 | 免费在线黄色av | www免费网站在线观看 | 免费在线观看av的网站 | 在线观看91视频 | 国产精品黄色影片导航在线观看 | 波多野结衣动态图 | 国产成人精品三级 | 性色va| 久久精品一区二区三区视频 | 国产精品久久一卡二卡 | 男女拍拍免费视频 | 在线国产日韩 | 中文在线中文资源 | 国产精品一区久久久久 | 国产精品专区h在线观看 | 激情丁香| 天天躁天天操 | 射综合网| 免费精品在线视频 | 国产视频在线观看一区 | 国产手机视频 | 精品久久久久久国产91 | 激情婷婷亚洲 | 啪啪动态视频 | 91亚洲激情| 国产高清在线永久 | 日韩影片在线观看 | 玖操| 欧美日韩免费一区 | 国产激情小视频在线观看 | 97精品国自产拍在线观看 | 婷婷五情天综123 | 91黄色视屏| 亚洲精品国产综合99久久夜夜嗨 | 久久国产精品99久久久久 | 91亚洲精品乱码久久久久久蜜桃 | 人人擦| 久久精品视频在线看 | 国产视频久久久 | 大胆欧美gogo免费视频一二区 | 精品视频免费 | www.97色.com| 亚洲精品国产品国语在线 | 日本中文在线 | 麻豆超碰 | 免费成人av电影 | 天天曰天天干 | 97精品国产97久久久久久免费 | 欧美一区二区三区特黄 | 四虎成人免费观看 | 91男人影院 | 免费a现在观看 | 99在线热播精品免费99热 | 91社区国产高清 | 久久久久免费精品 | 在线看片成人 | 在线免费高清视频 | 日韩精品一区二区三区在线播放 | 麻豆视频在线 | 日韩最新在线 | 日韩av网站在线播放 | 国产成人三级在线播放 | 成人在线观看免费 | 99精品免费在线观看 | 久久99视频免费 | 粉嫩aⅴ一区二区三区 | 亚洲人成精品久久久久 | 亚洲精品动漫久久久久 | 国产精品免费在线播放 | 国产99久久久国产精品免费二区 | 久久免费视频精品 | 欧美日韩国产综合一区二区 | 成人精品视频 | 欧美一二三四在线 | 亚洲成色777777在线观看影院 | 国产精品一区二区三区在线看 | 国产成人亚洲在线电影 | 在线观看av网 | 国产不卡在线看 | 国产尤物一区二区三区 | 在线播放视频一区 | 992tv又爽又黄的免费视频 | 色综合亚洲精品激情狠狠 | 久久人人爽人人 | 99国产一区二区三精品乱码 | 99精品美女 | 日本激情视频中文字幕 | 成人av免费在线播放 | 国产黄色片在线 | 五月婷婷综合在线观看 | 久久午夜电影院 | av资源中文字幕 | 成人av一区二区在线观看 | 国产一级黄色免费看 | 天天射天天干天天爽 | 亚洲综合在线观看视频 | 天天爽天天爽夜夜爽 | 日韩欧美综合 | 色多多污污在线观看 | 91传媒免费在线观看 | 500部大龄熟乱视频使用方法 | 国产精品日韩欧美 | 九九九九精品九九九九 | 四虎影视www | 亚洲欧美在线视频免费 | av在线电影免费观看 | 日韩欧美aaa| 国产一区在线视频观看 | 午夜国产在线 | 最新黄色av网址 | 久久精品久久综合 | 91福利区一区二区三区 | 午夜精品一区二区国产 | 久久精品爱视频 | 欧美成年人在线观看 | 狠狠久久综合 | 久久精品一区二区三区国产主播 | 欧美日韩国产一二 | 成人在线一区二区 | 日韩在线观看一区二区三区 | 久久免费av电影 | www色com| 国产美女视频一区 | 啪啪小视频网站 | av不卡中文 | 中文字幕中文字幕 | 手机av在线免费观看 | 亚洲天堂视频在线 | 日日夜夜天天人人 | 精品福利视频在线观看 | 国产精品一区二区美女视频免费看 | 午夜久久视频 | 日韩午夜剧场 | 夜夜操狠狠干 | 亚洲一区二区精品在线 | 天天操天天摸天天爽 | 亚洲天堂网在线视频 | 天天躁天天操 | 亚洲日本在线视频观看 | 日韩激情av在线 | 亚洲高清视频一区二区三区 | 中文字幕久久久精品 | 中文字幕在线观看播放 | 亚洲精品在线网站 | 99热这里只有精品8 久久综合毛片 | 国产国语在线 | 久久国产精品免费视频 | 黄色小说免费观看 | avcom在线 | 少妇啪啪av入口 | 国产精品久久伊人 | 亚洲精品av在线 | 亚洲免费视频观看 | 亚洲精品黄色在线观看 | 超碰精品在线 | 国产成人精品一区二区在线 | 免费看黄在线网站 | 国产黄色理论片 | 国产高清免费观看 | 天天艹日日干 | 色婷婷丁香| 精品99在线视频 | 欧美成人69av | av千婊在线免费观看 | 超碰人人射 | 久久久鲁| 欧美一级特黄aaaaaa大片在线观看 | 美女很黄免费网站 | va视频在线观看 | 粉嫩av一区二区三区四区 | 国产福利小视频在线 | 国产成人中文字幕 | 国产91影院| 丁香婷婷在线 | 欧美日韩在线视频一区 | 日韩一级片观看 | 国产v视频 | 欧美日本一二三 | 日日久视频 | 97人人添人澡人人爽超碰动图 | 国产九九精品视频 | 亚洲精品中文在线 | 日韩欧美黄色网址 | 色五月色开心色婷婷色丁香 | 国产亚洲精品久久久久久大师 | 三上悠亚一区二区在线观看 | 国产区在线视频 | 狠狠操欧美 | 亚洲综合小说电影qvod | 国产高清视频网 | 免费在线观看91 | 亚洲精品视频网 | 国产女教师精品久久av | bbbb操bbbb| 91人人澡人人爽人人精品 | 91完整版观看 | 国产精品女主播一区二区三区 | 久久亚洲免费视频 | 黄色三级网站在线观看 | 久久成人国产精品免费软件 | 国产999精品久久久 免费a网站 | 国产美女网站在线观看 | 黄视频网站大全 | 视色网站 | 九九热精品视频在线播放 | 俺要去色综合狠狠 | 国产精品一区二区三区观看 | 久久福利影视 | 波多野结衣久久资源 | 亚洲国产美女久久久久 | 日韩最新理论电影 | 精品国产欧美一区二区三区不卡 | 麻豆视频网址 | 91看片在线播放 | 国产一区二区三区午夜 | 91成人看片 | 久久国产午夜精品理论片最新版本 | 正在播放国产一区二区 | 超碰成人免费电影 | 国产精品18久久久久久久久 | 五月激情久久久 | 三级av在线| 99一级片 | 久久在线免费 | 成人在线观看免费 | 国产精品国产毛片 | 亚洲精品99久久久久久 | 午夜成人影视 | 人人狠狠综合久久亚洲婷 | 91日韩精品一区 | 91看片淫黄大片91 | 开心激情五月网 | 国产97色在线 | 日本三级香港三级人妇99 | 欧美性护士 | 日夜夜精品视频 | 日韩在线观看小视频 | 又湿又紧又大又爽a视频国产 | 日日夜夜狠狠操 | 青青五月天 | 久久久久久久久免费视频 | 国产三级午夜理伦三级 | 青草视频在线 | 国产五月婷 | 国产成人精品一区二区三区在线 | 91在线欧美| 国产精品2区 | 久久视频中文字幕 | 成人小视频在线免费观看 | 久久精品中文字幕一区二区三区 | 蜜桃视频日本 | 91大神电影| 久久久久久久久艹 | 免费a视频| 国产成人一区二区三区久久精品 | 日本字幕网| 狠狠色丁香婷婷综合基地 | 久久99在线 | 国产精品小视频网站 | 色99导航 | 亚洲特级片 | 亚洲午夜久久久综合37日本 | 黄色激情网址 | 在线观看香蕉视频 | 色偷偷网站视频 | 中文字幕在线国产精品 | 97超碰伊人 | 成人在线免费观看网站 | 91视频a | 国产原创中文在线 | 久久久久久久久久久精 | 在线免费视 | 99免费观看视频 | 亚洲乱码精品 | 亚洲成人黄色在线观看 | 亚洲热视频 | 美女视频黄网站 | 91亚洲国产成人久久精品网站 | 亚洲视频99 | 日韩网站免费观看 | 伊人手机在线 | 九九精品久久久 | 九九热只有这里有精品 | 91色在线观看 | 91九色porn在线资源 | 天天爽天天爽天天爽 | 久久午夜国产精品 | 免费看的国产视频网站 | 色婷av| 日韩欧美精品在线视频 | 欧美精品久久久久a | 操操操av | 九九九九九九精品任你躁 | 国产精品热 | 91在线日韩 | adc在线观看 | 天天看天天干 | 国产精品一区二区在线 | 久艹视频在线观看 | 久久视频精品在线观看 | 国产精品第一页在线观看 | 久久九九九九 | 999国内精品永久免费视频 | 日日天天av | 欧美一区日韩一区 | 一区二区三区四区久久 | 97在线影视 | 久久精品久久99精品久久 | 亚洲国产操 | 在线不卡a | 国产黄色网| 天天色天天干天天色 | 欧美性生活大片 | 在线观看免费中文字幕 | 免费av黄色 | 国产综合视频在线观看 | 国产麻豆剧果冻传媒视频播放量 | 亚洲在线视频网站 | 亚洲欧美999| 久久久午夜剧场 | 人人狠狠| 干天天| 一区二区三区电影在线播 | 久久久影视 | 天堂va在线高清一区 | 欧美日韩免费看 | 狠狠色噜噜狠狠狠合久 | 香蕉一区| 亚洲精品网站在线 | 久久精品视频在线 | 人人看人人草 | 99视频网站 | 国产精品久久久久久久久久久免费看 | 国产午夜小视频 | 色婷婷色| www.成人sex| 成人资源在线观看 | 精品人妖videos欧美人妖 | 超碰日韩在线 | av中文字幕在线电影 | 婷婷在线综合 | 国产精品久久久久一区二区国产 | 午夜久久福利影院 | 2019精品手机国产品在线 | 国产日韩精品一区二区在线观看播放 | 97精品视频在线 | 九九精品视频在线看 | 国产大片黄色 | 亚洲在线| 日本中文字幕在线电影 | 国产91免费在线观看 | 中文字幕黄色网址 | 成人影视免费 | 字幕网资源站中文字幕 | 九色最新网址 | 国产精品免费在线播放 | 国产一区免费在线 | 91精品伦理| 色视频网站在线观看一=区 a视频免费在线观看 | 中文字幕色网站 | 国产精品无av码在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产精品a久久 | 久 久久影院| 在线一二三四区 | 国产精品亚洲成人 | 国产在线播放一区 | 国产成人av电影在线 | www.黄色在线 | 麻豆播放 | 久久99久久99精品免观看粉嫩 | av在线com| 婷婷成人亚洲综合国产xv88 | 蜜桃久久久 | 国产精品久久久影视 | 456成人精品影院 | 97日日碰人人模人人澡分享吧 | 国产直播av | 免费av网站观看 | 六月婷婷久香在线视频 | 激情小说 五月 | 久久精品视频中文字幕 | 欧美性超爽 | 中文字幕在线观看免费观看 | ,午夜性刺激免费看视频 | a级片在线播放 | 久久久高清一区二区三区 | 欧美日韩在线网站 | 日韩手机在线 | 免费成人在线观看视频 | 黄色网中文字幕 | 婷婷网址 | 射九九 | 国产精品黑丝在线观看 | 在线观看岛国 | 亚洲精选视频免费看 | 天天色天天草天天射 | 久久国产精品影视 |