1. 程式人生 > >用javascript監聽頁面上的所有ajax請求

用javascript監聽頁面上的所有ajax請求

最近碰到一個很糾結的技術問題。

我們自己是個Grails,集成了另外一個web程式,我們把那個web程式放在我們提供的iframe裡。那個web程式只有在第一次初始化的時候是一個普通的HTTP請求,之後在頁面上的操作,都是通過ajax來操作的。現在我們有個需求,我們需要知道iframe裡面做了什麼操作。

沒法改別人的程式碼,那我們只能監測裡面的事件了,所以總歸來說,要找到一種方法來檢測到iframe裡面的所有ajax請求。

Javascript框架熟悉的就只有JQuery,所以第一個想到的是用JQuery,看看有沒有提供什麼方法。找到了,JQuery確實提供了監聽ajax的工具方法,如:

$("#msg").ajaxComplete(function(event,request, settings){
   $(this).append("<li>請求完成.</li>");
 });
這個方法會在所有ajax請求完成後被呼叫。

再深入找資料,想知道這個方法的原理,發現,原來JQuery提供的監聽ajax的方法,只對本身就是用JQuery發出去的請求才有效。原理上也就簡單了,在JQuery自己的程式碼裡插入一些控制就實現了。

繼續查資料,終於在stackoverflow找到了答案:用來發送ajax的物件XMLHttpRequest本身自己就是一個javascript物件(IE6除外),javascript物件就一定有prototype屬性,有這個屬性,那我就可以改這個屬性的內容。

prototype屬性是什麼東西,我們這裡沒法詳細描述,簡單描述一下就是:我們可以用這個熟悉來修改物件,給物件新增/修改屬性或者方法

接下來就和javascript實現繼承一樣了,我們要做的就是合理的修改XMLHttpRequest的open,send子類的方法,嵌入我們自己的callback程式碼,即可實現對所有ajax請求的監聽。 

封裝stackoverflow上的程式碼,寫了一個工具類,程式碼如下:

function ajaxSend(objectOfXMLHttpRequest, callback) {
	// http://stackoverflow.com/questions/3596583/javascript-detect-an-ajax-event
	if(!callback){
		return;
	}
	
	var s_ajaxListener = new Object();
	s_ajaxListener.tempOpen = objectOfXMLHttpRequest.prototype.open;
	s_ajaxListener.tempSend = objectOfXMLHttpRequest.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)
		callback(this.method, this.url, this.data);
	}
	
	objectOfXMLHttpRequest.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];
		}
	}
	
	objectOfXMLHttpRequest.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();
	}
}

這個工具方法輸入兩個引數:

第一個引數是要監聽的頁面裡的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,類似這樣:

function onAjaxSend(method, url, data) {
}
第二步:設定iframe的onload屬性為onload="ajaxSend(this.contentWindow.XMLHttpRequest, onAjaxSend);"

完工,不足的地方是不支援IE6,好在我們本身就不要對IE6提供支援,也就這樣過了

參考資料:http://stackoverflow.com/questions/3596583/javascript-detect-an-ajax-event

關鍵字:Javascript,ajax,監聽請求

相關推薦

javascript頁面所有ajax請求

最近碰到一個很糾結的技術問題。 我們自己是個Grails,集成了另外一個web程式,我們把那個web程式放在我們提供的iframe裡。那個web程式只有在第一次初始化的時候是一個普通的HTTP請求,之後在頁面上的操作,都是通過ajax來操作的。現在我們有個需求,我們需要知道

使用JavaScript實現在頁面所有內容加載完之前一直顯示loading...頁面

back pro webkit index tro ear keyframes nload radius Html 1 <body class="is-loading"> 2 <div class="curtain"> 3 <

javascript頁面重新整理和頁面關閉事件方法詳解

在我們的日常生活中,時常遇到這麼一種情況,當我們在點選一個連結、關閉頁面、表單提交時等情況,會提示我們是否確認該操作等資訊。 這裡就給大家講講javascript的onbeforeunload()和onunload()兩個事件。 相同點: 兩者都是在對頁面的關閉或重新整理事件作個操作。

JavaScript、設定全部ajax訪問屬性獲取返回值(狀態碼)

