摘要:今天我來談?wù)劶夹g(shù)。我簡要羅列一下幾種常見的技術(shù)動態(tài)腳本注入和圖片信標(biāo)技術(shù)接下來我簡要談?wù)勎覍@幾種技術(shù)的理解。該特性可以實現(xiàn)無阻塞加載腳本技術(shù)。和動態(tài)腳本注入類似,技術(shù)也有可跨域和無法發(fā)送非請求的問題。目前使用最多的技術(shù)手段就是利用技術(shù)。
今天我來談?wù)凙jax技術(shù)。
Ajax是一種與服務(wù)器通信而無需重載頁面的方法。數(shù)據(jù)可以從服務(wù)器獲取或者發(fā)給服務(wù)器。
Ajax和異步分不開,但是本文重點部分不是異步,而是對實現(xiàn)Ajax的技術(shù)進行總結(jié)。
我簡要羅列一下幾種常見的Ajax技術(shù):
動態(tài)腳本注入和JSON-P
圖片信標(biāo)(Beacons)
XMLHttpRequest(XHR)技術(shù)
接下來我簡要談?wù)勎覍@幾種技術(shù)的理解。
動態(tài)腳本注入之前的文章中談到,標(biāo)簽作為DOM的一部分,可以由JavaScript調(diào)用DOM操作的接口動態(tài)創(chuàng)建。動態(tài)創(chuàng)建的元素可以為其設(shè)置src屬性并且插入到DOM樹中。此時異步線程會并行的去加載src資源,等到資源加載完成之后,其中的字符會當(dāng)做JavaScript語句執(zhí)行。
該技術(shù)是一個hack技術(shù),它利用了瀏覽器的特性。該特性可以實現(xiàn)“無阻塞加載腳本”技術(shù)。更多細節(jié)可以移步:無阻塞加載腳本的理解。
除了在頁面初始化的時候可以使用動態(tài)腳本注入,Ajax技術(shù)也可以使用動態(tài)腳本注入的技術(shù)實現(xiàn)。動態(tài)腳本注入可以從服務(wù)器中請求數(shù)據(jù)。
首先我們需要將待請求數(shù)據(jù)的細節(jié)放在src中。因為src對應(yīng)一個url,瀏覽器會將這個url作為GET請求發(fā)往相應(yīng)的服務(wù)器,所以我們將請求數(shù)據(jù)作為查詢字符串寫入src。
服務(wù)器在收到請求后,會返回數(shù)據(jù)。但是這個數(shù)據(jù)必須以一段JavaScript腳本的形式返回。原因是瀏覽器收到響應(yīng)數(shù)據(jù)后會將其當(dāng)做JavaScript腳本執(zhí)行。
也就是說,假設(shè)響應(yīng)數(shù)據(jù)如果只是簡單的xml或者json數(shù)據(jù),對于動態(tài)腳本注入來說,沒有任何意義。
因此服務(wù)器收到動態(tài)腳本注入中的GET請求時,需要返回一個約定好的表示JavaScript腳本的字符串。這段腳本還需要處理瀏覽器端需要的數(shù)據(jù),比如:
dosomething([{"x": 1, "y": "haha"}]);
這段字符串返回之后就會被執(zhí)行。其中dosomething就是約定好的一個回調(diào)函數(shù)名。這個回調(diào)函數(shù)已經(jīng)在之前的腳本中定義好。
另外,我們還可以將回調(diào)函數(shù)名稱作為查詢字符串傳入,這樣服務(wù)器就可以動態(tài)的將回調(diào)函數(shù)作為響應(yīng)數(shù)據(jù)中的一部分返回。
dosomething中的參數(shù)一個JSON數(shù)據(jù),但是它在返回之后,會被當(dāng)做JavaScript對象執(zhí)行。由于這種特性,使用JSON的動態(tài)腳本注入又可以稱作所謂的“JSON-P”。
該技術(shù)還有兩個注意點:
動態(tài)腳本注入技術(shù)可以跨域訪問,不同域中返回的腳本可能截獲網(wǎng)站數(shù)據(jù),導(dǎo)致安全問題,因此要小心使用。
動態(tài)腳本注入技術(shù)不能發(fā)送POST等非GET請求。然而,有些瀏覽器對GET請求有諸多限制(比如url字符數(shù)的限制),因此需要POST請求的Ajax,請考慮其他方法。
BeaconsBeacons技術(shù)很適合向服務(wù)器發(fā)送數(shù)據(jù)。
和上面的動態(tài)腳本注入類似,Beacons可以使用特定的DOM元素,利用src屬性向服務(wù)器發(fā)送數(shù)據(jù),但是不需要服務(wù)器返回數(shù)據(jù)。
我們可以使用一個Image對象,設(shè)置src之后,該請求會從服務(wù)器返回一個圖片(一般是一個1*1的透明圖片)。這是最常用的方法。
var url = "...."; var params = [ "..", ".." ]; var img = new Image(); img.src = url + "?" + params.join("&");
如果響應(yīng)中不需要任何數(shù)據(jù),注意需要服務(wù)器設(shè)置狀態(tài)碼為204 No Content。
如果需要一定的消息返回,我們可以用一種變通的手法:設(shè)置返回圖片的寬度,不同的寬度代表不同的信息。這些信息可以在Image對象的onload事件中監(jiān)聽。
img.onload = function(){ if (this.width === 1){ // ... } else if (this.width === 2){ // ... } // else if ... }
和動態(tài)腳本注入類似,Beacons技術(shù)也有可跨域和無法發(fā)送非GET請求的問題。
另外,也可以利用標(biāo)簽來做類似的操作。
XMLHttpRequest目前Ajax使用最多的技術(shù)手段就是利用XMLHttpRequest技術(shù)。
XMLHttpRequest是一個特殊的構(gòu)造函數(shù),這個構(gòu)造函數(shù)不在ECMA標(biāo)準內(nèi),但是各大瀏覽器對其均支持良好。
直接上代碼:
var xhr = new XMLHttpRequest(); var url = "..."; var data; // 接受響應(yīng)主體 var header; // 接受響應(yīng)頭 var status; // 接收狀態(tài)碼 var statusText; // 接收狀態(tài)信息 xhr.onreadystatechange = function(){ // 監(jiān)聽readyState變化 if (xhr.readyState === 4){ // 該值為4,表明響應(yīng)結(jié)束 data = xhr.responseText; // 獲取響應(yīng)主體 // or: data = xhr.responseXML; ... headers = xhr.getAllResponseHeaders(); // 獲取響應(yīng)頭 status = xhr.status; // 獲取狀態(tài)碼 statusText = xhr.statusText; //獲取狀態(tài)信息 // do something... } } xhr.open("GET", url, true); // 開啟一個請求,true表示異步響應(yīng) xhr.setRequestHeader("..", ".."); // 設(shè)置請求頭 xhr.send(null); // 開始發(fā)送,參數(shù)是請求主體(用于POST請求)
XMLHttpRequest支持GET和POST請求,并且可以輕松設(shè)置請求主體和部分請求頭,也可以獲取響應(yīng)主體和響應(yīng)頭。雖然名稱叫XMLHttpRequest,但是事實上它支持各種不同的數(shù)據(jù)格式如JSON、HTML等。
但是注意,該技術(shù)是不能跨域訪問的,除非web服務(wù)器設(shè)置了允許跨域訪問策略。
另一個值得注意的地方就是:readyState的值為4,表明響應(yīng)結(jié)束,但是我們也可以監(jiān)聽其值為3的情況,該值表明響應(yīng)正在進行,此時可以獲取部分響應(yīng)主體。
readyState的值為0、1和2分別表示open()尚未調(diào)用、open()已調(diào)用,和接收到頭信息。這些用途相對較小。
更多詳情,請參見MDN中關(guān)于XMLHttpRequest的解釋:鏈接
結(jié)束文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90835.html
摘要:一概述什么是同步,什么是異步同步現(xiàn)象客戶端發(fā)送請求到服務(wù)器端,當(dāng)服務(wù)器返回響應(yīng)之前,客戶端都處于等待卡死狀態(tài)異步現(xiàn)象客戶端發(fā)送請求到服務(wù)器端,無論服務(wù)器是否返回響應(yīng),客戶端都可以隨意做其他事情,不會被卡死的運行原理頁面發(fā)起請求,會將請求發(fā)送 一、Ajax概述1.什么是同步,什么是異步同步現(xiàn)象:客戶端發(fā)送請求到服務(wù)器端,當(dāng)服務(wù)器返回響應(yīng)之前,客戶端都處于等待 卡死狀態(tài)異步現(xiàn)象:客戶...
摘要:我在面試前針對基礎(chǔ)也花了不少的時間,期間也將自己寫過的博文粗略地刷了一遍,同時也在網(wǎng)上找了不少比較好的資料部分是沒看完的??疵嬖囶}也是校驗自己是否真正理解了這個知識點,也很有可能會有新的收獲。 一、前言 只有光頭才能變強 回顧前面: 廣州三本找Java實習(xí)經(jīng)歷 上一篇寫了自己面試的經(jīng)歷和一些在面試的時候遇到的題目(筆試題和面試題)。 我在面試前針對Java基礎(chǔ)也花了不少的時間,期間也將...
摘要:前端最基礎(chǔ)的就是。一個朋友的問題,監(jiān)測下載進度。這節(jié)主要是講如何使用,以及前端下載的核心操作。下載文件,并顯示進度條。下載文件,并顯示進度條下載文件上面已經(jīng)實現(xiàn)了,那我們先說說如何顯示進度條。實現(xiàn)代碼如下,我們操作成讀流,然后統(tǒng)計長度。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠遠不止這些。前端小課堂(H...
摘要:前端最基礎(chǔ)的就是。一個朋友的問題,監(jiān)測下載進度。這節(jié)主要是講如何使用,以及前端下載的核心操作。下載文件,并顯示進度條。下載文件,并顯示進度條下載文件上面已經(jīng)實現(xiàn)了,那我們先說說如何顯示進度條。實現(xiàn)代碼如下,我們操作成讀流,然后統(tǒng)計長度。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠遠不止這些。前端小課堂(H...
閱讀 2926·2021-11-15 18:02
閱讀 3816·2021-10-14 09:43
閱讀 3759·2021-09-08 10:41
閱讀 2535·2019-08-30 15:53
閱讀 1817·2019-08-30 14:14
閱讀 1962·2019-08-29 16:12
閱讀 3156·2019-08-29 14:03
閱讀 1290·2019-08-29 13:46