猿问

为页面上的所有AJAX请求添加“钩子”

为页面上的所有AJAX请求添加“钩子”

我想知道是否可以“挂钩”每个AJAX请求(无论是要发送还是事件)并执行操作。此时我假设页面上还有其他第三方脚本。其中一些可能使用jQuery,而另一些则不然。这可能吗?



牛魔王的故事
浏览 711回答 3
3回答

精慕HU

受到aviv的回答的启发,我做了一些调查,这就是我想出来的。根据脚本中的注释,我不确定它是否有用,当然只适用于使用本机XMLHttpRequest对象的浏览器。我认为如果javascript库正在使用它将会起作用,因为如果可能的话它们将使用本机对象。function&nbsp;addXMLRequestCallback(callback){ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;oldSend,&nbsp;i; &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;XMLHttpRequest.callbacks&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;we've&nbsp;already&nbsp;overridden&nbsp;send()&nbsp;so&nbsp;just&nbsp;add&nbsp;the&nbsp;callback &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLHttpRequest.callbacks.push(&nbsp;callback&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;create&nbsp;a&nbsp;callback&nbsp;queue &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLHttpRequest.callbacks&nbsp;=&nbsp;[callback]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;store&nbsp;the&nbsp;native&nbsp;send() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oldSend&nbsp;=&nbsp;XMLHttpRequest.prototype.send; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;override&nbsp;the&nbsp;native&nbsp;send() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLHttpRequest.prototype.send&nbsp;=&nbsp;function(){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;process&nbsp;the&nbsp;callback&nbsp;queue &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;the&nbsp;xhr&nbsp;instance&nbsp;is&nbsp;passed&nbsp;into&nbsp;each&nbsp;callback&nbsp;but&nbsp;seems&nbsp;pretty&nbsp;useless &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;you&nbsp;can't&nbsp;tell&nbsp;what&nbsp;its&nbsp;destination&nbsp;is&nbsp;or&nbsp;call&nbsp;abort()&nbsp;without&nbsp;an&nbsp;error &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;so&nbsp;only&nbsp;really&nbsp;good&nbsp;for&nbsp;logging&nbsp;that&nbsp;a&nbsp;request&nbsp;has&nbsp;happened &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;I&nbsp;could&nbsp;be&nbsp;wrong,&nbsp;I&nbsp;hope&nbsp;so... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;EDIT:&nbsp;I&nbsp;suppose&nbsp;you&nbsp;could&nbsp;override&nbsp;the&nbsp;onreadystatechange&nbsp;handler&nbsp;though &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;XMLHttpRequest.callbacks.length;&nbsp;i++&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLHttpRequest.callbacks[i](&nbsp;this&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;call&nbsp;the&nbsp;native&nbsp;send() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oldSend.apply(this,&nbsp;arguments); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}//&nbsp;e.g.addXMLRequestCallback(&nbsp;function(&nbsp;xhr&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;console.log(&nbsp;xhr.responseText&nbsp;);&nbsp;//&nbsp;(an&nbsp;empty&nbsp;string)});addXMLRequestCallback(&nbsp;function(&nbsp;xhr&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;console.dir(&nbsp;xhr&nbsp;);&nbsp;//&nbsp;have&nbsp;a&nbsp;look&nbsp;if&nbsp;there&nbsp;is&nbsp;anything&nbsp;useful&nbsp;here});

猛跑小猪

既然你提到的jQuery,我知道jQuery提供了一个.ajaxSetup()用于设置全局AJAX选项,其中包括事件触发类似方法success,error和beforeSend-这是什么听起来像你在找什么。$.ajaxSetup({ &nbsp;&nbsp;&nbsp;&nbsp;beforeSend:&nbsp;function()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//do&nbsp;stuff&nbsp;before&nbsp;request&nbsp;fires &nbsp;&nbsp;&nbsp;&nbsp;}});当然,您需要在尝试使用此解决方案的任何页面上验证jQuery可用性。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答