JavaScript检测Ajax事件

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (86)

好的,基本上,我想在页面上添加一些javascript,它以某种方式附加某种全局事件侦听器,如果发出Ajax请求(而不直接从调用中调用),就可以检测和执行一些事情,而不管Ajax调用是如何进行的。

我想出了如何用jQuery来完成这个任务--如果要执行ajax请求的话。通过jQuery。下面是一个示例代码:

$.post(
  // requested script
  'someScript.php', 
  // data to send
  {
    'foo' : 'bar',
    'a' : 'b'
  },
  // receive response
  function(response){
    // do something
  }
); // .post

// global event listener    
$(document).ajaxSend(
  function(event,request,settings){
    alert(settings.url); // output: "someScript.php"
    alert(settings.data); // output: "foo=bar&a=b"
  }
);

使用此代码,无论我在何处/如何调用$.post(...),全局事件侦听器都将触发。如果我使用$.get或$.ajax(任何jQueryAjax方法),无论我如何/何时调用它(作为onClick、页面加载等),它也能工作。

但是,我希望能够扩展这个侦听器来触发,而不管使用的是什么js框架,或者即使没有使用任何框架。所以,例如,如果我在页面上有以下代码(来自W3学校的通用Ajax代码):

function loadXMLDoc()
{
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","test.txt",true);
xmlhttp.send();
}

然后,在某个随机链接上有一个对该函数的onclick调用,我的全局ajax事件侦听器应该能够检测到这个请求。我将代码添加到我的页面,并将其附加到随机链接的onClick(是的,代码本身也能工作),但上面的jQuery“全局事件侦听器”代码未能检测到该调用。

我做了更多的研究,我知道我可以将对象保存到临时对象,并用一个调用指定函数的“包装器”对象覆盖当前对象,然后调用temp函数,但这要求我提前知道要创建/使用的原始对象。但我不会总是提前知道...

那么...这有可能吗?是否有某种方法检测AJAXGET/POST请求,无论是使用通用对象还是从xyz框架完成?还是我只需要做重复的代码来处理每个框架,并且提前知道正在创建/使用的Ajax对象?

提问于
用户回答回答于

好吧,这就是我到目前为止想出来的:

<script type='text/javascript'>
var s_ajaxListener = new Object();
s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open;
s_ajaxListener.tempSend = XMLHttpRequest.prototype.send;
s_ajaxListener.callback = function () {
  // this.method :the ajax method used
  // this.url    :the url of the requested script (including query string, if any) (urlencoded) 
  // this.data   :the data sent, if any ex: foo=bar&a=b (urlencoded)
}

XMLHttpRequest.prototype.open = function(a,b) {
  if (!a) var a='';
  if (!b) var b='';
  s_ajaxListener.tempOpen.apply(this, arguments);
  s_ajaxListener.method = a;  
  s_ajaxListener.url = b;
  if (a.toLowerCase() == 'get') {
    s_ajaxListener.data = b.split('?');
    s_ajaxListener.data = s_ajaxListener.data[1];
  }
}

XMLHttpRequest.prototype.send = function(a,b) {
  if (!a) var a='';
  if (!b) var b='';
  s_ajaxListener.tempSend.apply(this, arguments);
  if(s_ajaxListener.method.toLowerCase() == 'post')s_ajaxListener.data = a;
  s_ajaxListener.callback();
}
</script>

热门问答

快照容量与费用的比例?如何关闭停用?

帅的惊动我国计算机大神
推荐已采纳
快照已于2019年1月22日0时启动正式商业化进程,商业化后所有存量快照和新产生的快照将根据快照使用的存储容量进行收费。 在快照商业化后,腾讯云仍旧会在国内主要地域为用户提供一定量的免费额度。免费额度策略如下: 免费额度覆盖范围为中国大陆地域,中国香港及海外地域暂无免费快照额...... 展开详请

调用离线语音识别时,回调接口的出口ip段是多少?

119.29.107.245
111.230.13.15
119.29.159.28
119.29.33.205
119.28.82.202
139.199.60.156

系统盘可以快照和恢复吗?具体步骤是?

系统盘也可以进行快照,也可以恢复。就在快照云硬盘那里创建即可。 云硬盘控制台:https://console.cloud.tencent.com/cvm/cbs 再点击里面的“创建快照”即可。 1.jpg 创建后可以在快照控制台处理快照:https://console.clou...... 展开详请

红包消息如何构建?

红包消息的话,与@消息类似,可以通过 TIMCustomElem 来实现。需要应用在UI上做相应的特殊处理,比如检查到当前消息为红包消息后,消息展示为红包的样式。 另外,红包消息作为重要消息,最好在发送消息的时候将其设置为高优先级消息,以最大程序保证消息在触达频率限制的情况下仍可...... 展开详请

AVChatRoom和ChatRoom有什么区别?

面向的应用场景不同 ChatRoom适用于群组规模中等(不超过数千人级别)、成员进出不太频繁(每秒十几个人进出)的场景;AVChatRoom是专门为了大型直播设计的,适用于人数众多(万级以上)、成员进出频繁(每秒数百人以上进出)的场景。 AVChatRoom的优点 支持人数无上限...... 展开详请

serverless函数如何支持跨域?

解决跨域的方式有几种: 1. 如果不像自行解决跨域问题,且没有处理 http header 方法的问题,可以在 API 网关中,针对 API 配置,不选择 ANY 方法,而且仅选择非 header 的方法,然后勾选启用 CORS,由 API 网关协助解决跨域。完成配置后记得保存并...... 展开详请

所属标签

扫码关注云+社区