`
mixer_a
  • 浏览: 367718 次
社区版块
存档分类
最新评论

用javascript监听页面上的所有ajax请求

阅读更多

我们自己是个Grails,集成了另外一个web程序,我们把那个web程序放在我们提供的iframe里。那个web程序只有在第一次初始化的时候是一个普通的HTTP请求,之后在页面上的操作,都是通过ajax来操作的。现在我们有个需求,我们需要知道iframe里面做了什么操作。

没法改别人的代码,那我们只能监测里面的事件了,所以总归来说,要找到一种方法来检测到iframe里面的所有ajax请求。

Javascript框架熟悉的就只有JQuery,所以第一个想到的是用JQuery,看看有没有提供什么方法。找到了,JQuery确实提供了监听ajax的工具方法,如:

 

[javascript] view plaincopy
  1. $("#msg").ajaxComplete(function(event,request, settings){  
  2.    $(this).append("<li>请求完成.</li>");  
  3.  });  
这个方法会在所有ajax请求完成后被调用。

 

再深入找资料,想知道这个方法的原理,发现,原来JQuery提供的监听ajax的方法,只对本身就是用JQuery发出去的请求才有效。原理上也就简单了,在JQuery自己的代码里插入一些控制就实现了。

继续查资料,终于在stackoverflow找到了答案:用来发送ajax的对象XMLHttpRequest本身自己就是一个javascript对象(IE6除外),javascript对象就一定有prototype属性,有这个属性,那我就可以改这个属性的内容。

prototype属性是什么东西,我们这里没法详细描述,简单描述一下就是:我们可以用这个熟悉来修改对象,给对象添加/修改属性或者方法

接下来就和javascript实现继承一样了,我们要做的就是合理的修改XMLHttpRequest的open,send子类的方法,嵌入我们自己的callback代码,即可实现对所有ajax请求的监听。 

封装stackoverflow上的代码,写了一个工具类,代码如下:

 

[javascript] view plaincopy
  1. function ajaxSend(objectOfXMLHttpRequest, callback) {  
  2.     // http://stackoverflow.com/questions/3596583/javascript-detect-an-ajax-event  
  3.     if(!callback){  
  4.         return;  
  5.     }  
  6.       
  7.     var s_ajaxListener = new Object();  
  8.     s_ajaxListener.tempOpen = objectOfXMLHttpRequest.prototype.open;  
  9.     s_ajaxListener.tempSend = objectOfXMLHttpRequest.prototype.send;  
  10.     s_ajaxListener.callback = function () {  
  11.         // this.method :the ajax method used  
  12.         // this.url :the url of the requested script (including query string, if any) (urlencoded)  
  13.         // this.data :the data sent, if any ex: foo=bar&a=b (urlencoded)  
  14.         callback(this.method, this.url, this.data);  
  15.     }  
  16.       
  17.     objectOfXMLHttpRequest.prototype.open = function(a,b) {  
  18.         if (!a) var a='';  
  19.         if (!b) var b='';  
  20.         s_ajaxListener.tempOpen.apply(this, arguments);  
  21.         s_ajaxListener.method = a;    
  22.         s_ajaxListener.url = b;  
  23.         if (a.toLowerCase() == 'get') {  
  24.             s_ajaxListener.data = b.split('?');  
  25.             s_ajaxListener.data = s_ajaxListener.data[1];  
  26.         }  
  27.     }  
  28.       
  29.     objectOfXMLHttpRequest.prototype.send = function(a,b) {  
  30.         if (!a) var a='';  
  31.         if (!b) var b='';  
  32.         s_ajaxListener.tempSend.apply(this, arguments);  
  33.         if(s_ajaxListener.method.toLowerCase() == 'post') {  
  34.             s_ajaxListener.data = a;  
  35.         }  
  36.         s_ajaxListener.callback();  
  37.     }  
  38. }  

这个工具方法输入两个参数:

 

第一个参数是要监听的页面里的XMLHttpRequest对象

第二个参数是一个回调function,回调funtion接收三个参数,分别是

        method :ajax请求的方法,Get,Post,Put之类
        url :请求的URL
        data :请求的数据

看回工具方法的实现,实现原理就是也简单:

第一步:把XMLHttpRequest自身的open,send方法保存起来,存在临时变量里

第二步:修改open方法,新的open方法先调用第一步存起来的XMLHttpRequest自身的open方法,然后把请求时的参数保存到一些变量里以备后面用

第三步:修改send方法,新的send方法先调用第一步存起来的XMLHttpRequest自身的send方法,然后调用callback方法,callback的参数就是在第二步存起来的那些open时候的参数

最后,对于我们自己来说,就是把上面的代码加到iframe上了,

第一步:写一个callback,类似这样:

 

[javascript] view plaincopy
  1. function onAjaxSend(method, url, data) {  
  2. }  
第二步:设置iframe的onload属性为onload="ajaxSend(this.contentWindow.XMLHttpRequest, onAjaxSend);"

 


完工,不足的地方是不支持IE6,好在我们本身就不要对IE6提供支持,也就这样过了

分享到:
评论

相关推荐

    实例详解Android Webview拦截ajax请求

    所有的 Ajax 请求都会转发到 Native 上。 在 Native 端,我们需要实现一个 JavaScript Interface,例如 onAjaxRequest 方法,该方法将接收 Fly.js 传来的请求对象,并完成真正的请求后,将响应对象通过 handler ...

    chrome扩展插件获取ajax请求记录

    在IT领域,尤其是在Web开发中,Ajax(Asynchronous JavaScript and XML)是一种常用的技术,它使得网页可以在不重新加载整个页面的情况下与服务器交换数据并更新部分网页内容。这极大地提升了用户体验,因为用户不再...

    分享JavaScript监听全部Ajax请求事件的方法

    最近在做一个小项目,引入了第三方js文件,这个文件会调用XMLHttpRequest向服务器发送 Ajax请求,但是我有需要监听其Ajax请求的某些事件,以便额外地执行其他脚本。于是稍微看了看监听 Ajax请求的事件方法,在这里...

    Js拦截全局ajax请求

    在JavaScript开发中,有时我们需要对全局的Ajax请求进行拦截,以便进行统一的处理,比如添加统一的错误处理、数据格式化、性能监控等。这种需求通常可以通过“Ajax Hook”技术来实现。Ajax Hook允许我们捕获并修改...

    谷歌插件学习 监听网络请求

    异步请求,如AJAX(Asynchronous JavaScript and XML),允许网页在不阻塞用户界面的情况下加载数据,提高用户体验。 谷歌浏览器提供了强大的开发者工具,其中的“网络”面板(Network Tab)是监听网络请求的关键...

    jQuery实现监控页面所有ajax请求的方法

    本篇文章将深入探讨如何使用jQuery实现监控页面上所有Ajax请求的方法,这对于调试、性能优化或者集成测试等场景非常有用。 首先,我们需要了解jQuery中的Ajax请求方式,包括`$.ajax`、`$.get`、`$.post`、`$.get...

    JavaScript语言与Ajax应用第二版_JavaScript语言与Ajax应用_JavaScript应用_javascri

    8. **错误处理与调试**:学习如何有效地处理JavaScript和Ajax请求中的错误,以及使用浏览器的开发者工具进行调试,是提升开发效率和代码质量的重要环节。 9. **jQuery与Ajax**:jQuery是一个流行的JavaScript库,...

    Java+servlet+jsp页面ajax请求

    本知识点将深入讲解如何在Java Servlet和JSP页面中实现AJAX请求。 首先,AJAX是一种允许浏览器在不刷新整个页面的情况下与服务器进行数据交换的技术。它通过JavaScript异步地向服务器发送请求,获取数据,然后更新...

    第2节 ajax请求第三方接口天气预报案例.rar

    在天气预报案例中,我们通常会从第三方API获取JSON格式的天气数据,然后使用JavaScript解析并显示在网页上。 5. 天气预报API: 许多第三方提供天气预报API,例如OpenWeatherMap、Weather API等。开发者需要注册...

    ajax请求提示

    1. **JavaScript事件监听**:在用户触发某个操作(如点击按钮)时,JavaScript可以通过监听事件来捕获这一行为,并在事件触发后执行相应的AJAX请求。 2. **AJAX调用**:使用JavaScript的XMLHttpRequest对象或更现代...

    使用JavaScript和Ajax 发出异步请求

    Ajax的核心理念是利用JavaScript进行异步通信,即在后台与服务器交换数据并局部更新页面,而无需重新加载整个网页。这一特性显著提升了网页的响应速度和交互性。 要使用Ajax发出异步请求,我们需要了解...

    Ajax异步请求简单示例

    3. **设置回调函数**:Ajax请求是异步的,所以我们需要设置事件监听器来处理响应。主要有`onreadystatechange`和`ontimeout`等。当状态改变时,`onreadystatechange`会被调用。例如: ```javascript xhr....

    javascript+.net ajax用法

    同时,开发者工具如Chrome的DevTools或Firefox的Developer Edition可以帮助调试AJAX请求。 8. **性能优化**:虽然AJAX提高了用户体验,但也需要注意过度使用可能导致页面负担过重的问题。合理的缓存策略、减少不必...

    GlobalAjaxListener:监听页面全局ajax请求的插件,可以做很多的事情~

    有时候我们的页面很多操作都是ajax,现在我们有个需求,我们想知道到底执行了哪些请求或者请求时候我们想统一加一个请求头。那么我们在不改变代码的情况下该如何实现? 浏览器ajax的对象XMLHttpRequest本身自己就是一...

    Ajax请求验证用户名问题

    在Web开发领域,Ajax(Asynchronous JavaScript and XML)是一种创建动态网页的技术,允许网页部分更新而无需整体刷新页面。在本场景中,标题"Ajax请求验证用户名问题"指的是使用Ajax来实现用户输入用户名时实时检查...

    Ajax请求的五个步骤!!!

    ### Ajax请求的五个步骤详解 #### 一、引言 Ajax技术作为一种强大的前端技术,能够实现局部刷新网页,提升用户体验。本文将详细介绍Ajax的基本概念及其请求的五个关键步骤,并探讨在实际开发过程中可能会遇到的问题...

    挑战JavaScript &amp; Ajax 应用开发

    JavaScript 和 AJAX 是 web 开发中的两个重要概念,它们在创建交互式、动态和实时更新的网页上发挥着关键作用。本书“挑战JavaScript & Ajax 应用开发”显然旨在深入探讨这两个技术,帮助开发者提升他们的技能。 ...

Global site tag (gtag.js) - Google Analytics