摘要:卸載攔截卸載后,攔截將失效。最后測(cè)一下輸出注意攔截函數(shù)返回值是一個(gè),如果為則會(huì)阻斷請(qǐng)求,默認(rèn)為不會(huì)阻斷請(qǐng)求。
你是否有過下面的需求:需要給所有ajax請(qǐng)求添加統(tǒng)一簽名、需要統(tǒng)計(jì)某個(gè)接口被請(qǐng)求的次數(shù)、需要限制http請(qǐng)求的方法必須為get或post、需要分析別人網(wǎng)絡(luò)協(xié)議等等,那么如何做?想想,如果能夠攔截所有ajax請(qǐng)求,那么問題就會(huì)變的很簡(jiǎn)單!?,少年,想法有點(diǎn)大膽,不過,我欣賞!直接上輪子,Ajax-hook不僅可以滿足你想要的,同時(shí)可以給你更多。
本博客原始地址:http://www.jianshu.com/p/9b634f1c9615
Ajax-hook源碼地址 : https://github.com/wendux/Ajax-hook 歡迎star
引入ajaxhook.js
攔截需要的ajax 回調(diào)或函數(shù)。
hookAjax({ //攔截回調(diào) onreadystatechange:function(xhr){ console.log("onreadystatechange called: %O",xhr) }, onload:function(xhr){ console.log("onload called: %O",xhr) }, //攔截函數(shù) open:function(arg){ console.log("open called: method:%s,url:%s,async:%s",arg[0],arg[1],arg[2]) } })
ok, 我們使用jQuery(v3.1) 的get方法來測(cè)一下:
// get current page source code $.get().done(function(d){ console.log(d.substr(0,30)+"...") })
結(jié)果 :
> open called: method:GET,url:http://localhost:63342/Ajax-hook/demo.html,async:true > onload called: XMLHttpRequest >攔截成功了! 我們也可以看到j(luò)Query3.1內(nèi)部已經(jīng)放棄onreadystatechange而改用onload了。
二. CommonJs下的模塊構(gòu)建工具環(huán)境中假設(shè)在webpack下,第一步, 安裝ajax-hook npm插件
npm install ajax-hook --save-dev第二步,引入模塊并調(diào)用api:
const ah=require("ajax-hook") ah.hookAjax({ onreadystatechange:function(xhr){ ... }, onload:function(xhr){ ... }, ... }) ... ah.unHookAjax()API hookAjax(ob)ob,類型是對(duì)象,key為想要攔截的回調(diào)或函數(shù),value為我們的攔截函數(shù)。
返回值: 原始的 XMLHttpRequest。如果有寫請(qǐng)求不想被攔截,可以new 這個(gè)。
unHookAjax()卸載攔截;卸載后,攔截將失效。
改變ajax行為攔截所有ajax請(qǐng)求,檢測(cè)請(qǐng)求method,如果是“GET”,則中斷請(qǐng)求并給出提示
hookAjax({ open:function(arg){ if(arg[0]=="GET"){ console.log("Request was aborted! method must be post! ") return true; } } })攔截所有ajax請(qǐng)求,請(qǐng)求統(tǒng)一添加時(shí)間戳
hookAjax({ open:function(arg){ arg[1]+="?timestamp="+Date.now(); } })修改請(qǐng)求返回的數(shù)據(jù)“responseText”
hookAjax({ onload:function(xhr){ //請(qǐng)求到的數(shù)據(jù)首部添加"hook!" xhr.responseText="hook!"+xhr.responseText; } })結(jié)果:
hook!有了這些示例,相信開篇提到的需求都很容易實(shí)現(xiàn)。最后測(cè)一下unHook
hookAjax({ onreadystatechange:function(xhr){ console.log("onreadystatechange called: %O",xhr) //return true }, onload:function(xhr){ console.log("onload called") xhr.responseText="hook"+xhr.responseText; //return true; }, open:function(arg){ console.log("open called: method:%s,url:%s,async:%s",arg[0],arg[1],arg[2]) arg[1]+="?hook_tag=1"; }, send:function(arg){ console.log("send called: %O",arg[0]) } }) $.get().done(function(d){ console.log(d.substr(0,30)+"...") //use original XMLHttpRequest console.log("unhook") unHookAjax() $.get().done(function(d){ console.log(d.substr(0,10)) }) })輸出:
open called: method:GET,url:http://localhost:63342/Ajax-hook/demo.html,async:true send called: null onload called hook注意 攔截函數(shù)返回值是一個(gè)boolean,如果為true則會(huì)阻斷ajax請(qǐng)求,默認(rèn)為false,不會(huì)阻斷請(qǐng)求。
所有的回調(diào)攔截函數(shù)的參數(shù)為當(dāng)前的XMLHttpRequest 實(shí)例,如onreadystatechange、onload;所有ajax原始方法的攔截函數(shù)會(huì)將原始參數(shù)以數(shù)組的形式傳遞給攔截函數(shù),你可以在攔截函數(shù)中修改它。
相關(guān)鏈接:
Ajax-hook原理解析:http://www.jianshu.com/p/7337ac624b8eBY THE WAY : 歡迎關(guān)注、star我的另一個(gè)開源項(xiàng)目 fly.js ! ?。
最后還是老話:剛開博客,求贊、求關(guān)注、求評(píng)論、各種求。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90073.html
摘要:發(fā)送全局參數(shù)我做單頁面應(yīng)用時(shí),會(huì)有這樣一個(gè)情景當(dāng)用戶登錄后,服務(wù)器會(huì)返回一個(gè)值,之后的大部分請(qǐng)求都需要傳遞這個(gè)參數(shù)。因此,我在中增加這樣一個(gè)函數(shù)來解決上面的問題。 關(guān)于作者 馬隆博(Lenbo Ma),Java,Javascript Blog: http://mlongbo.com E-Mail: [email protected] 文章編寫于: 2014/08/10 轉(zhuǎn)載請(qǐng)注明出...
摘要:其實(shí)就是我們開始掛載上去的我們?cè)谶@里出去,我們就可以在回調(diào)里面只處理我們的業(yè)務(wù)邏輯,而其他如斷網(wǎng)超時(shí)服務(wù)器出錯(cuò)等均通過攔截器進(jìn)行統(tǒng)一處理。 showImg(https://segmentfault.com/img/remote/1460000015472616?w=845&h=622); 開始之前 隨著業(yè)務(wù)的不斷累積,目前我們 ToC 端主要項(xiàng)目,除去 node_modules, bu...
摘要:其實(shí)就是我們開始掛載上去的我們?cè)谶@里出去,我們就可以在回調(diào)里面只處理我們的業(yè)務(wù)邏輯,而其他如斷網(wǎng)超時(shí)服務(wù)器出錯(cuò)等均通過攔截器進(jìn)行統(tǒng)一處理。 showImg(https://segmentfault.com/img/remote/1460000015472616?w=845&h=622); 開始之前 隨著業(yè)務(wù)的不斷累積,目前我們 ToC 端主要項(xiàng)目,除去 node_modules, bu...
摘要:支持請(qǐng)求響應(yīng)攔截器。定位與目標(biāo)的定位是成為請(qǐng)求的終極解決方案。攔截器支持請(qǐng)求響應(yīng)攔截器,可以通過它在請(qǐng)求發(fā)起之前和收到響應(yīng)數(shù)據(jù)之后做一些預(yù)處理。 Fly.js 是一個(gè)功能強(qiáng)大的輕量級(jí)的javascript http請(qǐng)求庫,同時(shí)支持瀏覽器和node環(huán)境,通過適配器,它可以運(yùn)行在任何具有網(wǎng)絡(luò)能力的javascript運(yùn)行環(huán)境;同時(shí)fly.js有一些高級(jí)的玩法如全局ajax攔截、在web a...
摘要:博客地址使用模塊化工具打包自己開發(fā)的庫文章中有提到,當(dāng)時(shí)需要寫一個(gè),監(jiān)控小程序的后臺(tái)接口調(diào)用和頁面報(bào)錯(cuò),今天就來說下實(shí)現(xiàn)原理吧原理之前也做過瀏覽器端的數(shù)據(jù)埋點(diǎn)上報(bào),其實(shí)原理大同小異通過劫持原始方法,獲取需要上報(bào)的數(shù)據(jù),最后再執(zhí)行原始方法,這 博客地址 《使用模塊化工具打包自己開發(fā)的JS庫》文章中有提到,當(dāng)時(shí)需要寫一個(gè)SDK,監(jiān)控小程序的后臺(tái)接口調(diào)用和頁面報(bào)錯(cuò),今天就來說下實(shí)現(xiàn)原理吧! ...
閱讀 593·2023-04-26 01:42
閱讀 3230·2021-11-22 11:56
閱讀 2407·2021-10-08 10:04
閱讀 855·2021-09-24 10:37
閱讀 3134·2019-08-30 15:52
閱讀 1755·2019-08-29 13:44
閱讀 478·2019-08-28 17:51
閱讀 2150·2019-08-26 18:26