ajax(Asynchronous JavaScript + XML) 技術學習

来源:http://www.cnblogs.com/qiqizuo/archive/2017/06/07/6959197.html
-Advertisement-
Play Games

參考文檔:https://developer.mozilla.org/en-US/docs/AJAX 本文進行了大致翻譯。 Ajax 本身本不是一門技術,而是在2005年由Jesse James Garrett首創的描述為一個“新”途徑來應用許多已存在的技術,包括:HTML 或者 XHTML, Ca ...


參考文檔:https://developer.mozilla.org/en-US/docs/AJAX 本文進行了大致翻譯。   Ajax 本身本不是一門技術,而是在2005年由Jesse James Garrett首創的描述為一個“新”途徑來應用許多已存在的技術,包括:HTML 或者 XHTMLCascading Style SheetsJavaScriptThe Document Object ModelXMLXSLT, 和最重要的 XMLHttpRequest object。 當把這些技術結合到ajax模型里的時候,web app可以快速地,逐漸地更新用戶界面來取代以前的刷新整個瀏覽界面,這使得應用更快和用戶使用體驗更好。   儘管x在ajax裡面代表xml,json由於其更輕和是javascript的一部分等優點而被更多的使用。ajax模型裡面的json和xml都是用來包裝數據信息的。  

什麼是AJAX?

AJAX 代表 Asynchronous JavaScript And XML. 簡而言之, 他是用 XMLHttpRequestobject 來和伺服器交流的方式. 它可以以不同的方式發送和接收信息, 包括 JSON, XML, HTML, 和text文件. AJAX最有吸引力的特性是 "非同步", 這意味著它可以在不刷新頁面的情況下同伺服器交流,交換數據更新頁面。   ajax的主要兩個主要特性:
  • 不刷新頁面請求數據
  • 從伺服器獲取數據
 

Step 1 – 如何請求

為了用javascript請求伺服器,我們要實例化一個有必要功能的對象。這是XMLHttpRequest的來源。起初Internet Explorer實現了一個被稱為XMLHTTP的ActiveX對象。 之後,Mozilla, Safari,和其他瀏覽器廠商陸續實現了XMLHttpRequest對象來支持這個方法和類似於Microsof的ActiveX對象功能。同時,Microsoft也實現了XMLHttpRequest。     // Old compatibility code, no longer needed. if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+ ...     httpRequest = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE 6 and older     httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); }   註意:以上代碼只做解釋作用,只是創建了XMLHttp的實例。可以跳到step 3去看更實用的例子。   請求之後,我們需要接收請求結果。在這個階段,我們需要告訴XMLHttp請求對象來處理響應的JavaScript方法,通過配置他的onreadystatechangeproperty方法,如下:
httpRequest.onreadystatechange = nameOfTheFunction;
或者
httpRequest.onreadystatechange = function(){
// Process the server response here.
};
在聲明怎麼接受響應之後,我們需要發起請求,通過調用HTTP請求對象的 open() 和 send() 方法,如下:
httpRequest.open('GET', 'http://www.example.org/some.file', true);
httpRequest.send();
  •  open() 的第一個參數是HTTP 請求的方法 – GET, POST, HEAD, 或者其他伺服器支持的方法。方法名全部大寫是http標準,不然有些瀏覽器(例如:Firefox)可能會不發器請求。 點擊 W3C specs 獲得更多關於http請求方法的信息。
  • 第二個參數是要請求的url。從安全方面考慮,預設不能跨域請求url。確保所有頁面在同一個功能變數名稱下,不然調用open()方法,你會得到 "permission denied” 錯誤。 一個常見的跨域是你網站的功能變數名稱是 domain.tld,但是嘗試用 www.domain.tld訪問頁面。如果真的想跨域請求,查看 HTTP access control
  • 可選的第三個參數設置這個請求是同步還是非同步的。如果是true (預設值), JavaScript 會繼續執行,用戶操作頁面的同時,伺服器返回數據。這是 AJAX的A。
send()方法的參數可以是你想發送到伺服器的任意數據(POST)。表單數據必須是伺服器能解析的形式,例如查詢字元串:
"name=value&anothername="+encodeURIComponent(myVar)+"&so=on"
或者其他形式,例如 multipart/form-data,JSON, XML, 等等。 註意如果你想POST數據,你可能要設置請求的MIME type。例如我們把下麵代碼放在調用send()之前,來把表單數據當查詢數據發送:
httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

Step 2 – 處理伺服器響應

