我的问题是我需要知道何时在页面上完成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
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(); }