Ajax基本概念和原理

来源:http://www.cnblogs.com/dulmcat/archive/2016/08/27/5812062.html
-Advertisement-
Play Games

什麼是Ajax Ajax 是一種在無需重新載入整個網頁的情況下,能夠更新部分網頁的技術。 Ajax的全稱是Asynchronous JavaScript and XML,即非同步JavaScript+XML。它並不是新的編程語言,而是幾種原有技術的結合體。它由以下幾種技術組合而成,包括: HTML/X ...


什麼是Ajax

Ajax 是一種在無需重新載入整個網頁的情況下,能夠更新部分網頁的技術。

Ajax的全稱是Asynchronous JavaScript and XML,即非同步JavaScript+XML。它並不是新的編程語言,而是幾種原有技術的結合體。它由以下幾種技術組合而成,包括:

  • HTML/XHTML——主要的內容表示語言。
  • CSS——為XHTML提供文本格式定義。
  • DOM——對已載入的頁面進行動態更新。
  • XML——數據交換格式。
  • XSLT——將XML轉換為XHTML(用CSS修飾樣式)。
  • XMLHttp——用XMLHttpRequest來和伺服器進行非同步通信,是主要的通信代理。
  • JavaScript——用來編寫Ajax引擎的腳本語言。

實際上,在Ajax解決方案中這些技術都是可用的,不過只有三種是必須的:HTML/XHTML、DOM以及JavaScript。

XMLHttpRequest對象

當需要非同步與伺服器交換數據時,需要XMLHttpRequest對象來非同步交換。XMLHttpRequest對象的主要屬性有:

  • onreadystatechange——每次狀態改變所觸發事件的事件處理程式。
  • responseText——從伺服器進程返回數據的字元串形式。
  • responseXML——從伺服器進程返回的DOM相容的文檔數據對象。
  • status——從伺服器返回的數字代碼,如404(未找到)和200(已就緒)。
  • status Text——伴隨狀態碼的字元串信息。
  • readyState——對象狀態值。對象狀態值有以下幾個:
    • 0 - (未初始化)還沒有調用send()方法
    • 1 - (載入)已調用send()方法,正在發送請求
    • 2 - (載入完成)send()方法執行完成
    • 3 - (交互)正在解析響應內容
    • 4 - (完成)響應內容解析完成,可以在客戶端調用了

對於readyState的狀態值,其中“0”狀態是在定義後自動具有的狀態值,而對於成功訪問的狀態(得到信息)我們大多數採用“4”進行判斷。

Ajax的核心就是是JavaScript對象XmlHttpRequest,這個對象為向伺服器發送請求和解析伺服器響應提供了流暢的介面。XmlHttpRequest可以使用JavaScript向伺服器提出請求並處理響應,而不阻塞用戶。

XHR對象由IE5率先引入,在IE5中XHR對象是通過MSXML庫中一個ActiveX對象實現的,根據IE版本不同可能會遇到不同版本XHR對象,而IE7+與其它現代瀏覽器均支持原生的XHR對象,在這些瀏覽器中我們只需使用XMLHttpRequest構造函數就可以構造XHR對象,因此一個瀏覽器相容的創建XHR對象的函數寫法大概是這個樣子:

1 var xmlhttp;
2 if (window.XMLHttpRequest) {
3   // code for IE7+, Firefox, Chrome, Opera, Safari
4   xmlhttp=new XMLHttpRequest();
5 } else {
6   // code for IE6, IE5
7   xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
8 }

XMLHttpRequest對象用法

XMLHttpRequest對象有兩個重要方法 open與send。


1 xmlhttp.open("GET","ajax_info.txt",true);
2 xmlhttp.send();

對於open方法,有幾點需要註意:

  1. URL是相對於當前頁面的路徑,也可以似乎用絕對路徑。
  2. open方法不會向伺服器發送真正請求,它相當於初始化請求並準備發送。
  3. 只能向同一個域中使用相同協議和埠的URL發送請求,否則會因為安全原因報錯。

真正能夠向伺服器發送請求需要調用send方法,並僅在POST請求可以傳入參數,不需要則發送null,在調用send方法之後請求被髮往伺服器。  

請求發往伺服器,伺服器根據請求生成響應(Response),傳回給XHR對象,在收到響應後相應數據會填充到XHR對象的屬性,有四個相關屬性會被填充:

  • responseText——從伺服器進程返回數據的字元串形式。
  • responseXML——從伺服器進程返回的DOM相容的文檔數據對象。
  • status——從伺服器返回的數字代碼,如404(未找到)和200(已就緒)。
  • status Text——伴隨狀態碼的字元串信息。

在收到響應後第一步是檢查響應狀態,確保響應是否成功返回(狀態為200)。

1 xhr.open('get','default.aspx,false'); //準備同步請求
2 xhr.send();
3 if(xhr.status>=200 && xhr.status<300 || xhr.status==304){
4      //do something
5 }else{
6       //error handler
7 }

上面代碼在發送同步請求的時候沒問題,只有得到響應後才會執行檢查status語句,但是在非同步請求時,JavaScript會繼續執行,不等生成響應就檢查狀態碼,這樣我們不能保證檢查狀態碼語句是在得到響應後執行(實際上也幾乎不可能,伺服器再快一個HTTP請求也不會快過一條JavaScript執行數度),這時候我們可以檢查XHR對象的readyState屬性,該屬性表示請求/響應過程中的當前活動階段,每當readyState值改變的時候都會觸發一次onreadystatechange事件。