請求的時候,我們已經提供了處理響應的JavaScript方法:
httpRequest.onreadystatechange = nameOfTheFunction;
這個方法做什麼?首先,我們需要檢查請求狀態。如果張台值為XMLHttpRequest.DONE (4),意味著已經接受了所有伺服器的響。
if (httpRequest.readyState === XMLHttpRequest.DONE) {
// Everything is good, the response was received.
} else {
// Not ready yet.
}
 readyState 全部可能的值,可以在 XMLHTTPRequest.readyState 查看,如下:
  • 0 (uninitialized) or (請求未初始化)
  • 1 (loading) or (伺服器建立連接)
  • 2 (loaded) or (請求被接收)
  • 3 (interactive) or (執行請求)
  • 4 (complete) or (request finished and response is ready請求完成響應到位)
  • Value State Description
    0 UNSENT Client has been created. open() not called yet.
    1 OPENED open() has been called.
    2 HEADERS_RECEIVED send() has been called, and headers and status are available.
    3 LOADING Downloading; responseText holds partial data.
    4 DONE The operation is complete.
(Source) 接下來,檢查HTTP響應的 response code 。查看 W3C看到可能的值。下麵例子我們用response code是不是等於200來判斷ajax請求是否成功。
if (httpRequest.status === 200) {
// Perfect!
} else {
// There was a problem with the request.
// For example, the response may have a 404 (Not Found)
// or 500 (Internal Server Error) response code.
}
檢查完響應值後。我們可以隨意處理伺服器返回的數據,有兩個選擇獲得這些數據:
  • httpRequest.responseText – 返回伺服器響應字元串
  • httpRequest.responseXML – 返回伺服器響應XMLDocument 對象 可以傳遞給JavaScript DOM 方法
上面的代碼只有在非同步的情況下有效(open() 的第三個參數設置為true)。如果你用同步請求,就沒必要指定一個方法。但是我們不鼓勵使用同步請求,因為同步會導致極差的用戶體驗。

Step 3 – 一個簡單的例子

我們把上面的放在一起合成一個簡單的HTTP請求。我們的JavaScript 將請求一個HTML 文檔, test.html, 包含一個字元串 "I'm a test."然後我們alert()響應內容。這個例子使用普通的JavaScript — 沒有引入jQuery, HTML, XML 和 PHP 文件應該放在同一級目錄下。
<button id="ajaxButton" type="button">Make a request</button>

<script>
(function() {
var httpRequest;
document.getElementById("ajaxButton").addEventListener('click', makeRequest);

function makeRequest() {
httpRequest = new XMLHttpRequest();

if (!httpRequest) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
httpRequest.onreadystatechange = alertContents;
httpRequest.open('GET', 'test.html');
httpRequest.send();
}

function alertContents() {
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
alert(httpRequest.responseText);
} else {
alert('There was a problem with the request.');
}
}
}
})();
</script>
在這個例子里:
  • 用戶點擊"Make a request” 按鈕;
  • 事件調用 makeRequest() 方法;
  • 請求發出,然後 (onreadystatechange)執行傳遞給 alertContents();
  • alertContents() 檢查響應是否 OK, 然後 alert() test.html 文件內容。
    註意 1: 如果伺服器返回XML,而不是靜態XML文件,你必須設置response headers 來相容i.e.。如果你不設置headerContent-Type: application/xml, IE 將會在你嘗試獲取 XML 元素之後拋出一個JavaScript "Object Expected" 錯誤 。     註意 2: 如果你不設置header Cache-Control: no-cache 瀏覽器將會緩存響應不再次提交請求,很難debug。你可以添加永遠不一樣的GET 參數,例如 timestamp 或者 隨機數 (查看 bypassing the cache)   註意 3: 如果 httpRequest 變數是全局的,混雜調用 makeRequest()會覆蓋各自的請求,導致一個競爭的狀態。在一個closure 里聲明 httpRequest 本地變數 來避免這個問題。 在發生通信錯誤(如伺服器崩潰)、onreadystatechange方法會拋出一個異常,當訪問響應狀態。為了緩解這個問題,你可以用ry…catch包裝你的if...then 語句:
function alertContents() {
try {
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
alert(httpRequest.responseText);
} else {
alert('There was a problem with the request.');
}
}
}
catch( e ) {
alert('Caught Exception: ' + e.description);
}
}

Step 4 – 使用 XML 響應

在前面的例子里,在獲取到響應之後,我們用request 對象responseText 屬性獲得 test.html 文件內容。現在讓我們嘗試獲取responseXML 屬性。 首先,讓我們創建一個有效的XML文檔,留著待會我們請求。(test.xml)如下:
<?xml version="1.0" ?>
<root>
I'm a test.
</root>
在這個腳本里,我們只要修改請求行為:
...
onclick="makeRequest('test.xml')">
...
然後在alertContents()里,我們需要把 alert(httpRequest.responseText); 換為:
var xmldoc = httpRequest.responseXML;
var root_node = xmldoc.getElementsByTagName('root').item(0);
alert(root_node.firstChild.data);
這裡獲得了responseXML的XMLDocument,然後用 DOM 方法來獲得包含在XML文檔裡面的內容。你可以在here查看test.xml,在here查看修改後的腳本。

