記錄AJAX充電點點滴滴

来源:https://www.cnblogs.com/Army-Knife/archive/2019/12/13/12035884.html
-Advertisement-
Play Games

首先要明白什麼是 AJAX ? AJAX = 非同步 JavaScript 和 XML。 AJAX 是一種用於創建快速動態網頁的技術。 通過在後臺與伺服器進行少量數據交換,AJAX 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。 傳統的網頁(不使用 AJAX ...


首先要明白什麼是 AJAX ?

AJAX = 非同步 JavaScript 和 XML。

AJAX 是一種用於創建快速動態網頁的技術。

通過在後臺與伺服器進行少量數據交換,AJAX 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。

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

有很多使用 AJAX 的應用程式案例:新浪微博、Google 地圖、開心網等等。

1、AJAX - 創建 XMLHttpRequest 對象

XMLHttpRequest 對象

 所有現代瀏覽器都支持 XMLHttpRequest 對象 (IE5 和IE6 使用AcActiveXObject)。

XMLHttpRequest 用於在後臺與伺服器交換數據。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。

所有現代瀏覽器(IE7+、Firefox、Chrome、Safari 以及 Opera)均內建 XMLHttpRequest 對象。

創建 XMLHttpRequest 對象的語法:

variable = new XMLHttpRequest();

老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 對象:

variable=new ActiveXObject( "Microsoft.XMLHTTP" );

為了應對所有的現代瀏覽器,包括 IE5 和 IE6,請檢查瀏覽器是否支持 XMLHttpRequest 對象。如果支持,則創建 XMLHttpRequest 對象。如果不支持,則創建 ActiveXObject :

1.1  XHR創建對象:

var xmlhttp;
if ( window.XMLHttpRequest )
   {// code for IE7+, Firefox, Chrom, Safari, Opera
    xmlhttp = new XMLHttpRequest();    
}
else
   {// code for IE5, IE6
   xmlhttp = new ActiveXObject( "Microsoft.XMLHTTP" );
}

1.2、AJAX - 向伺服器發送請求

XMLHttpRequest 對象用於和伺服器交換數據。

向伺服器發送請求

 

如需將請求發送到伺服器,我們使用 XMLHttpRequest 對象的 open() 和 send() 方法:

xmlhttp.open("GET","test1.txt",true);  //規定請求的類型、URL 以及是否非同步處理請求。
xmlhttp.send();  //將請求發送到伺服器。
方法描述
open(method,url,async)

規定請求的類型、URL 以及是否非同步處理請求。

  • method:請求的類型;GET 或 POST
  • url:文件在伺服器上的位置
  • async:true(非同步)或 false(同步)
send(string)

將請求發送到伺服器。

  • string:僅用於 POST 請求

 

GET 還是 POST?

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

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

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

GET 請求

一個簡單的 GET 請求:

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

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

------解決方案--------------------

ajax請求 如果兩次請求地址一樣 伺服器只會處理第一次請求
第二次請求返回內容和第一次一樣  
加 Math.random() 使每次請求地址不相同 伺服器每次都去做不同的響應 
------解決方案--------------------
Math.random()是調用javascript語法中的數學函數,能夠產生隨機數。
在Ajax請求中作為URL參數傳遞,能夠有效的避免“ajax緩存”
在IE 6系列的瀏覽器中,預設提交給一個地址例如:aa.aspx ,將自動緩存,第二次再請求aa.aspx時候,就不會再重覆請求了。當然,也可以使用new date () 時間戳的形式作為參數傳遞。

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

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

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

xmlhttp.open("GET","demo_get2.asp?fname=Bill&lname=Gates",true);
xmlhttp.send();

 

POST 請求

一個簡單 POST 請求:

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

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

xmlhttp.open("POST","ajax_test.asp",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");  //向請求中添加 TTTP 頭;
xmlhttp.send("fname=Bill&lname=Gates");
方法描述
setRequestHeader(header,value)

向請求添加 HTTP 頭。

  • header: 規定頭的名稱
  • value: 規定頭的值

 

url - 伺服器上的文件

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

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

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

 

非同步 - True 或 False?

AJAX 指的是非同步 JavaScript 和 XML(Asynchronous JavaScript and XML)。

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

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

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

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

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

Async = true

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

xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)   // 請求完成併成功返回
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();

 

Async = false

如需使用 async=false,請將 open() 方法中的第三個參數改為 false:

xmlhttp.open("GET","test1.txt",false);

我們不推薦使用 async=false,但是對於一些小型的請求,也是可以的。

請記住,JavaScript 會等到伺服器響應就緒才繼續執行。如果伺服器繁忙或緩慢,應用程式會掛起或停止。

註釋:當您使用 async=false 時,請不要編寫 onreadystatechange 函數 - 把代碼放到 send() 語句後面即可:

xmlhttp.open("GET","test1.txt",false);
xmlhttp.send();
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

 

1.3 AJAX - 伺服器響應

如需獲得來自伺服器的響應,請使用 XMLHttpRequest 對象的 responseText 或 responseXML 屬性。

屬性描述
responseText 獲得字元串形式的響應數據。
responseXML 獲得 XML 形式的響應數據。

responseText 屬性

如果來自伺服器的響應並非 XML,請使用 responseText 屬性。

responseText 屬性返回字元串形式的響應,因此您可以這樣使用:

document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

例:

<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","/ajax/test1.txt",true);
xmlhttp.send();
}
</script>
</head>
<body>

