- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是我需要知道 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/
我目前正在制作一个 Firefox 扩展,但是当我浏览到特定网址时,我无法运行该功能。 在我的 chrome.manifest 中,我有 overlay chrome://browser/conten
我在开发扩展时遇到了这个问题。我根据选项卡就绪事件将 pageMod 附加到页面以修改页面的内容,但是当我重新加载页面时,工作人员似乎又附加了一次,因此在 1 次重新加载后,它会为同一网址加载 2 个
我有一个 SDK 扩展,可以在页面上注入(inject)脚本。在插件选项中有 1 个 bool 用于打开或关闭该脚本。 var pageMod = require("sdk/page-mod"); v
是否可以使用间隔更新它?我试过: var timers = require("timers"); var pageMod = require("page-mod"); var mystyle = ..
我正在尝试在我的 Firefox 扩展中动态创建一个全局函数: window.performAction= function() { ... }; 我现在知道窗口是由 XrayWrapper 问题包裹
我尝试在页面上注入(inject)内容脚本并使用 console.log("starting addon"); pageMod.PageMod({ include: "*",//tempopa
我正在开发用户脚本的 Firefox Addon 版本。使用 page-mod 库,插件语法非常简单。例如: var data = require("self").data; var pageMod
我正在使用addon-sdk。我有一个小部件,单击该小部件后我想对网站执行一些操作(无论是修改页面还是读取深层 DOM)。 这是我读完后的想法https://developer.mozilla.org
我正在开发用户脚本的 Firefox Addon 版本。使用 page-mod 库,插件语法非常简单。例如: var data = require("self").data; var pageMod
我正在使用 toolbar button 制作一个 Firefox 插件由 Erik Vold 编写,我想知道当用户按下工具栏中的按钮时如何启动和停止 pageMod。那有可能吗?我尝试使用此方法注入
我正在使用 Firefox Add-on SDK 将 Chrome 扩展移植到 Firefox。 扩展包含一个连接到 toolbar button 的面板。 (相当于 Chrome 的 popup.h
找到干净的解决方案 我找到了一个非常干净的解决方案,它确实使整个问题变得毫无意义,而且当我问这个问题时我确信它存在......我太无知了,也去寻找它。 在 PageMod 构造函数中使用 attach
我正在尝试使用 pageMod 将图像.prepend()添加到每个谷歌搜索结果链接中。它适用于第一个结果页面,但在加载其他页面或编辑搜索词时效果不佳。这是因为我的脚本是在页面末尾加载的,动态内容更改
我无法在我的插件和附加脚本之间进行通信。 PageMod 的附加事件有效,但它不会将我的 getElements 事件发送到我的列表 getter 。如何正确使用port.emit方法?谢谢! ind
我正在开发一个 Firefox 扩展项目,该项目要求我使用 TAB 键切换页面上的所有链接、提取其 URL、获取其源代码并解析它。 目前,我可以使用 TAB 键通过以下方式切换页面以获取其 URL:
我正在构建一个与 youtube 网站交互的小型插件。为了在页面内注入(inject)自定义脚本,我使用方便的 page-mod像这样: var pageMod = require("sdk/page
我正在尝试基于 page-mod 创建新的 Firefox 扩展我使用了执行js文件的代码 var pageMod = require('sdk/page-mod'); var data = re
我在尝试从 Firefox 插件上下文覆盖 XMLHttpRequest 时遇到了一些麻烦。 我想重写此函数的原因是我想知道何时发出某个请求以触发我的事件之一。 我当前使用的main.js: pa
我在 main.js 中使用以下代码将内容脚本添加到 example.com 上的页面: var self = require("sdk/self"); var pageMod = require("
我正在使用 FF 44.0a2 Developer Edition 和 Firefox Addon SDK 制作 Firefox 插件。我使用 pageMod 内容脚本将 AngularJS 应用程序
我是一名优秀的程序员,十分优秀!