Firefox附加pageMod,捕获在contentScriptFile中完成的ajax

我的问题是我需要知道AJAX何时在页面上完成。 我需要在我通过pageMod加载的contentScriptFile中知道这一点。 我的添加需要在每次修改页面时运行:所以基本上当它加载时以及每次有一个AJAX调用时。

我试过这个:

$(document).ajaxComplete(function() { alert("AJAX call completed"); }); 

但它不起作用。

有没有办法做到这一点?

编辑:我的页面来自main.js的mod代码:

 pageMod.PageMod({ include: "*", contentScriptFile: [self.data.url("jquery-1.9.1.min.js"), self.data.url("script.js")], onAttach: function(worker){ var apiKey = require("sdk/simple-prefs").prefs.apiKey; var ignoreList = require("sdk/simple-prefs").prefs.ignoreList; worker.port.emit("prefSet", [ignoreList, apiKey]); } }); 

把它放在内容脚本中:我不确定如何识别脚本的内容窗口。 我不太了解sdk。 但请参阅CONTENT_WINDOW_OF_CONTENT_SCRIPT区域

 const { Ci, Cu, Cc, Cr } = require('chrome'); //const {interfaces: Ci, utils: Cu, classes: Cc, results: Cr } = Components; Cu.import('resource://gre/modules/Services.jsm'); Cu.import('resource://gre/modules/devtools/Console.jsm'); var observers = { 'http-on-modify-request': { observe: function (aSubject, aTopic, aData) { console.info('http-on-modify-request: aSubject = ' + aSubject + ' | aTopic = ' + aTopic + ' | aData = ' + aData); var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel); var requestUrl = httpChannel.URI.spec var goodies = loadContextAndGoodies(aSubject, true); if (goodies.contentWindow) { if (goodies.contentWindow == CONTENT_WINDOW_OF_CONTENT_SCRIPT) { //do something here } } }, reg: function () { Services.obs.addObserver(observers['http-on-modify-request'], 'http-on-modify-request', false); }, unreg: function () { Services.obs.removeObserver(observers['http-on-modify-request'], 'http-on-modify-request'); } } }; 

然后在同一范围内添加此辅助函数:

 function loadContextAndGoodies(request, return_goodies) { var loadContext = null; if (request instanceof Ci.nsIRequest) { try { if (request.loadGroup && request.loadGroup.notificationCallbacks) { loadContext = request.loadGroup.notificationCallbacks.getInterface(Ci.nsILoadContext); } } catch (ex) { console.exception('request loadGroup with notificationCallbacks but oculd not get nsIloadContext', ex); } if (!loadContext) { try { if (request.notificationCallbacks) { loadContext = request.notificationCallbacks.getInterface(Ci.nsILoadContext); } } catch (ex) { console.exception('request has notificationCallbacks but could not get nsILoadContext', ex); /* start - noit's backup try, it might be redundant (im not sure) as Wladamir Palant didn't have this way*/ try { var interfaceRequestor = httpChannel.notificationCallbacks.QueryInterface(Ci.nsIInterfaceRequestor); loadContext = interfaceRequestor.getInterface(Ci.nsILoadContext); } catch (ex) { console.exception('backup method failed:' ex); } /* end - my backup try, it might be redundant as Wladamir Palant didn't have this way*/ } } } else { console.warn('request argument is not instance of nsIRequest') } if (return_goodies) { if (!loadContext) { return null; } var contentWindow = loadContext.associatedWindow; var DOMWindow = contentWindow.top.QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIWebNavigation) .QueryInterface(Ci.nsIDocShellTreeItem) .rootTreeItem .QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIDOMWindow); var gBrowser = DOMWindow.gBrowser; if (gBrowser) { var tab = gBrowser._getTabForContentWindow(contentWindow.top); var browser = tab.linkedBrowser; } else { var tab, browser = null; } var goodies = { loadContext: loadContext, DOMWindow: DOMWindow, gBrowser: gBrowser, contentWindow: contentWindow, browser: browser, tab: tab }; return goodies; } else { return loadContext; } } 

开始观察

要开始观察所有请求,请执行此操作(例如,在启动插件时)

 for (var o in observers) { observers[o].reg(); } 

停止观察

停止观察是很重要的(确保至少在关闭插件时运行它,你不想让观察者因为内存原因而注册)

 for (var o in observers) { observers[o].unreg(); }