AJAX 核心 —— XMLHTTPRequest 對象 回顧記錄

来源:http://www.cnblogs.com/mingc/archive/2017/07/19/7208535.html
-Advertisement-
Play Games

AJAX 概述 不使用 AJAX 的網頁,如果要更新內容,需要重載整個頁面。 AJAX ( Asynchronous Javascript And XML ,非同步 Javascript 和 XML)用於非同步通訊,通過在後臺與伺服器進行少量的數據交換,在不重載整個網頁的情況下,對網頁局部實現非同步刷新。 ...


AJAX 概述

  不使用 AJAX 的網頁,如果要更新內容,需要重載整個頁面。

  AJAX ( Asynchronous Javascript And XML ,非同步 Javascript 和 XML)用於非同步通訊,通過在後臺與伺服器進行少量的數據交換,在不重載整個網頁的情況下,對網頁局部實現非同步刷新。

 

AJAX 核心

  JavaScript 中使用 XMLHTTPRequest 對象(XHR)實現 AJAX 請求。

 

AJAX 步驟

  一般步驟如下:

  1. 實例化 XMLHTTPRequest 對象(註意 IE 相容性)
  2. 綁定監聽事件(onreadystatechange 屬性,判斷就緒用 readState 屬性 == 4,判斷響應成功用 status 屬性 == 200,獲取響應用 responseText 或 responseXML 屬性。
  3. 建立請求(open() 方法,註意最後一個參數為ture(因為是 AJAX ))
  4. 設置請求頭(setRequestHeader() 方法,僅限於POST)
  5. 發送請求(send() 方法,POST 請求時在 send() 方法添加提交參數)

 

AJAX 代碼

// 第一步,創建 XMLHTTPRequest 對象
var xhr = window.XMLHTTPRequest ? new XMLHTTPRequest() : new ActiveXObject('Microsoft.XMLHttp');

if(!xhr){
    alert('創建 XMLHTTPRequest 對象失敗!');
    return false;
}

// 第二步,綁定回調函數
xhr.onreadystatechange = function () {
    if(xhr.readyState == 4 && xhr.status = 200){ // 請求就緒 && 響應成功
        var data = xhr.responseText; // 如果是 XML 數據,就用 var data = xhr.responseXML 獲取
        
        // DOM 操作
        // document.getElementById("myDiv").innerHTML = data;
    }
}

// 第三部,建立請求
xhr.open("POST", url, true); // 參數三預設為 true(非同步),可以不填

// 第四步,設置請求頭(僅限於POST)
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset-UTF-8');

// 第五步,發送請求
xhr.send('fname=michael&&lname=jordan'); // POST請求的請求體

這裡,強調以下四點(引用自 廖雪峰的官方網站 ,第4條略作修改)

  1. 通過檢測 window 對象是否有 XMLHttpRequest 屬性來確定瀏覽器是否支持標準的XMLHttpRequest。註意,不要根據瀏覽器的 navigator.userAgent 來檢測瀏覽器是否支持某個 JavaScript 特性,一是因為這個字元串本身可以偽造,二是通過IE版本判斷JavaScript特性將非常複雜。

  2. 當創建了XMLHttpRequest對象後,要先設置onreadystatechange的回調函數。在回調函數中,通常我們只需通過readyState === 4判斷請求是否完成,如果已完成,再根據status === 200判斷是否是一個成功的響應。

  3. XMLHttpRequest 對象的 open() 方法有3個參數,第一個參數指定是 GET 或者 POST,第二個參數指定 URL 地址,第三個參數指定是否使用非同步,預設是true,所以可以不寫。註意,千萬不要把第三個參數指定為false,否則瀏覽器將停止響應,直到AJAX請求完成。如果這個請求耗時10秒,那麼10秒內你會發現瀏覽器處於“假死”狀態。

  4. 最後調用 send() 方法才真正發送請求。GET 請求不需要參數(或者null),POST 請求需要把body部分以字元串或者FormData對象傳進去。

 

jQuery 中的 AJAX

  直接用 JS 寫 AJAX 步驟有些繁瑣。jQuery 中封裝了 AJAX 的快捷方法。 

$.ajax(url,[settings])          // 執行非同步 HTTP (Ajax) 請求
$('選擇器').load(url,[data],[callback])	// 從伺服器載入數據,把返回 HTML 放入匹配元素
$.get(url,[data],[fn],[type])	// GET 請求載入數據
$.getJSON(url,[data],[fn])	// GET 請求載入 JSON 編碼數據
$.getScript(url,[callback])	// GET 請求 JavaScript 文件,並執行
$.post(url,[data],[fn],[type])	// POST 請求載入數據

  更多jQuery 的AJAX請參考 jQuery 的中文手冊,實例請參考 jQuery Ajax 實例 ($.ajax、$.post、$.get)

 

推薦閱讀

比較詳細的AJAX介紹,並且文末涉及了CORS 跨域:廖雪峰的官方網 - AJAX

 

擴展閱讀

AJAX 請求不可避免的涉及到兩個問題:第一是AJAX以何種格式來交換數據(通常是JSON);第二是跨域需求是怎麼解決的(通常是JSONP)。這篇文章有通俗易懂的解釋:【原創】說說JSON和JSONP,也許你會豁然開朗,含jQuery用例

既然 AJAX 請求涉及了跨域,那麼什麼是跨域?跨域的實現方式又有哪些(JSONP、CORS、伺服器跨域、postmessage ...... )?推薦看看這篇文章:跨域請求的幾種實現方式

還有就是GET 請求經常會讀取緩存,解決方法是在 url 後面添加一個隨機數,或者用 jQuery 的 $.ajaxSetup({cache: false}); 等,詳細請看這篇文章: 解決jquery load,get 方法緩存數據問題

 


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

-Advertisement-
Play Games
更多相關文章
  • SSO英文全稱Single Sign On,單點登錄。SSO是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。它包括可以將這次主要的登錄映射到其他應用中用於同一個用戶的登錄的機制。它是目前比較流行的企業業務整合的解決方案之一。 ...
  • 最近幾年,函數式編程變得越來越流程,其代碼簡潔、副作用小、維護成本低等特點,使得許多其它的語言也開始支持函數式編程,比如`Java` 和 `C#`等。本文主要介紹一下函數式編程中的一個重要概念:`Monad`。 ...
  • 1 概述 1 概述 本篇文章主要分享演算法部分——遞歸演算法,本文簡要講解幾個經典的遞歸算個發,即乘法階乘、漢諾塔和斐波那契數列。 2 講解部分 2 講解部分 2.1 乘法階乘 問題:求n! 分析: 0!=1; n!=nx(n-1)! code: 2.2 漢諾塔 問題:有三根桿子A,B,C。A桿上有N個 ...
  • 使用命名空間對時間進行管理,代碼如下: 優勢: 刪除事件時只需要指定命名空間即可,刪除plugin空間的事件只需要一行代碼即可,由於click事件不在plugin的空間內,所以click事件仍然有效。 ...
  • 初始化環境 npm init -y 初始化項目 安裝各種依賴項 npm install --save vue 安裝vue2.0 npm install --save-dev webpack@^2.1.0-beta.25 webpack-dev-server@^2.1.0-beta.9 安裝webpa ...
  • 一、手風琴菜單效果圖及代碼如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>手風琴效果製作</title> 6 <link rel="stylesheet" href="../css ...
  • 一.概述:1.數組是無類型的:同一數組的各元素可以是任意類型,也可以是數組或對象;2.索引從0開始,最大到2^32-2=4294967294;最多容納4294967295個元素;3.數組是動態的,根據需要自動增減;創建數組時無需聲明大小,且在大小變化時無需重新分配空間;4.數組可以是索引連續的(非稀... ...
  • DIV+CSS佈局中主要CSS屬性介紹: Float: Float屬性是DIV+CSS佈局中最基本也是最常用的屬性,用於實現多列功能,我們知道<div>標簽預設一行只能顯示一個,而使用Float屬性可以實現一行顯示多個div的功能,最直接解釋方法就是能實現表格佈局的多列功能。 Margin: Mar ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...