摘要:在接收響應(yīng)期間持續(xù)不斷地觸發(fā)。在請(qǐng)求發(fā)生錯(cuò)誤時(shí)觸發(fā)。在通信完成或者觸發(fā)或事件后觸發(fā)。已經(jīng)接收到部分響應(yīng)數(shù)據(jù)?;跇?biāo)準(zhǔn)被廣泛支持。破壞程序的異常處理機(jī)制。
原文(我的GitHub):https://github.com/liangfengbo/frontend-ability/issues/1
學(xué)習(xí)大綱理解Ajax的工作原理
Ajax核心-XMLHttpRequest對(duì)象
封裝Ajax方法
Ajax優(yōu)缺點(diǎn)
Ajax適應(yīng)場(chǎng)景
Ajax系列面試題總結(jié)
Ajax的工作原理 含義:1. w3chool官網(wǎng):Ajax 是一種在無(wú)需重新加載整個(gè)網(wǎng)頁(yè)的情況下,能夠更新部分網(wǎng)頁(yè)的技術(shù)。 2. 我的理解:無(wú)須刷新頁(yè)面即可從服務(wù)器取得數(shù)據(jù)的技術(shù)。原理:
Ajax的工作原理相當(dāng)于在用戶和服務(wù)器之間加了—個(gè)中間層,使用戶操作與服務(wù)器響應(yīng)異步化。并不是所有的用戶請(qǐng)求都提交給服務(wù)器,像—些數(shù)據(jù)驗(yàn)證和數(shù)據(jù)處理等都交給Ajax引擎自己來(lái)做, 只有確定需要從服務(wù)器讀取新數(shù)據(jù)時(shí)再由Ajax引擎代為向服務(wù)器提交請(qǐng)求。
核心XMLHttpRequest對(duì)象Ajax技術(shù)的核心是XMLHttpRequest對(duì)象。
IE5 XHR對(duì)象是通過(guò)MSXML庫(kù)中的一個(gè)ActiveX對(duì)象實(shí)現(xiàn)的,所以要考慮做兼容。
IE7+、Firefox、Opera、Chrome和Safari都支持原生的XHR對(duì)象
new ActiveXObject(versions); new XMLHttpRequest();XMLHttpRequest 對(duì)象方法描述
方法 | 描述 |
---|---|
abort() | 停止當(dāng)前請(qǐng)求 |
getAllResponseHeaders() | 把HTTP請(qǐng)求的所有響應(yīng)首部作為鍵/值對(duì)返回 |
getResponseHeader("header") | 返回指定首部的串值 |
open("method","URL",[asyncFlag],["userName"],["password"]) | 建立對(duì)服務(wù)器的調(diào)用。method參數(shù)可以是GET、POST或PUT。url參數(shù)可以是相對(duì)URL或絕對(duì)URL。這個(gè)方法還包括3個(gè)可選的參數(shù),是否異步,用戶名,密碼 |
send(content) | 向服務(wù)器發(fā)送請(qǐng)求 |
setRequestHeader("header", "value") | 把指定首部設(shè)置為所提供的值。在設(shè)置任何首部之前必須先調(diào)用open()。設(shè)置header并和請(qǐng)求一起發(fā)送 ("post"方法一定要 ) |
屬性 | 描述 |
---|---|
onreadystatechange | 狀態(tài)改變的事件觸發(fā)器,每個(gè)狀態(tài)改變時(shí)都會(huì)觸發(fā)這個(gè)事件處理器,通常會(huì)調(diào)用一個(gè)JavaScript函數(shù) |
readyState | 請(qǐng)求的狀態(tài)。有5個(gè)可取值:0 = 未初始化,1 = 正在加載,2 = 已加載,3 = 交互中,4 = 完成 |
responseText | 服務(wù)器的響應(yīng),返回?cái)?shù)據(jù)的文本。 |
responseXML | 服務(wù)器的響應(yīng),返回?cái)?shù)據(jù)的兼容DOM的XML文檔對(duì)象 ,這個(gè)對(duì)象可以解析為一個(gè)DOM對(duì)象。 |
responseBody | 服務(wù)器返回的主題(非文本格式) |
responseStream | 服務(wù)器返回的數(shù)據(jù)流 |
status | 服務(wù)器的HTTP狀態(tài)碼(如:404 = "文件末找到" 、200 ="成功" ,等等) |
statusText | 服務(wù)器返回的狀態(tài)文本信息 ,HTTP狀態(tài)碼的相應(yīng)文本(OK或Not Found(未找到)等等) |
事件 | 描述 |
---|---|
loadstart | 在接收到響應(yīng)數(shù)據(jù)的第一個(gè)字節(jié)時(shí)觸發(fā)。 |
progress | 在接收響應(yīng)期間持續(xù)不斷地觸發(fā)。 |
error | 在請(qǐng)求發(fā)生錯(cuò)誤時(shí)觸發(fā)。 |
abort | 在因?yàn)檎{(diào)用abort()方法而終止連接時(shí)觸發(fā)。 |
load | 在接收到完整的響應(yīng)數(shù)據(jù)時(shí)觸發(fā)。 |
loadend | 在通信完成或者觸發(fā)error、abort或load事件后觸發(fā)。 |
/** * 創(chuàng)建Ajax * @param options */ function Ajax(options) { // 新建一個(gè)對(duì)象,用途接受XHR對(duì)象 var xhr = null; // 第一步創(chuàng)建XMLHttpRequest對(duì)象 || 同時(shí)兼任IE // 首先檢測(cè)原生XHR對(duì)象是否存在,如果存在則返回它的新實(shí)例 if (typeof XMLHttpRequest != "undefined") { xhr = new XMLHttpRequest(); // 然后如果原生對(duì)象不存在,則檢測(cè)ActiveX對(duì)象 } else if (typeof ActiveXObject != "undefined") { // 如果存在,則創(chuàng)建他的對(duì)象,但這個(gè)對(duì)象需要一個(gè)傳入?yún)?shù),如下: if (typeof arguments.callee.activeXString != "string") { // 對(duì)象版本 var versions = [ "Microsoft.XMLHTTP", "Msxml2.XMLHTTP.7.0", "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML.XMLHTTP" ], i, len; for (i = 0, len = versions.length; i < len; i++) { try { // 需要versions數(shù)組中的某個(gè)項(xiàng),數(shù)組的7個(gè)項(xiàng)分別對(duì)應(yīng)7個(gè)版本. new ActiveXObject(versions[i]); // arguments是javascript函數(shù)的內(nèi)置對(duì)象,代表傳入?yún)?shù)的集合, // callee就代表對(duì)象本身即new createXHR arguments.callee.activeXString = versions[i]; break; } catch (e) { // 跳過(guò) } } } // 直到循環(huán)創(chuàng)建成功為止,然后給自己添加一個(gè)屬性叫activeXString xhr = new ActiveXObject(arguments.callee.activeXString); } else { // 如果這兩種對(duì)象都不存在,就拋出一個(gè)錯(cuò)誤 throw new Error("No XHR object available"); } /** ** options形參解析: * data 發(fā)送的參數(shù),格式為對(duì)象類型 * url 發(fā)送請(qǐng)求的url,服務(wù)器地址(api) * async 否為異步請(qǐng)求,true為異步的,false為同步的 * method http連接的方式,包括POST和GET兩種方式 */ options = options || {}; options.success = options.success || function () { }; options.fail = options.fail || function () { }; var data = options.data, url = options.url, async = options.async === undefined ? true : options.async, method = options.method.toUpperCase(), dataArr = []; // 遍歷參數(shù) for (var k in data) { dataArr.push(k + "=" + data[k]); } // GET請(qǐng)求 if (method === "GET") { url = url + "?" + dataArr.join("&"); xhr.open(method, url.replace(/?$/g, ""), async); xhr.send(); } // POST請(qǐng)求 if (method === "POST") { xhr.open(method, url, async); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send(dataArr.join("&")); } // 響應(yīng)接收完畢后將觸發(fā)load事件 xhr.onload = function () { /** * XHR對(duì)象的readyState屬性 * 0:未初始化。尚未調(diào)用open()方法。 * 1:?jiǎn)?dòng)。已經(jīng)調(diào)用open()方法,但尚未調(diào)用send()方法。 * 2:發(fā)送。已經(jīng)調(diào)用send()方法,但尚未接收到響應(yīng)。 * 3:接收。已經(jīng)接收到部分響應(yīng)數(shù)據(jù)。 * 4:完成。已經(jīng)接收到全部響應(yīng)數(shù)據(jù),而且已經(jīng)可以在客戶端使用了。 */ if (xhr.readyState == 4) { // 得到響應(yīng) if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) { // 處理成功數(shù)據(jù) var res; if (options.success && options.success instanceof Function) { res = xhr.responseText; if (typeof res === "string") { res = JSON.parse(res); options.success.call(xhr, res); } } } else { // 處理錯(cuò)誤數(shù)據(jù) if (options.fail && options.fail instanceof Function) { options.fail.call(xhr, res) } } } else { // 拋出檢測(cè)XHR對(duì)象的readyState屬性 console.log("XHR was readyState:", xhr.readyState); } } }options參數(shù)說(shuō)明
參數(shù) | 類型 | 描述 | 默認(rèn)值 | 是否填 |
---|---|---|---|---|
url | string | 發(fā)送請(qǐng)求的url,服務(wù)器地址(api) | "" | 必填 |
method | string | http連接的方式,包括POST和GET兩種方式 | true | 選填 |
async | boolean | 是否為異步請(qǐng)求,true為異步的,false為同步的 | true | 選填 |
data | json | 發(fā)送的參數(shù),格式為對(duì)象(json)類型 | null | 選填 |
success | function | 請(qǐng)求成功回調(diào)函數(shù) | function () { } | 必填 |
fail | function | 請(qǐng)求失敗回調(diào)函數(shù) | function () { } | 必填 |
Ajax({ url: "http://localhost:3000/api/v1/article", method: "GET", async: true, success: function (res) { console.log("successful", res); }, fail: function (err) { console.log("fail", err); } })成功返回?cái)?shù)據(jù):
successful {code: 200, msg: "查詢文章列表成功!", data: {…}}Ajax優(yōu)點(diǎn) 1.無(wú)刷新更新數(shù)據(jù)。
AJAX最大優(yōu)點(diǎn)就是能在不刷新整個(gè)頁(yè)面的前提下與服務(wù)器通信維護(hù)數(shù)據(jù)。這使得Web應(yīng)用程序更為迅捷地響應(yīng)用戶交互,并避免了在網(wǎng)絡(luò)上發(fā)送那些沒(méi)有改變的信息,減少用戶等待時(shí)間,帶來(lái)非常好的用戶體驗(yàn)。
2.異步與服務(wù)器通信。AJAX使用異步方式與服務(wù)器通信,不需要打斷用戶的操作,具有更加迅速的響應(yīng)能力。優(yōu)化了Browser和Server之間的溝通,減少不必要的數(shù)據(jù)傳輸、時(shí)間及降低網(wǎng)絡(luò)上數(shù)據(jù)流量。
3.前端和后端負(fù)載平衡。AJAX可以把以前一些服務(wù)器負(fù)擔(dān)的工作轉(zhuǎn)嫁到客戶端,利用客戶端閑置的能力來(lái)處理,減輕服務(wù)器和帶寬的負(fù)擔(dān),節(jié)約空間和寬帶租用成本。并且減輕服務(wù)器的負(fù)擔(dān),AJAX的原則是“按需取數(shù)據(jù)”,可以最大程度的減少冗余請(qǐng)求和響應(yīng)對(duì)服務(wù)器造成的負(fù)擔(dān),提升站點(diǎn)性能。
4.基于標(biāo)準(zhǔn)被廣泛支持。AJAX基于標(biāo)準(zhǔn)化的并被廣泛支持的技術(shù),不需要下載瀏覽器插件或者小程序,但需要客戶允許JavaScript在瀏覽器上執(zhí)行。隨著Ajax的成熟,一些簡(jiǎn)化Ajax使用方法的程序庫(kù)也相繼問(wèn)世。同樣,也出現(xiàn)了另一種輔助程序設(shè)計(jì)的技術(shù),為那些不支持JavaScript的用戶提供替代功能。
5.界面與應(yīng)用分離。Ajax使WEB中的界面與應(yīng)用分離(也可以說(shuō)是數(shù)據(jù)與呈現(xiàn)分離),有利于分工合作、減少非技術(shù)人員對(duì)頁(yè)面的修改造成的WEB應(yīng)用程序錯(cuò)誤、提高效率、也更加適用于現(xiàn)在的發(fā)布系統(tǒng)。
Ajax缺點(diǎn) 1.AJAX干掉了Back和History功能,即對(duì)瀏覽器機(jī)制的破壞。在動(dòng)態(tài)更新頁(yè)面的情況下,用戶無(wú)法回到前一個(gè)頁(yè)面狀態(tài),因?yàn)闉g覽器僅能記憶歷史記錄中的靜態(tài)頁(yè)面。一個(gè)被完整讀入的頁(yè)面與一個(gè)已經(jīng)被動(dòng)態(tài)修改過(guò)的頁(yè)面之間的差別非常微妙;用戶通常會(huì)希望單擊后退按鈕能夠取消他們的前一次操作,但是在Ajax應(yīng)用程序中,這將無(wú)法實(shí)現(xiàn)
2.AJAX的安全問(wèn)題JAX技術(shù)給用戶帶來(lái)很好的用戶體驗(yàn)的同時(shí)也對(duì)IT企業(yè)帶來(lái)了新的安全威脅,Ajax技術(shù)就如同對(duì)企業(yè)數(shù)據(jù)建立了一個(gè)直接通道。這使得開(kāi)發(fā)者在不經(jīng)意間會(huì)暴露比以前更多的數(shù)據(jù)和服務(wù)器邏輯。Ajax的邏輯可以對(duì)客戶端的安全掃描技術(shù)隱藏起來(lái),允許黑客從遠(yuǎn)端服務(wù)器上建立新的攻擊。還有Ajax也難以避免一些已知的安全弱點(diǎn),諸如跨站點(diǎn)腳步攻擊、SQL注入攻擊和基于Credentials的安全漏洞等等
3.對(duì)搜索引擎支持較弱。對(duì)搜索引擎的支持比較弱。如果使用不當(dāng),AJAX會(huì)增大網(wǎng)絡(luò)數(shù)據(jù)的流量,從而降低整個(gè)系統(tǒng)的性能。
4.破壞程序的異常處理機(jī)制。至少?gòu)哪壳翱磥?lái),像Ajax.dll,Ajaxpro.dll這些Ajax框架是會(huì)破壞程序的異常機(jī)制的。關(guān)于這個(gè)問(wèn)題,曾在開(kāi)發(fā)過(guò)程中遇到過(guò),但是查了一下網(wǎng)上幾乎沒(méi)有相關(guān)的介紹。后來(lái)做了一次試驗(yàn),分別采用Ajax和傳統(tǒng)的form提交的模式來(lái)刪除一條數(shù)據(jù)……給我們的調(diào)試帶來(lái)了很大的困難
5.AJAX不能很好支持移動(dòng)設(shè)備。一些手持設(shè)備(如手機(jī)、PDA等)現(xiàn)在還不能很好的支持Ajax,比如說(shuō)我們?cè)谑謾C(jī)的瀏覽器上打開(kāi)采用Ajax技術(shù)的網(wǎng)站時(shí),它目前是不支持的。
Ajax適用場(chǎng)景表單驅(qū)動(dòng)的交互
深層次的樹(shù)的導(dǎo)航
快速的用戶與用戶間的交流響應(yīng)
類似投票、yes/no等無(wú)關(guān)痛癢的場(chǎng)景
對(duì)數(shù)據(jù)進(jìn)行過(guò)濾和操縱相關(guān)數(shù)據(jù)的場(chǎng)景
普通的文本輸入提示和自動(dòng)完成的場(chǎng)景
Ajax不適用場(chǎng)景部分簡(jiǎn)單的表單
搜索
基本的導(dǎo)航
替換大量的文本
對(duì)呈現(xiàn)的操縱
Ajax常見(jiàn)面試題: 1、Ajax是什么?如何創(chuàng)建一個(gè)Ajax?Ajax并不算是一種新的技術(shù),全稱是asychronous javascript and xml,可以說(shuō)是已有技術(shù)的組合,主要用來(lái)實(shí)現(xiàn)客戶端與服務(wù)器端的異步通信效果,實(shí)現(xiàn)頁(yè)面的局部刷新,早期的瀏覽器并不能原生支持ajax,可以使用隱藏幀(iframe)方式變相實(shí)現(xiàn)異步效果,后來(lái)的瀏覽器提供了對(duì)ajax的原生支持
使用ajax原生方式發(fā)送請(qǐng)求主要通過(guò)XMLHttpRequest(標(biāo)準(zhǔn)瀏覽器)、ActiveXObject(IE瀏覽器)對(duì)象實(shí)現(xiàn)異步通信效果
基本步驟:
var xhr =null;//創(chuàng)建對(duì)象 if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject("Microsoft.XMLHTTP"); } xhr.open(“方式”,”地址”,”標(biāo)志位”);//初始化請(qǐng)求 xhr.setRequestHeader(“”,””);//設(shè)置http頭信息 xhr.onreadystatechange =function(){}//指定回調(diào)函數(shù) xhr.send();//發(fā)送請(qǐng)求
js框架(jQuery/EXTJS等)提供的ajax API對(duì)原生的ajax進(jìn)行了封裝,熟悉了基礎(chǔ)理論,再學(xué)習(xí)別的框架就會(huì)得心應(yīng)手,好多都是換湯不換藥的內(nèi)容
2、同步和異步的區(qū)別?同步:阻塞的
張三叫李四去吃飯,李四一直忙得不停,張三一直等著,直到李四忙完兩個(gè)人一塊去吃飯,瀏覽器向服務(wù)器請(qǐng)求數(shù)據(jù),服務(wù)器比較忙,瀏覽器一直等著(頁(yè)面白屏),直到服務(wù)器返回?cái)?shù)據(jù),瀏覽器才能顯示頁(yè)面
異步:非阻塞的
張三叫李四去吃飯,李四在忙,張三說(shuō)了一聲然后自己就去吃飯了,李四忙完后自己去吃,瀏覽器向服務(wù)器請(qǐng)求數(shù)據(jù),服務(wù)器比較忙,瀏覽器可以自如的干原來(lái)的事情(顯示頁(yè)面),服務(wù)器返回?cái)?shù)據(jù)的時(shí)候通知瀏覽器一聲,瀏覽器把返回的數(shù)據(jù)再渲染到頁(yè)面,局部更新
3、如何解決跨域問(wèn)題?理解跨域的概念:協(xié)議、域名、端口都相同才同域,否則都是跨域
出于安全考慮,服務(wù)器不允許ajax跨域獲取數(shù)據(jù),但是可以跨域獲取文件內(nèi)容,所以基于這一點(diǎn),可以動(dòng)態(tài)創(chuàng)建script標(biāo)簽,使用標(biāo)簽的src屬性訪問(wèn)js文件的形式獲取js腳本,并且這個(gè)js腳本中的內(nèi)容是函數(shù)調(diào)用,該函數(shù)調(diào)用的參數(shù)是服務(wù)器返回的數(shù)據(jù),為了獲取這里的參數(shù)數(shù)據(jù),需要事先在頁(yè)面中定義回調(diào)函數(shù),在回調(diào)函數(shù)中處理服務(wù)器返回的數(shù)據(jù),這就是解決跨域問(wèn)題的主流解決方案
4、頁(yè)面編碼和被請(qǐng)求的資源編碼如果不一致如何處理?對(duì)于ajax請(qǐng)求傳遞的參數(shù),如果是get請(qǐng)求方式,參數(shù)如果傳遞中文,在有些瀏覽器會(huì)亂碼,不同的瀏覽器對(duì)參數(shù)編碼的處理方式不同,所以對(duì)于get請(qǐng)求的參數(shù)需要使用encodeURIComponent函數(shù)對(duì)參數(shù)進(jìn)行編碼處理,后臺(tái)開(kāi)發(fā)語(yǔ)言都有相應(yīng)的解碼api。對(duì)于post請(qǐng)求不需要進(jìn)行編碼
5、簡(jiǎn)述ajax的過(guò)程。創(chuàng)建XMLHttpRequest對(duì)象,也就是創(chuàng)建一個(gè)異步調(diào)用對(duì)象
創(chuàng)建一個(gè)新的HTTP請(qǐng)求,并指定該HTTP請(qǐng)求的方法、URL及驗(yàn)證信息
設(shè)置響應(yīng)HTTP請(qǐng)求狀態(tài)變化的函數(shù)
發(fā)送HTTP請(qǐng)求
獲取異步調(diào)用返回的數(shù)據(jù)
使用JavaScript和DOM實(shí)現(xiàn)局部刷新
6、闡述一下異步加載JS。異步加載的方案: 動(dòng)態(tài)插入 script 標(biāo)簽
通過(guò) ajax 去獲取 js 代碼,然后通過(guò) eval 執(zhí)行
script 標(biāo)簽上添加 defer 或者 async 屬性
創(chuàng)建并插入 iframe,讓它異步執(zhí)行 js
7、請(qǐng)解釋一下 JavaScript的同源策略?!?/b>同源策略是客戶端腳本(尤其是Javascript)的重要的安全度量標(biāo)準(zhǔn)。它最早出自Netscape Navigator2.0,其目的是防止某個(gè)文檔或腳本從多個(gè)不同源裝載。所謂同源指的是:協(xié)議,域名,端口相同,同源策略是一種安全協(xié)議,指一段腳本只能讀取來(lái)自同一來(lái)源的窗口和文檔的屬性。
8、GET和POST的區(qū)別,何時(shí)使用POST?GET:一般用于信息獲取,使用URL傳遞參數(shù),對(duì)所發(fā)送信息的數(shù)量也有限制,一般在2000個(gè)字符,有的瀏覽器是8000個(gè)字符
POST:一般用于修改服務(wù)器上的資源,對(duì)所發(fā)送的信息沒(méi)有限制
在以下情況中,請(qǐng)使用 POST 請(qǐng)求:
無(wú)法使用緩存文件(更新服務(wù)器上的文件或數(shù)據(jù)庫(kù))
向服務(wù)器發(fā)送大量數(shù)據(jù)(POST 沒(méi)有數(shù)據(jù)量限制)
發(fā)送包含未知字符的用戶輸入時(shí),POST 比 GET 更穩(wěn)定也更可靠
9、ajax是什么?ajax的交互模型?同步和異步的區(qū)別?如何解決跨域問(wèn)題?通過(guò)異步模式,提升了用戶體驗(yàn)
優(yōu)化了瀏覽器和服務(wù)器之間的傳輸,減少不必要的數(shù)據(jù)往返,減少了帶寬占用
Ajax在客戶端運(yùn)行,承擔(dān)了一部分本來(lái)由服務(wù)器承擔(dān)的工作,減少了大用戶量下的服務(wù)器負(fù)載。
10、 Ajax的最大的特點(diǎn)是什么。Ajax可以實(shí)現(xiàn)異步通信效果,實(shí)現(xiàn)頁(yè)面局部刷新,帶來(lái)更好的用戶體驗(yàn);按需獲取數(shù)據(jù),節(jié)約帶寬資源;
11、ajax的缺點(diǎn)1、ajax不支持瀏覽器back按鈕。
2、安全問(wèn)題 AJAX暴露了與服務(wù)器交互的細(xì)節(jié)。
3、對(duì)搜索引擎的支持比較弱。
4、破壞了程序的異常機(jī)制。
12、ajax請(qǐng)求的時(shí)候get和post方式的區(qū)別get一般用來(lái)進(jìn)行查詢操作,url地址有長(zhǎng)度限制,請(qǐng)求的參數(shù)都暴露在url地址當(dāng)中,如果傳遞中文參數(shù),需要自己進(jìn)行編碼操作,安全性較低。
post請(qǐng)求方式主要用來(lái)提交數(shù)據(jù),沒(méi)有數(shù)據(jù)長(zhǎng)度的限制,提交的數(shù)據(jù)內(nèi)容存在于http請(qǐng)求體中,數(shù)據(jù)不會(huì)暴漏在url地址中。
13、解釋jsonp的原理,以及為什么不是真正的ajaxJsonp并不是一種數(shù)據(jù)格式9,而json是一種數(shù)據(jù)格式,jsonp是用來(lái)解決跨域獲取數(shù)據(jù)的一種解決方案,具體是通過(guò)動(dòng)態(tài)創(chuàng)建script標(biāo)簽,然后通過(guò)標(biāo)簽的src屬性獲取js文件中的js腳本,該腳本的內(nèi)容是一個(gè)函數(shù)調(diào)用,參數(shù)就是服務(wù)器返回的數(shù)據(jù),為了處理這些返回的數(shù)據(jù),需要事先在頁(yè)面定義好回調(diào)函數(shù),本質(zhì)上使用的并不是ajax技術(shù)
14、什么是Ajax和JSON,它們的優(yōu)缺點(diǎn)。Ajax是全稱是asynchronous JavaScript andXML,即異步JavaScript和xml,用于在Web頁(yè)面中實(shí)現(xiàn)異步數(shù)據(jù)交互,實(shí)現(xiàn)頁(yè)面局部刷新。
優(yōu)點(diǎn):可以使得頁(yè)面不重載全部?jī)?nèi)容的情況下加載局部?jī)?nèi)容,降低數(shù)據(jù)傳輸量,避免用戶不斷刷新或者跳轉(zhuǎn)頁(yè)面,提高用戶體驗(yàn)
缺點(diǎn):對(duì)搜索引擎不友好;要實(shí)現(xiàn)ajax下的前后退功能成本較大;可能造成請(qǐng)求數(shù)的增加跨域問(wèn)題限制;
JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,ECMA的一個(gè)子集
優(yōu)點(diǎn):輕量級(jí)、易于人的閱讀和編寫(xiě),便于機(jī)器(JavaScript)解析,支持復(fù)合數(shù)據(jù)類型(數(shù)組、對(duì)象、字符串、數(shù)字)
15、http常見(jiàn)的狀態(tài)碼有那些?分別代表是什么意思?200 - 請(qǐng)求成功
301 - 資源(網(wǎng)頁(yè)等)被永久轉(zhuǎn)移到其它URL
404 - 請(qǐng)求的資源(網(wǎng)頁(yè)等)不存在
500 - 內(nèi)部服務(wù)器錯(cuò)誤
16、一個(gè)頁(yè)面從輸入 URL到頁(yè)面加載顯示完成,這個(gè)過(guò)程中都發(fā)生了什么?分為4個(gè)步驟:
當(dāng)發(fā)送一個(gè) URL 請(qǐng)求時(shí),不管這個(gè) URL 是 Web 頁(yè)面的 URL 還是 Web 頁(yè)面上每個(gè)資源的 URL,瀏覽器都會(huì)開(kāi)啟一個(gè)線程來(lái)處理這個(gè)請(qǐng)求,同時(shí)在遠(yuǎn)程 DNS 服務(wù)器上啟動(dòng)一個(gè) DNS 查詢。這能使瀏覽器獲得請(qǐng)求對(duì)應(yīng)的 IP 地址。
瀏覽器與遠(yuǎn)程 Web 服務(wù)器通過(guò) TCP 三次握手協(xié)商來(lái)建立一個(gè) TCP/IP 連接。該握手包括一個(gè)同步報(bào)文,一個(gè)同步-應(yīng)答報(bào)文和一個(gè)應(yīng)答報(bào)文,這三個(gè)報(bào)文在 瀏覽器和服務(wù)器之間傳遞。該握手首先由客戶端嘗試建立起通信,而后服務(wù)器應(yīng)答并接受客戶端的請(qǐng)求,最后由客戶端發(fā)出該請(qǐng)求已經(jīng)被接受的報(bào)文。
一旦 TCP/IP 連接建立,瀏覽器會(huì)通過(guò)該連接向遠(yuǎn)程服務(wù)器發(fā)送 HTTP 的 GET 請(qǐng)求。遠(yuǎn)程服務(wù)器找到資源并使用 HTTP 響應(yīng)返回該資源,值為 200 的 HTTP 響應(yīng)狀態(tài)表示一個(gè)正確的響應(yīng)。
此時(shí),Web 服務(wù)器提供資源服務(wù),客戶端開(kāi)始下載資源。
17、ajax請(qǐng)求的時(shí)候get和post方式的區(qū)別get一般用來(lái)進(jìn)行查詢操作,url地址有長(zhǎng)度限制,請(qǐng)求的參數(shù)都暴露在url地址當(dāng)中,如果傳遞中文參數(shù),需要自己進(jìn)行編碼操作,安全性較低。
post請(qǐng)求方式主要用來(lái)提交數(shù)據(jù),沒(méi)有數(shù)據(jù)長(zhǎng)度的限制,提交的數(shù)據(jù)內(nèi)容存在于http請(qǐng)求體中,數(shù)據(jù)不會(huì)暴漏在url地址中。
18、ajax請(qǐng)求時(shí),如何解釋json數(shù)據(jù)
使用eval() 或者JSON.parse() 鑒于安全性考慮,推薦使用JSON.parse()更靠譜,對(duì)數(shù)據(jù)的安全性更好。
JavaScript高級(jí)程序設(shè)計(jì)第三版
AJAX工作原理及其優(yōu)缺點(diǎn)
Ajax原理以及優(yōu)缺點(diǎn)
Ajax的工作原理
Ajax系列面試題總結(jié)01
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96057.html
摘要:而由于安全風(fēng)險(xiǎn)的原因,被禁止使用。就好比單線程一樣,請(qǐng)求發(fā)出后就進(jìn)入阻塞狀態(tài),直到解除阻塞,余下的代碼才會(huì)繼續(xù)執(zhí)行。安全問(wèn)題暴露了與服務(wù)器交互的細(xì)節(jié)。破壞了程序的異常機(jī)制。服務(wù)器端暫時(shí)無(wú)法處理請(qǐng)求可能是過(guò)載或維護(hù)。 AJAX全稱Asynchronous JavaScript and XML(異步JavaScript和XML),是指一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)。它有機(jī)地包含了以下...
摘要:說(shuō)明關(guān)于跨域問(wèn)題的解決方案多達(dá)七八種,你不要說(shuō)哪有這么多,我不跟你較真哈,你也別跟我較真哈自行百度或這里不會(huì)跟你說(shuō)那么多種只說(shuō)使用最多的一種你要非說(shuō)用的不是最多的我不信哦你信好了哈哈你開(kāi)心就好關(guān)于跨域?yàn)g覽器的同源策略要了解什么是跨域你需要了 說(shuō)明 關(guān)于跨域問(wèn)題的解決方案多達(dá)七、八種,你不要說(shuō)哪有這么多,我不跟你較真哈,你也別跟我較真哈, ?!自行 百度 或 Google, 這里不會(huì)跟你...
摘要:及相關(guān)問(wèn)題數(shù)據(jù)類型函數(shù)中指向原型作用域閉包面向?qū)ο髮?duì)象創(chuàng)建模式繼承嚴(yán)格模式與對(duì)象轉(zhuǎn)換的方法添加屬性,根據(jù)原型創(chuàng)建區(qū)別新特性解構(gòu)賦值簡(jiǎn)化對(duì)象寫(xiě)法剪頭函數(shù)三點(diǎn)運(yùn)算符模板字符串形參默認(rèn)值異步過(guò)程深拷貝與淺拷貝賦值與淺拷貝的區(qū)別淺拷貝的幾種方法實(shí)現(xiàn) js及es相關(guān)問(wèn)題 數(shù)據(jù)類型函數(shù)中this指向——————原型作用域閉包——————面向?qū)ο髮?duì)象創(chuàng)建模式繼承——————Es5嚴(yán)格模式Json與j...
摘要:及相關(guān)問(wèn)題數(shù)據(jù)類型函數(shù)中指向原型作用域閉包面向?qū)ο髮?duì)象創(chuàng)建模式繼承嚴(yán)格模式與對(duì)象轉(zhuǎn)換的方法添加屬性,根據(jù)原型創(chuàng)建區(qū)別新特性解構(gòu)賦值簡(jiǎn)化對(duì)象寫(xiě)法剪頭函數(shù)三點(diǎn)運(yùn)算符模板字符串形參默認(rèn)值異步過(guò)程深拷貝與淺拷貝賦值與淺拷貝的區(qū)別淺拷貝的幾種方法實(shí)現(xiàn) js及es相關(guān)問(wèn)題 數(shù)據(jù)類型函數(shù)中this指向——————原型作用域閉包——————面向?qū)ο髮?duì)象創(chuàng)建模式繼承——————Es5嚴(yán)格模式Json與j...
摘要:它是一個(gè)過(guò)濾器的作用,只有被選中元素的后代元素才會(huì)觸發(fā)事件。替換是引入的,目的是通過(guò)祖先元素來(lái)代理委派后代元素的事件綁定問(wèn)題,某種程度上和優(yōu)點(diǎn)相似。相關(guān)資料深入理解新的綁定事件機(jī)制方法的使用新的事件綁定機(jī)制 前言 在開(kāi)發(fā)項(xiàng)目的時(shí)候,JQuery的使用極其廣泛,如果腦海中沒(méi)有一點(diǎn)JQuery的基礎(chǔ)知識(shí),隨性編寫(xiě),那么就有可能造成bug問(wèn)題。JQuery 1.4版本之后新增了on方法,這個(gè)...
閱讀 2894·2021-11-25 09:43
閱讀 2555·2021-10-09 09:44
閱讀 2839·2021-09-22 15:49
閱讀 2632·2021-09-01 11:43
閱讀 2575·2019-08-30 14:16
閱讀 499·2019-08-29 17:24
閱讀 3056·2019-08-29 14:00
閱讀 1415·2019-08-29 13:05