摘要:當(dāng)請(qǐng)求完成后注冊(cè)一個(gè)回調(diào)函數(shù)。該請(qǐng)求是否觸發(fā)全局處理事件如等,請(qǐng)求發(fā)送前的回調(diào)函數(shù),用來修改請(qǐng)求發(fā)送前,此功能可用來設(shè)置自定義頭信息,在函數(shù)中返回將取消這個(gè)請(qǐng)求。例如,為請(qǐng)求指定一個(gè)回調(diào)函數(shù)名。即改變回調(diào)函數(shù)的,默認(rèn)就是傳入的整個(gè)對(duì)象。
Ajax
Ajax 全稱是 asynchronous javascript and xml,并不是新的編程語言,可以說是已有技術(shù)的組合,主要用來實(shí)現(xiàn)客戶端與服務(wù)器端的異步通信效果,實(shí)現(xiàn)頁面的局部刷新,從而創(chuàng)建快速動(dòng)態(tài)網(wǎng)頁的技術(shù)。
Ajax過程- 創(chuàng)建XMLHttpRequest對(duì)象,也就是創(chuàng)建一個(gè)異步調(diào)用對(duì)象 - 創(chuàng)建一個(gè)新的HTTP請(qǐng)求,并指定其請(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)局部刷新
var xhr = null; // 創(chuàng)建異步對(duì)象 if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); // ie7+等現(xiàn)代瀏覽器 }else if(window.ActiveXObject){ // ie6,老版Opera xhr = new ActiveXObject("Microsft.XMLHTTP"); } xhr.open("get","http://localhost:4000/test",true); // true是異步,可省略 xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); // post 必須設(shè)置 xhr.onreadystatechange = function(){ // 若為同步,此代碼不用寫,直接在send后,用`xhr.responseText`即可。 if(xhr.readyState==4 && xhr.status==200){ /* readyState 0: 請(qǐng)求未初始化 1: 服務(wù)器連接已建立 2: 請(qǐng)求已接收 3: 請(qǐng)求處理中 4: 請(qǐng)求已完成,且響應(yīng)已就緒 status 200 OK 404 Not Found */ xhr.responseText; xhr.responseXML.children[0].children; JSON.parse(xhr.responseText); } } xhr.send(String); // 用于post傳參,形式:"a=1&b=2",而get傳參就在url后面用“?”拼接優(yōu)缺點(diǎn)
優(yōu)點(diǎn):可以使得頁面不重載全部?jī)?nèi)容的情況下加載局部?jī)?nèi)容,降低數(shù)據(jù)傳輸量,避免用戶不斷刷新或者跳轉(zhuǎn)頁面,提高用戶體驗(yàn)
缺點(diǎn):對(duì)搜索引擎不友好,要實(shí)現(xiàn)ajax下的前進(jìn)后退功能成本較大;跨域問題限制
jQuery 中的 Ajax 全局ajax事件處理器jQuery 庫支持完整的 Ajax 操作。這里所包含的所有函數(shù)和方法用于從服務(wù)端加載數(shù)據(jù),并且不會(huì)導(dǎo)致頁面刷新。
$(document).ajaxComplete(handler(event, XMLHttpRequest, ajaxOptions)) 當(dāng)Ajax請(qǐng)求完成后注冊(cè)一個(gè)回調(diào)函數(shù)。
每當(dāng)一個(gè)Ajax請(qǐng)求完成,jQuery就會(huì)觸發(fā)ajaxComplete事件,在這個(gè)時(shí)間點(diǎn)所有處理函數(shù)會(huì)使用.ajaxComplete()方法注冊(cè)并執(zhí)行。
從 jQuery 1.8 開始, .ajaxComplete() 方法只能綁定到 document元素。
如果global選項(xiàng)設(shè)置為false,調(diào)用$.ajax() 或 $.ajaxSetup(),.ajaxComplete()方法將不會(huì)被觸發(fā)。
類似的還有:請(qǐng)求出錯(cuò)ajaxError()、請(qǐng)求發(fā)送前ajaxSend()、請(qǐng)求剛開始ajaxStart()、請(qǐng)求完成時(shí)ajaxStop()、請(qǐng)求成功完成時(shí)ajaxSuccess()
輔助函數(shù)$.param() 創(chuàng)建一個(gè)數(shù)組或?qū)ο笮蛄谢淖址?,適用于一個(gè)URL地址查詢字符串或Ajax請(qǐng)求。此方法無法對(duì)復(fù)雜數(shù)據(jù)結(jié)構(gòu)進(jìn)行編碼。
serialize() 將用作提交的表單元素的值編譯成字符串。
console.log($("form").serialize()); // username=abc&age=24&sex=0serializeArray() 將用作提交的表單元素的值編譯成擁有name和value對(duì)象組成的數(shù)組。
console.log($("form").serializeArray()); // [{name: "username", value: "abc"}, {name: "age", value: "24"}, {name: "sex", value: "0"}]
底層接口
$.ajax(url, {})或$.ajax({url: ""}) 關(guān)于傳參項(xiàng)(可以使用$.ajaxSetup()設(shè)置任何默認(rèn)參數(shù)),下面列舉一些常用的:
url:String,一個(gè)用來包含發(fā)送請(qǐng)求的URL字符串
data:Object、String,發(fā)送到服務(wù)器的數(shù)據(jù)。將自動(dòng)轉(zhuǎn)換為請(qǐng)求字符串格式。GET 請(qǐng)求中將附加在 URL 后面。
dataType:String,默認(rèn)Intelligent Guess (xml, json, script, or html))。預(yù)期服務(wù)器返回的數(shù)據(jù)類型。
xml,html,script,json,text
jsonp: 以 JSONP 的方式載入 JSON 數(shù)據(jù)塊。會(huì)自動(dòng)在所請(qǐng)求的URL最后添加 "?callback=?"。默認(rèn)情況下不會(huì)通過在URL中附加查詢字符串變量 "_=[TIMESTAMP]" 進(jìn)行自動(dòng)緩存結(jié)果,除非將 cache參數(shù)設(shè)置為true。
accepts:PlainObject(可用$.isPlainObject()檢測(cè)),內(nèi)容類型發(fā)送請(qǐng)求頭(Content-Type),用于通知服務(wù)器該請(qǐng)求需要接收何種類型的返回結(jié)果。如果accepts設(shè)置需要修改,推薦在$.ajaxSetup() 方法中設(shè)置一次。
async:Boolean,默認(rèn)true,異步請(qǐng)求
global:Boolean,默認(rèn)true。該請(qǐng)求是否觸發(fā)全局處理事件(如$(document).ajaxComplete()等)
beforeSend(jqXHR, settings):Function,請(qǐng)求發(fā)送前的回調(diào)函數(shù),用來修改請(qǐng)求發(fā)送前jqXHR,此功能可用來設(shè)置自定義 HTTP 頭信息,在beforeSend函數(shù)中返回false將取消這個(gè)請(qǐng)求。
catch:Boolean,默認(rèn)true,dataType為"script"和"jsonp"時(shí)默認(rèn)為false。是否緩存此頁面,原理是在GET請(qǐng)求參數(shù)中附加"_=時(shí)間戳"。該參數(shù)不是其他請(qǐng)求所必須的,除了在IE8中,當(dāng)一個(gè)POST請(qǐng)求一個(gè)已經(jīng)用GET請(qǐng)求過的URL。
complete:Function,請(qǐng)求完成后回調(diào)函數(shù) (請(qǐng)求success 和 error之后均調(diào)用)。
success(data, textStatus, jqXHR):Function,請(qǐng)求成功時(shí)調(diào)用函數(shù)
error:Function,請(qǐng)求失敗時(shí)調(diào)用函數(shù)
timeout:Number,設(shè)置請(qǐng)求超時(shí)時(shí)間(毫秒)。此設(shè)置將覆蓋$.ajaxSetup() 里的全局設(shè)置。
jsonp:String,在一個(gè)jsonp請(qǐng)求中重寫回調(diào)函數(shù)的名字。這個(gè)值用來替代在"callback=?"這種GET或POST請(qǐng)求中URL參數(shù)里的"callback"部分,比如{jsonp:"onJsonPLoad"}會(huì)導(dǎo)致將"onJsonPLoad=?"傳給服務(wù)器。在jQuery 1.5,,設(shè)置jsonp選項(xiàng)為false,阻止了jQuery從加入"?callback"字符串的URL或試圖使用"=?"轉(zhuǎn)換。在這種情況下,你也應(yīng)該明確設(shè)置jsonpCallback設(shè)置。例如, { jsonp: false, jsonpCallback: "callbackName" }
jsonpCallback:String、Function,為jsonp請(qǐng)求指定一個(gè)回調(diào)函數(shù)名。這個(gè)值將用來取代jQuery自動(dòng)生成的隨機(jī)函數(shù)名。這主要用來讓jQuery生成一個(gè)獨(dú)特的函數(shù)名,這樣管理請(qǐng)求更容易,也能方便地提供回調(diào)函數(shù)和錯(cuò)誤處理。你也可以在想讓瀏覽器緩存GET請(qǐng)求的時(shí)候,指定這個(gè)回調(diào)函數(shù)名。從jQuery 1.5開始,你也可以使用一個(gè)函數(shù)作為該參數(shù)設(shè)置,在這種情況下,該函數(shù)的返回值就是jsonpCallback的結(jié)果。
contents: PlainObject,一個(gè)以"{字符串/正則表達(dá)式}"配對(duì)的對(duì)象,根據(jù)給定的內(nèi)容類型,解析請(qǐng)求的返回結(jié)果。
contentType:String,默認(rèn)application/x-www-form-urlencoded; charset=UTF-8。發(fā)送信息至服務(wù)器時(shí)內(nèi)容編碼類型。
context:Object,設(shè)置Ajax相關(guān)回調(diào)函數(shù)的上下文。即改變回調(diào)函數(shù)的this,默認(rèn)就是傳入的整個(gè)對(duì)象。
converters: PlainObject,默認(rèn): {"* text": window.String, "text html": true, "text json": jQuery.parseJSON, "text xml": jQuery.parseXML}。一個(gè)數(shù)據(jù)類型到數(shù)據(jù)類型轉(zhuǎn)換器的對(duì)象。每個(gè)轉(zhuǎn)換器的值是一個(gè)函數(shù),返回經(jīng)轉(zhuǎn)換后的請(qǐng)求結(jié)果。
crossDomain:Boolean,同域請(qǐng)求為false, 跨域請(qǐng)求為true。如果你想在同一域中強(qiáng)制跨域請(qǐng)求(如JSONP形式),例如,想服務(wù)器端重定向到另一個(gè)域,那么需要將crossDomain設(shè)置為 true 。
username:String,于響應(yīng)HTTP訪問認(rèn)證請(qǐng)求的用戶名
password:String,用于響應(yīng)HTTP訪問認(rèn)證請(qǐng)求的密碼
$.ajax() 返回jqXHR對(duì)象,可調(diào)用
.done() success
.fail() error
.always() complete
.then() 傳兩個(gè)回調(diào)函數(shù),分別是done和fail
$.ajaxPrefilter([dataTypes], handler(options, originalOptions, jqXHR) ) 在每個(gè)請(qǐng)求之前被發(fā)送和$.ajax()處理它們前處理,設(shè)置自定義Ajax選項(xiàng)或修改現(xiàn)有選項(xiàng)。
$.ajaxSetup(options) 為以后要用到的Ajax請(qǐng)求設(shè)置默認(rèn)的值,其后的 AJAX 請(qǐng)求不再設(shè)置任何已設(shè)置的選項(xiàng)參數(shù)。
快捷方法$.get() {type: "get"}
$.post() {type: "post"}
$.getScript() {type: "script"}
$.getJSON() {type: "json"}
$(selector).load() 從服務(wù)器載入數(shù)據(jù)并且將返回的 HTML 代碼并插入至 匹配的元素中。
jQuery中jsonp// 前端 function jsonpFn(data){ console.log(data) console.log("jsonpFn"); } $(function(){ $.ajax({ url: "http://localhost:3000/test", data: {username: "xx"}, dataType: "jsonp", jsonp: "selfNamedReplaceCallback", jsonpCallback: "jsonpFn", // server side:req.query.callback = "jsonpFn" success(data){ console.log(data) } }) }) // 后端 const app = require("express").Router(); app.get("/test", (req, res, next) => { let name = req.query.username; let callback = req.query.selfNamedReplaceCallback let s1 = "{status: 1}" let s2 = ` { status: 0, info: { name: "${name}", age: 24, sex: "girl", tel: "1522*******" } } ` s1=callback+"("+s1+")" s2=callback+"("+s2+")" if(!name)return res.send(s1) res.send(s2) }).listen(3000)Axios
axios 是一個(gè)基于 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。
從瀏覽器中創(chuàng)建 XMLHttpRequests
從 node.js 創(chuàng)建 http 請(qǐng)求
支持 Promise API
攔截請(qǐng)求和響應(yīng)
轉(zhuǎn)換請(qǐng)求數(shù)據(jù)和響應(yīng)數(shù)據(jù)
取消請(qǐng)求
自動(dòng)轉(zhuǎn)換 JSON 數(shù)據(jù)
客戶端支持防御 XSRF
在vue項(xiàng)目中使用axios 的 Demo// main.js import axios from "axios" axios.defaults.baseURL = "http://localhost/" Vue.prototype.$axios = axios
// 在 .vue 文件(組件) this.$axios.get("").then().catch() this.$axios.all([ this.$axios.post("one","content=123"), this.$axios.get("one?pageIndex=1") ]) .then(this.$axios.spread((res1,res2)=>{ console.log(res1,res2) })) .catch(err=>{ console.log(err) })
這里分發(fā)請(qǐng)求,同時(shí)請(qǐng)求成功才執(zhí)行 then 方法,可用于獲取 省市區(qū) 的數(shù)據(jù)
// 在 server.js 文件 const Koa = require("koa") const Router = require("koa-router") const app = new Koa() const router = new Router() router.get("/one",ctx=>{ ctx.body = { a: 1, b: 2 } }) router.post("/one",ctx=>{ ctx.body = { c: 3, d: 4 } }) app.use((ctx,next)=>{ ctx.set("Access-Control-Allow-Origin", "*"); ctx.body = {} next() }) .use(router.routes()) .use(router.allowedMethods()) .listen(80)
axios.interceptors.request.use(function(ops){ console.log(ops); ops.headers = {/* ... */}; // 請(qǐng)求前修改 return ops; // 返回沒有修改的位置,如果return false 直接攔截 })
例如,在請(qǐng)求成功前顯示加載loading圖標(biāo),拿到數(shù)據(jù)后消失
// main.js import Mint from "mint-ui" // 實(shí)際項(xiàng)目中選擇引入 import "mint-ui/lib/style.css" Vue.use(Mint) axios.interceptors.request.use(function(config){ Mint.Indicator.open() return config; }) axios.interceptors.response.use(function(data){ Mint.Indicator.close() return data; })Ajax、jQuery.ajax、Axios和Fetch的區(qū)別
ajax最早出現(xiàn)的發(fā)送后端請(qǐng)求技術(shù),利用用XMLHttpRequest對(duì)象。
$.ajax是jQuery中的發(fā)送后端請(qǐng)求技術(shù),基于原生Ajax的封裝。
Axios不是原生JS的,需要進(jìn)行安裝。它在client-side和server-side都可以使用。也可以在請(qǐng)求和響應(yīng)階段進(jìn)行攔截。它是基于promise對(duì)象的。
Fetch號(hào)稱是AJAX的替代品,使用了ES6中的promise對(duì)象。其參數(shù)有點(diǎn)像jQuery.ajax。但是fetch不是對(duì)ajax的封裝,而是原生js實(shí)現(xiàn)的,并沒有使用XMLHttpRequest對(duì)象。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100338.html
摘要:個(gè)人前端文章整理從最開始萌生寫文章的想法,到著手開始寫,再到現(xiàn)在已經(jīng)一年的時(shí)間了,由于工作比較忙,更新緩慢,后面還是會(huì)繼更新,現(xiàn)將已經(jīng)寫好的文章整理一個(gè)目錄,方便更多的小伙伴去學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個(gè)人前端文章整理 從最開始萌生寫文章的想法,到著手...
摘要:當(dāng)用戶完成選擇文件動(dòng)作時(shí),提交子頁面中的。從此我們上傳文件就歡欣鼓舞的來找了。因?yàn)榈暮诵氖菍?duì)象,異步的實(shí)現(xiàn)是通過一個(gè)對(duì)象,一般簡(jiǎn)稱該對(duì)象對(duì)。這些回答基于自己理解,如有不妥,希望路過的大神輕噴,指正。 背景 平時(shí)工作中經(jīng)常會(huì)遇到需要上傳文件的情況,如果你用ant design 或者element ,它們都提供了上傳的組件。 我們分別來看一下element 和 antd 手動(dòng)上傳怎么處理:...
摘要:下面來看下具體的對(duì)象有哪些屬性和方法。對(duì)象的屬性和方法屬性請(qǐng)求的狀態(tài)響應(yīng)體不包括頭部對(duì)請(qǐng)求的響應(yīng),解析為并作為對(duì)象返回。方法取消當(dāng)前響應(yīng),關(guān)閉連接并且結(jié)束任何未決的網(wǎng)絡(luò)活動(dòng)。所以,調(diào)用對(duì)象的方法要有一定的順序,比如在方法注冊(cè)事件。 Ajax是一種能夠向服務(wù)器請(qǐng)求額外的數(shù)據(jù)而無需卸載頁面(無刷新)的技術(shù),是對(duì)Asynchronous Javascript + XML的簡(jiǎn)寫,因其良好...
摘要:只有兩種數(shù)據(jù)類型描述符,大括號(hào)和方括號(hào),其余英文冒號(hào)是映射符,英文逗號(hào)是分隔符,英文雙引號(hào)是定義符。上述兩種集合中若有多個(gè)子項(xiàng),則通過英文逗號(hào)進(jìn)行分隔。鍵值對(duì)以英文冒號(hào)進(jìn)行分隔,并且建議鍵名都加上英文雙引號(hào),以便于不同語言的解析。 由于Sencha Touch 2這種開發(fā)模式的特性,基本決定了它原生的數(shù)據(jù)交互行為幾乎只能通過AJAX來實(shí)現(xiàn)。當(dāng)然了,通過調(diào)用強(qiáng)大的PhoneGap插件然后...
摘要:只有兩種數(shù)據(jù)類型描述符,大括號(hào)和方括號(hào),其余英文冒號(hào)是映射符,英文逗號(hào)是分隔符,英文雙引號(hào)是定義符。上述兩種集合中若有多個(gè)子項(xiàng),則通過英文逗號(hào)進(jìn)行分隔。鍵值對(duì)以英文冒號(hào)進(jìn)行分隔,并且建議鍵名都加上英文雙引號(hào),以便于不同語言的解析。 由于Sencha Touch 2這種開發(fā)模式的特性,基本決定了它原生的數(shù)據(jù)交互行為幾乎只能通過AJAX來實(shí)現(xiàn)。當(dāng)然了,通過調(diào)用強(qiáng)大的PhoneGap插件然后...
閱讀 2988·2023-04-25 17:22
閱讀 1553·2019-08-30 15:54
閱讀 1283·2019-08-30 15:53
閱讀 1801·2019-08-30 15:43
閱讀 3057·2019-08-29 12:29
閱讀 1243·2019-08-26 11:37
閱讀 3275·2019-08-23 18:02
閱讀 1617·2019-08-23 14:15