JavaScript監聽、設定全部ajax訪問屬性(requestHeader)獲取返回值(狀態碼) 設定全部ajax訪問屬性 監聽全部ajax返回值(狀態碼) 設定ajax屬性(req

小程式 - 設定一層頁面資料 & 頁面滑動返回一頁

設定上一層頁面資料 在某些場景下,我們需要在A頁面進行表單的簡單編輯,然後跳轉(wx.navigateTo)進入B頁面,進行詳細的表單編輯;在B頁面完成編輯後,返回A頁面,將所有資料進行提交。 這裡需要關注的是,B頁面返回A頁面中,需要攜帶當前頁面的資料,便於在A頁面中使用。 攜帶引數進

javascript如何頁面重新整理和頁面關閉事件

在我們的日常生活中,時常遇到這麼一種情況,當我們在點選一個連結、關閉頁面、表單提交時等情況,會提示我們是否確認該操作等資訊。 這裡就給大家講講javascript的onbeforeunload()和onunload()兩個事件。 相同點: 兩者都是在對頁面的關閉或重新整理

使用ionic開發時遇到手機返回按鈕的問題~

log key gin tlist dex oot als ack location 當時用的是ionic開發一個app,需求是,當按下手機的返回按鈕,在指定的頁面雙擊退出,而在其他頁面點擊一次返回到上個頁面; 其實用ionic自帶的服務就可以解決: //雙擊退出

.NET抓取數據範例 抓取頁面所有的鏈接

object lar url www box 時間 amr 發布 .org 原文發布時間為:2009-11-15 —— 來源於本人的百度文章 [由搬家工具導入].NET抓取数据范例 

JS頁面滾動到底部事件

his div span 頁面 == nbsp scroll win cnblogs 廢話不說,直接上代碼,放心我這個是最好的,直接放到js腳本裏,直接生效: $(window).scroll(function(){ var scrollTo

ionic 頁面滾動,點擊停止滾動

ret 有一個 state start lin 開始 sta 點擊 需要 類似今日頭條,頁面上有很多card,點擊每個card跳轉該card的詳情頁面。這裏有一個問題,當我滾動頁面時,會先後觸發touchstart、touchmove、touchend,但是當touchen

jQuery瀏覽器窗口的變化

blog zoom nth out ccf on() pre query color 1 $(window).resize(function () { //當瀏覽器大小變化時 2 alert($(window).height());

vue 組件 子向父親通信用自定義方法事件

自定義 let 事件監聽 () 有理 mode head con methods <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>Title

JS頁面----無鼠標鍵盤動作,自動跳頁

bsp .proto baidu screen ati event nbsp span onload function ScreenSaver(settings){ this.settings = settings;

jquery頁面滾動條滾動事件

    $(document).scroll(function() {        var scroH = $(document).scrollTop(); //滾動高度 var viewH = $

遍歷頁面所有TextBox控制元件並給它賦值為string.Empty

Using System.Windows.Forms; foreach(Control  control  in  this.Controls) {  //as運算子是把一個型別轉換為另一型別如果不成功返回null    is運算子是

winpacp並分析 FTP 協議並記錄 IP、使用者名稱、密碼和登陸是否成功

為了完成計算機網路的實驗,翻了一些部落格,有的沒原始碼,有的記錄不全。就很煩。所以自己寫一篇吧。 首先我們通過wireshark看看FTP的登陸是怎麼完成的。 (1)選一個當前在用的網路,我是WLAN (2)選擇TCP過濾器方便找到FTP的包(沒有過濾FTP的,最多隻能過濾出TCP)

JQ頁面滾動 下拉到底事件

1、監聽整個demo的滾動 <script> $(function(){ $(window).scroll(function() { var scrollTop = $(this).scrollTop(); var scrollHeight

ionic 頁面滾動,點選停止滾動

原文出處:https://www.cnblogs.com/lee-xiumei/p/7449021.html 類似今日頭條,頁面上有很多card,點選每個card跳轉該card的詳情頁面。這裡有一個問題,當我滾動頁面時,會先後觸發touchstart、touchmove、touchend,但是當

jQuery監控頁面所有ajax請求的方法

jQuery實現監控頁面所有ajax請求的方法 本文例項講述了jQuery實現監控頁面所有ajax請求的方法。分享給大家供大家參考,具體如下: 你是不是有遇到這樣的問題:頁面發起兩個ajax請求,希望它們都成功以後,再做一個動作? 很容易想到的解決方案是,等其中

[Swift通天遁地]三、手勢與圖表-(1)螢幕觸控事件的各種狀態

本文將演示監聽螢幕上觸控事件的各種狀態。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 現在開始編寫程式碼,監聽螢幕上的觸控事件的各種狀態。 1 import UIKit 2 3 class ViewController: UIViewContr