JS 拦截全局ajax请求实例解析


Posted in Javascript onNovember 29, 2016

你是否有过下面的需求:需要给所有ajax请求添加统一签名、需要统计某个接口被请求的次数、需要限制http请求的方法必须为get或post、需要分析别人网络协议等等,那么如何做?想想,如果能够拦截所有ajax请求,那么问题就会变的很简单!?,少年,想法有点大胆,不过,我欣赏!直接上轮子,Ajax-hook不仅可以满足你想要的,同时可以给你更多。

Ajax-hook源码地址 : https://github.com/wendux/Ajax-hook

如何使用

1.引入ajaxhook.js

<script src="wendu.ajaxhook.js"></script>

2.拦截需要的ajax 回调或函数。

hookAjax({
//拦截回调
onreadystatechange:function(xhr){
console.log("onreadystatechange called: %O",xhr)
},
onload:function(xhr){
console.log("onload called: %O",xhr)
},
//拦截函数
open:function(arg){
console.log("open called: method:%s,url:%s,async:%s",arg[0],arg[1],arg[2])
}
})

ok, 我们使用jQuery(v3.1) 的get方法来测一下:

// get current page source code 
$.get().done(function(d){
console.log(d.substr(0,30)+"...")
})

结果 :

> open called: method:GET,url:http://localhost:63342/Ajax-hook/demo.html,async:true
> onload called: XMLHttpRequest
> <!DOCTYPE html>
<html>
<head l...

拦截成功了! 我们也可以看到jQuery3.1内部已经放弃onreadystatechange而改用onload了。

API

hookAjax(ob)

  • ob,类型是对象,key为想要拦截的回调或函数,value为我们的拦截函数。
  • 返回值: 原始的 XMLHttpRequest。如果有写请求不想被拦截,可以new 这个。

unHookAjax()

  • 卸载拦截;卸载后,拦截将失效。

改变ajax行为

拦截所有ajax请求,检测请求method,如果是“GET”,则中断请求并给出提示

hookAjax({
open:function(arg){
if(arg[0]=="GET"){
console.log("Request was aborted! method must be post! ")
return true;
}
} 
})

拦截所有ajax请求,请求统一添加时间戳

hookAjax({
open:function(arg){
arg[1]+="?timestamp="+Date.now();
} 
})

修改请求返回的数据“responseText”

hookAjax({
onload:function(xhr){
//请求到的数据首部添加"hook!" 
xhr.responseText="hook!"+xhr.responseText;
}
})

结果:

hook!<!DOCTYPE html>
<html>
<h...

有了这些示例,相信开篇提到的需求都很容易实现。最后测一下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<!DOCTYPE html>
<html>
<he...
unhook
<!DOCTYPE

注意

1.拦截函数返回值是一个boolean,如果为true则会阻断ajax请求,默认为false,不会阻断请求。

2.所有的回调拦截函数的参数为当前的XMLHttpRequest 实例,如onreadystatechange、onload;所有ajax原始方法的拦截函数会将原始参数以数组的形式传递给拦截函数,你可以在拦截函数中修改它。

以上所述是小编给大家介绍的JS 拦截全局ajax请求实例解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
漂亮的提示信息(带箭头)
Mar 21 Javascript
JS Map 和 List 的简单实现代码
Jul 08 Javascript
jquery获取子节点和父节点的示例代码
Sep 10 Javascript
js substring从右边获取指定长度字符串(示例代码)
Dec 23 Javascript
jquery中子元素和后代元素的区别示例介绍
Apr 02 Javascript
9款2014最热门jQuery实用特效推荐
Dec 07 Javascript
JavaScript中的this到底是什么(一)
Dec 09 Javascript
基于javascript实现tab选项卡切换特效调试笔记
Mar 30 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
May 04 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
Sep 16 Javascript
代码实例ajax实现点击加载更多数据图片
Oct 12 Javascript
Vue CLI3基础学习之pages构建多页应用
Jun 02 Javascript
JS正则替换掉小括号及内容的方法
Nov 29 #Javascript
详解堆的javascript实现方法
Nov 29 #Javascript
Bootstrap Table使用心得总结
Nov 29 #Javascript
jQuery将表单序列化成一个Object对象的实例
Nov 29 #Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
Nov 29 #Javascript
jQuery序列化表单成对象的简单实现
Nov 29 #Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
Nov 29 #Javascript
You might like
SONY ICF-SW7600的电路分析
2021/03/02 无线电
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
php上传文件常见问题总结
2015/02/03 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
Js 中debug方式
2010/02/07 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
js运动动画的八个知识点
2015/03/12 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
详解VueJs异步动态加载块
2017/03/09 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
2019/05/21 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
centos系统升级python 2.7.3
2014/07/03 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
浅谈python中get pass用法
2019/03/19 Python
python3 pygame实现接小球游戏
2019/05/14 Python
建筑工程技术应届生求职信
2013/11/17 职场文书
积极分子思想汇报
2014/01/04 职场文书
上课说话检讨书大全
2014/01/22 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
电台编导求职信
2014/05/06 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
课外活动总结
2015/02/04 职场文书
医生辞职信范文
2015/03/02 职场文书
个人政治思想总结
2015/03/05 职场文书
Win11软件图标固定到任务栏
2022/04/19 数码科技