用javascript監聽頁面上的所有ajax請求
最近碰到一個很糾結的技術問題。
我們自己是個Grails,集成了另外一個web程式,我們把那個web程式放在我們提供的iframe裡。那個web程式只有在第一次初始化的時候是一個普通的HTTP請求,之後在頁面上的操作,都是通過ajax來操作的。現在我們有個需求,我們需要知道iframe裡面做了什麼操作。
沒法改別人的程式碼,那我們只能監測裡面的事件了,所以總歸來說,要找到一種方法來檢測到iframe裡面的所有ajax請求。
Javascript框架熟悉的就只有JQuery,所以第一個想到的是用JQuery,看看有沒有提供什麼方法。找到了,JQuery確實提供了監聽ajax的工具方法,如:
這個方法會在所有ajax請求完成後被呼叫。$("#msg").ajaxComplete(function(event,request, settings){ $(this).append("<li>請求完成.</li>"); });
再深入找資料,想知道這個方法的原理,發現,原來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