gpt4 book ai didi

javascript - Firefox 附加组件 pageMod,捕获 contentScriptFile 中完成的 ajax

转载 作者:行者123 更新时间:2023-11-30 12:38:54 25 4
gpt4 key购买 nike

我的问题是我需要知道 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();
}

关于javascript - Firefox 附加组件 pageMod,捕获 contentScriptFile 中完成的 ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25193409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com