<div id="myDiv"><h2>Let AJAX change this text</h2></div>
<button type="button" onclick="loadXMLDoc()">通過 AJAX 改變內容</button>

</body>
</html>

responseXML 屬性

如果來自伺服器的響應是 XML,而且需要作為 XML 對象進行解析,請使用 responseXML 屬性:

請求 books.xml 文件,並解析響應:

xmlDoc=xmlhttp.responseXML;
txt="";
x=xmlDoc.getElementsByTagName("ARTIST");
for (i=0;i<x.length;i++)
  {
  txt=txt + x[i].childNodes[0].nodeValue + "<br />";
  }
document.getElementById("myDiv").innerHTML=txt;

例:

<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
var xmlhttp;
var txt,x,i;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    xmlDoc=xmlhttp.responseXML;
    txt="";
    x=xmlDoc.getElementsByTagName("title");
    for (i=0;i<x.length;i++)
      {
      txt=txt + x[i].childNodes[0].nodeValue + "<br />";
      }
    document.getElementById("myDiv").innerHTML=txt;
    }
  }
xmlhttp.open("GET","/example/xmle/books.xml",true);
xmlhttp.send();
}
</script>
</head>

<body>

<h2>My Book Collection:</h2>
<div id="myDiv"></div>
<button type="button" onclick="loadXMLDoc()">獲得我的圖書收藏列表</button>
 
</body>
</html>

 

1.4  AJAX - onreadystatechange 事件

當請求被髮送到伺服器時,我們需要執行一些基於響應的任務。

每當 readyState 改變時,就會觸發 onreadystatechange 事件。

readyState 屬性存有 XMLHttpRequest 的狀態信息。

下麵是 XMLHttpRequest 對象的三個重要的屬性:

屬性描述
onreadystatechange 存儲函數(或函數名),每當 readyState 屬性改變時,就會調用該函數。
readyState

存有 XMLHttpRequest 的狀態。從 0 到 4 發生變化。

  • 0: 請求未初始化
  • 1: 伺服器連接已建立
  • 2: 請求已接收
  • 3: 請求處理中
  • 4: 請求已完成,且響應已就緒
status

200: "OK"

404: 未找到頁面

 

在 onreadystatechange 事件中,我們規定當伺服器響應已做好被處理的準備時所執行的任務。

當 readyState 等於 4 且狀態為 200 時,表示響應已就緒:

xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }

例:

<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","/ajax/test1.txt",true);
xmlhttp.send();
}
</script>
</head>
<body>

<div id="myDiv"><h2>Let AJAX change this text</h2></div>
<button type="button" onclick="loadXMLDoc()">通過 AJAX 改變內容</button>

</body>
</html>

註釋:onreadystatechange 事件被觸發 5 次(0 - 4),對應著 readyState 的每個變化。

使用 Callback 函數

callback 函數是一種以參數形式傳遞給另一個函數的函數。

如果您的網站上存在多個 AJAX 任務,那麼您應該為創建 XMLHttpRequest 對象編寫一個標準的函數,併為每個 AJAX 任務調用該函數。

該函數調用應該包含 URL 以及發生 onreadystatechange 事件時執行的任務(每次調用可能不盡相同):

function myFunction()
{
loadXMLDoc("ajax_info.txt",function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  });
}

例:

<html>
<head>
<script type="text/javascript">
var xmlhttp;
function loadXMLDoc(url,cfunc)
{
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=cfunc;
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
function myFunction()
{
loadXMLDoc("/ajax/test1.txt",function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  });
}
</script>
</head>
<body>

<div id="myDiv"><h2>Let AJAX change this text</h2></div>
<button type="button" onclick="myFunction()">通過 AJAX 改變內容</button>

</body>
</html>

 

// code for IE7+, Firefox, Chrome, Opera, Safari

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

-Advertisement-
Play Games
更多相關文章
  • kafka2.3.1+zookeeper3.5.6+kafka-manager2.0.0.2集群部署(centos7.7) ...
  • 1.Android 系統架構 android分為四個層,從高層到低層分別是應用程式層、應用程式框架層、系統運行庫層和linux核心層,如下圖所示: 2.application應用程式層 該層提供一些核心應用程式包,例如電子郵件、簡訊、日曆、地圖、瀏覽器和聯繫人管理等。同時,開發者可以利用Java語言 ...
  • 項目結構:一個視窗只有一個項目,項目 叫 Project 代表一個workspace 一個項目的結構跟eclipse區別還是蠻大的: 首先看APP結構:app放的其實就是 java文件和資源文件 切換 目錄結構 比如切換到project界面 1、Studio中有Project和Module的概念,前 ...
  • 1.在/data/app下以報名為文件夾名新建文件夾 APK包存放在這裡 以及lib文件 存放so 2./data/dalvik cache 存放dex dex是dalvik虛擬機可執行文件 3./data/data/ 存放應用數據 剛開始沒什麼數據 打開apk後資源釋放 數據變多 4./data/ ...
  • jTopo是什麼? jTopo(Javascript Topology library)是一款完全基於HTML5 Canvas的關係、拓撲圖形化界面開發工具包。 jTopo關註於數據的圖形展示,它是面向開發人員的,需要進行二次開發。 使用jTopo很簡單,可以快速創建一些關係圖、拓撲等相關圖形化的展 ...
  • 前言 最近在給自己的腳手架項目轉到TypeScript時,遇到了一些麻煩。 項目之前採用的是react + react redux + redux thunk + redux actions +redux promise的體系。 當項目轉TypeScript時,react和react redux這種 ...
  • Math對象 開平方:sqrt 絕對值:abs π:PI x的y次方:pow 四捨五入取整:round 向下取整:floor 向上取整:ceil 最大值:max 最小值: min 隨機數:random 日期對象 獲取當前時間:Date() 獲取年:getFullYear 獲取月:getMonth 獲 ...
  • 本人近期接到一個天大的“好消息”:zxbc項目某些客戶為保險業等種種原因要支持IE…… 2013年,ES6草案凍結,2015年6月,ES6正式通過,成為國際標準。都9102啦,Chrome還好啦,升級到最新版本,大部分ES6還是ok的,但是萬惡之源IE呢?作為一個前端開發者,相容萬惡的IE,頓時,胸 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...