我們可以利用這個事件檢查每次readyState變化的值,當為4的時候表示所有數據準備就緒,有一點我們需要註意:必須在open方法之前指定onreadtstatechange事件處理程式。

1 xmlhttp.onreadystatechange=function(){
2   if (xmlhttp.readyState==4 && xmlhttp.status==200){
3     document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
4     }
5   }
6 xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
7 xmlhttp.send();

GET 還是 POST?

與 POST 相比,GET 更簡單也更快,並且在大部分情況下都能用。

然而,在以下情況中,請使用 POST 請求:

  • 無法使用緩存文件(更新伺服器上的文件或資料庫)
  • 向伺服器發送大量數據(POST 沒有數據量限制)
  • 發送包含未知字元的用戶輸入時,POST 比 GET 更穩定也更可靠

一個簡單的 GET 請求:

xmlhttp.open("GET","demo_get.html",true);
xmlhttp.send();

在上面的例子中,可能得到的是緩存的結果。

為了避免這種情況,向 URL 添加一個唯一的 ID:

xmlhttp.open("GET","demo_get.html?t=" + Math.random(),true);
xmlhttp.send();

如果希望通過 GET 方法發送信息,向 URL 添加信息:

xmlhttp.open("GET","demo_get2.html?fname=Henry&lname=Ford",true);
xmlhttp.send();

一個簡單 POST 請求:

xmlhttp.open("POST","demo_post.html",true);
xmlhttp.send();

如果需要像 HTML 表單那樣 POST 數據,請使用 setRequestHeader() 來添加 HTTP 頭。然後在 send() 方法中規定您希望發送的數據:

xmlhttp.open("POST","ajax_test.html",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Henry&lname=Ford");

open() 方法的 url 參數是伺服器上文件的地址:

xmlhttp.open("GET","ajax_test.html",true);

該文件可以是任何類型的文件,比如 .txt 和 .xml,或者伺服器腳本文件,比如 .asp 和 .php (在傳迴響應之前,能夠在伺服器上執行任務)。

非同步 - True 或 False?

XMLHttpRequest 對象如果要用於 AJAX 的話,其 open() 方法的 async 參數必須設置為 true:

xmlhttp.open("GET","ajax_test.html",true);

對於 web 開發人員來說,發送非同步請求是一個巨大的進步。很多在伺服器執行的任務都相當費時。AJAX 出現之前,這可能會引起應用程式掛起或停止。

通過 AJAX,JavaScript 無需等待伺服器的響應,而是:

  • 在等待伺服器響應時執行其他腳本
  • 當響應就緒後對響應進行處理

當使用 async=true 時,規定在響應處於 onreadystatechange 事件中的就緒狀態時執行的函數:

xmlhttp.onreadystatechange=function(){
  if (xmlhttp.readyState==4 && xmlhttp.status==200){
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","ajax_info.txt",true);
xmlhttp.send();

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • https://github.com/risedragon/spring-mysqlclient/wiki/spring-mysqlclient-user-guide 開源了一個項目,總結了幾年的資料庫操作實踐經驗,還是蠻有興趣的。 ...
  • 關於shopnc 以下是摘抄自百度百科的關於shopnc的介紹: ShopNC商城系統,是天津市網城天創科技有限責任公司開發的一套多店模式的商城系統。 本系統具有商城系統非常完整和專業的功能與流程,系統包括了訂單管理、商品管理、購物車功能、網上支付功能、信息管理、客戶管理、會員體系設置、優惠促銷、廣 ...
  • 安裝composer: 1、在https://getcomposer.org/download/ 中下載 Composer-Setup.exe 2、安裝composer步驟如下: 至此,composer安裝完成。 安裝laravel: 安裝composer完成後,win+R >> cmd,調出命令行 ...
  • 一、抽象類 抽象類,只為繼承而出現,不定義具體的內容,只規定該有哪些東西 一般抽象類中只放置抽象方法,只規定了返回類型和參數 比如: 人 - 有吃飯,睡覺方法 男人 - 繼承人抽象類,必須實現吃飯,睡覺的方法主體 女人 - 繼承人抽象類,必須實現吃飯,睡覺方法的主體 抽象類中可以有普通屬性,通過子類 ...
  • HTML代碼: jquery代碼: 註:只要修改動畫時間就可以控制滾動的速度。 ...
  • 線上實例 使用方法 ...
  • 現象: 近期在微信中開發了一個電商的平臺,一切介面頁面處理完成後,正式佈置到公眾號,在公眾號上自定義菜單進行平臺時(如:.../index.html),發現了一個很有意思的問題:哪個頁面是從公眾號里點擊進入的平臺的,當切換一兩次頁面時,.../index.html這個頁面就切換不進了。 解決過程: ...
  • 享元模式 在JavaScript中,瀏覽器特別是移動端的瀏覽器分配的記憶體很有限,如何節省記憶體就成了一件非常有意義的事情。節省記憶體的一個有效方法是減少對象的數量。 享元模式(Flyweight),運行共用技術有效地支持大量細粒度的對象,避免大量擁有相同內容的小類的開銷(如耗費記憶體),使大家共用一個類( ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...