Step 5 – 使用數據返回

最後,讓我們來發送一些數據到伺服器,然後獲得響應。我們的JavaScript這次將會請求一個動態頁面,test.php將會獲取我們發送的數據然後返回一個計算後的字元串 - "Hello, [user data]!",然後我們alert()出來。 首先我們加一個文本框到HTML,用戶可以輸入他們的姓名:
<label>Your name: 
<input type="text" id="ajaxTextbox" />
</label>
<span id="ajaxButton" style="cursor: pointer; text-decoration: underline">
Make a request
</span>
我們也給事件處理方法裡面加一行獲取文本框內容,並把它和伺服器端腳本的url一起傳遞給 makeRequest() 方法:
  document.getElementById("ajaxButton").onclick = function() { 
var userName = document.getElementById("ajaxTextbox").value;
makeRequest('test.php',userName);
};
我們需要修改makeRequest()方法來接受用戶數據並且傳遞到服務端。我們將把方法從 GET 改為 POST,把我們的數據包裝成參數放到httpRequest.send():
function makeRequest(url, userName) {

...

httpRequest.onreadystatechange = alertContents;
httpRequest.open('POST', url);
httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
httpRequest.send('userName=' + encodeURIComponent(userName));
}
如果服務端只返回一個字元串, alertContents() 方法可以和Step 3 一樣。然而,服務端不僅返回計算後的字元串,還返回了原來的用戶名。所以如果我們在輸入框裡面輸入 “Jane”,服務端的返回將會像這樣: {"userData":"Jane","computedString":"Hi, Jane!"} 要在alertContents()使用數據,我們不能直接alert responseText, 我們必須轉換數據然後 alert computedString屬性:
function alertContents() {
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
var response = JSON.parse(httpRequest.responseText);
alert(response.computedString);
} else {
alert('There was a problem with the request.');
}
}
}
test.php 文件如下:
$name = (isset($_POST['userName'])) ? $_POST['userName'] : 'no name';
$computedString = "Hi, " . $name;
$array = ['userName' => $name, 'computedString' => $computedString];
echo json_encode($array);
查看更多DOM方法, 請查看 Mozilla's DOM implementation 文檔。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [1]元素相關 [2]數據相關 [3]類型檢測 [4]數組相關 [5]其他 ...
  • 在JavaScript中,函數是作為一等成員而存在的,由此,非常有必要掌握JavaScript中函數的知識,最近幾天閱讀了JavaScript忍者的第三章和第四章前面的部分,做一個總結。 JavaScript函數聲明: JavaScript函數是使用 函數字面量 進行聲明 從而創建函數的。 形如 函 ...
  • [1]數據操作 [2]隊列操作 [3]集合操作 [4]索引過濾 [5]內容過濾 ...
  • 概念 webpack是一個現代javascript應用程式的模塊打包器。 當webpack處理你的應用程式時,它會遞歸構建一個依賴圖(包含了你的應用程式所需要每個模塊),然後把這些模塊打包到少數幾個budle文件中(通常是只有一個,會被瀏覽器載入,根據項目情況而定)。 這是令人難以置信的配置,但開始 ...
  • 第一次學習Node.js爬蟲,所以這時一個簡單的爬蟲,Node.js的好處就是可以併發的執行 這個爬蟲主要就是獲取慕課網的課程信息,並把獲得的信息存儲到一個文件中,其中要用到cheerio庫,它可以讓我們方便的操作HTML,就像是用jQ一樣 開始前,記得 為了能夠併發的進行爬取,用到了Promise ...
  • v model的神奇 html js 一旦我們輸入的值發生變化,data中的poin值也會發生變化。 理論上data中的值發生變化是會出發事件的,但是我們沒看見? 其實在vue的文檔中有說明: 是下麵的語法糖 每次我們輸入的時候觸發了 事件,input綁定了內聯函數,從而改變了 的值。 你好奇inp ...
  • 層疊性 所謂層疊性是指多種CSS樣式的疊加,也就是說後面設置的樣式會層疊(覆蓋)之前的樣式,層疊性的前提是CSS的選擇器的優先順序相同,例如,當使用內嵌式CSS樣式表定義<p>標記字型大小大小為12像素,鏈入式定義<p>標記顏色為紅色,那麼段落文本將顯示為12像素紅色,即這兩種樣式產生了疊加。 瀏覽器顯示 ...
  • 今天複習了一下麵向對象編程,下麵是我的效果圖 看著這個圖片你會覺得這沒有什麼,那麼上代碼: html部分: 必要的css代碼 js部分: 輪播的js 希望能幫到大家,還有就是這個不是基於jQuery的,我自己封裝了一個簡單的方法。 以後我們圖片輪播可以使用 這樣使用於比較多的輪播組件的網站,當然我們 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...