- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有办法替换完整的 HTML,并使用 mozilla addon SDK 添加额外的 javascript 文件?
对于 chrome,可以通过在“document_start”处运行脚本、停止窗口并用 XHR 响应替换完整的 HTML 来完成。我不明白为什么这么复杂,但我可以忍受。据我了解,addon SDK 有一个 page-mod 模块,该模块是关于“在 URL 与给定模式匹配的网页上下文中运行脚本”。所以理论上这应该通过 page-mod 模块来完成,但我没有找到任何完全覆盖整个 HTML 的示例。理论上,window.stop 和替换完整的 HTML 也应该在这里工作,但我无法从网页(前端)的上下文访问插件(后端)文件。对于 chrome,这是通过 list 中的“web_accessible_resources”和 chrome.extension.getURL 完成的。通过 firefox,我无法通过前端使用与插件 SDK 相关的任何内容,因此 self.data.url 不起作用...
最佳答案
我尝试以这种方式发送文件内容(因为前端的 Firefox 拒绝了插件文件访问):
index.js
var pageMod = require("sdk/page-mod");
var data = require("sdk/self").data;
pageMod.PageMod({
include: ["http://example.com/", "http://example.com/index.html"],
contentScriptFile: "./inject.js",
contentScriptWhen: "start",
onAttach: function (worker){
console.log("injector attached");
worker.port.emit("inject", {
"index.html": data.load("client/index.html"),
"main.js": data.load("client/main.js")
});
}
});
注入(inject).js
!function () {
self.port.on("inject", function (files) {
console.log("injector trigger");
if (typeof hasRun == 'undefined') {
console.log("injecting");
hasRun = true;
window.stop();
var html = files["index.html"].replace("<script src=\"./main.js\"></script>", "<script>"+files["main.js"]+"</script>");
document.documentElement.innerHTML = html;
}
});
}();
如果我用 hello world 替换 HTML,那么它就可以工作。因此 HTML 似乎无效,但我没有收到错误消息,并且控制台显示一个空的 HTML 骨架(我得到一个空页面)。相同的index.html和main.js代码通过chrome插件工作,我想在firefox中使用它。 Chrome 插件唯一额外的事情是,某些 js 文件被取消,因此在停止窗口之前它们肯定不会加载。我尝试做同样的事情,但也许没有成功,我不知道。
index.js
let { Ci, Cu } = require('chrome');
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
var observer = {
QueryInterface: XPCOMUtils.generateQI([
Ci.nsIObserver,
Ci.nsISupportsWeakReference
]),
observe: function (subject, topic, data) {
if (topic == "http-on-opening-request" &&
subject instanceof Ci.nsIHttpChannel) {
var uri = subject.URI;
if (uri.host == "example.com" && /some\.js/.test(uri.path))
subject.cancel();
}
}
};
Services.obs.addObserver(observer, "http-on-opening-request", true);
subject.cancel() 由 some.js 文件运行。如果我添加日志记录:
console.log("cancelling", uri.path);
subject.cancel();
console.log("cancelled");
然后控制台中不会出现“已取消”,只会出现“正在取消,/some.js”。我不知道这是否正常,但我没有收到错误消息。
通过常规 HTML 网页尝试此操作
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
//<![CDATA[
!function (){
window.stop();
var html = '<!DOCTYPE html>\n<html>\n<head>\n <meta charset="utf-8">\n</head>\n<body>\n <script>console.log("loaded");</script>\ntext\n</body>\n</html>';
document.documentElement.innerHTML = html;
}();
//]]>
</script>
</body>
</html>
我遇到了一个未终止的字符串文字语法错误,这更有趣。我想如果注入(inject)器代码包含 javascript,它就无法正常工作,所以我认为这不是一个与插件相关的问题。如果我使用 <\/script>
那么就可以了,但是console.log("loaded");
脚本不运行。通过chrome它确实可以运行,所以这就是我认为的问题。
我将 jquery 添加到“contentScriptFile”并使用 $("html").html(html)
相反 document.documentElement.innerHTML = html
。它现在运行脚本,但仍然无法正常工作。
通过 cancel() 添加了一些修复:
let { Ci, Cu, Cr } = require('chrome');
//...
subject.cancel(Cr.NS_BINDING_ABORTED);
cancel 似乎有一个必需的状态参数,但当它没有获取它时,它会默默地失败。现在取消文件也可以了,但插件仍然在某个地方失败。 :S
我认为我编写的注入(inject)器工作得很好,问题出在注入(inject)的 HTML 和 js 文件上。我不打算调试它们(因为 $.load 使用 eval,所以这会很困难),我将代码发送给 chrome 插件开发人员,也许他们可以以某种方式修复它。
关于javascript - 用 mozilla addon SDK 替换完整的 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30931703/
有没有人能够构建静态链接的 NSS?我实际上只需要构建静态链接的 certutil 和 pk12util。我已经看到 Chromium 正在静态构建 NSS,他们甚至有一个补丁文件,但整个构建过程非常
我正在尝试使用下面的 css 和 html 代码在弹出窗口的底部应用空间,因为我只有 mozilla 浏览器有问题,我在弹出窗口的末尾没有获得空间。下面是我的代码我已经使用过,但我需要减少 chrom
我使用下面的行,这样当我单击“新建”按钮时,它将清空所有字段。使用 onClick="history.go(0)"在 IE 中有效,但在 Mozilla 中失败。 最佳答案 要清空所有字段,请使
我尝试在一个简单的 A-Frame WebVR 应用程序上禁用检查器,但没有成功。 尝试使用 JavaScript 来使用并禁用按键 Ctrl + Alt + I。但是,Inspector 仍在加载。
我正在做一个项目,现在正在测试中。需要使网站与所有现代兼容,并至少使它们与每个主要浏览器的 2 个旧版本兼容。 为此,我在 IE 中使用了 IE F12 工具,以切换到 IE 9、8、7 View 。
我在项目中将gulp与autoprefixer一起使用,并且必须像这样使用背景渐变: background: linear-gradient(#e98a00, #f5aa2f); 但输出是: back
如果我想限制电子邮件地址访问网站,使用 Persona 有哪些优势?我必须以相同的方式管理我服务器上的授权电子邮件地址吗?缺少什么? 最佳答案 在您的网站上使用 Persona 的两个主要优点是: 您
Thunderbird的过滤机制非常适合简单的事情。 但我想做类似的事情 (如果邮件包含xy或发件人为yz)并且状态已读取,请移至回收站 问题是,一个过滤器规则只能匹配任何(= OR)或所有(= AN
有一个奇怪的 webVR Mozilla A-Frame 问题 所以我在 a-curvedimage 标签中加载图像(里面有一些动画内容),如下所示: 我正在检查 chrome 中的网络
我觉得其中缺少了一些东西。这是: 嵌套函数和闭包 您可以在函数中嵌套函数。嵌套(内部)函数对其包含(外部)函数是私有(private)的。它还形成了一个封闭。闭包是一个表达式(通常是一个函数),它可以
JS BIN Attempt 尝试按照示例进行操作,但似乎不起作用。有点困惑,因为它是 Mozilla。 Mozilla 最佳答案 正如 @Xaerxess 提到的,当 DOM 准备好进行操作时,您需
我需要制作一个可以在每个页面和浏览器上运行的按钮,可以从文本区域复制输入。我正在尝试使用以下函数来做到这一点: selectElementContents: function(){ el
我需要一个粘性栏在一定的滚动后可见并固定。我打算使用滚动事件,然后我遇到了 Mozilla 页面,该页面建议使用 window.requestAnimationFrame 如下: var last_k
我希望我的元素具有多种颜色的清晰背景渐变。在 Chrome 上运行良好,但在 Firefox 上过渡时边缘模糊。 这里有一些例子: 火狐: Chrome : 如何让它在 Firefox 上运行? .f
为什么这是Webkit用户代理: Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.27+ (KHTML, like Gecko) Version
我正在尝试使用 JavaScript 创建一个游戏,但在此过程中我发现了 Firefox 中的一个错误。游戏很简单。您应该猜测 RGB 十六进制代码中的颜色是什么。有6个框,您应该单击该框,如果错误或
我在 Mozilla 和 Chrome 中都有一个扩展,在我的扩展中我调用了一个远程 JS 文件。 为了避免 Chrome 中的 CSP,我将规则添加到 manifest.json 并且我的文件通过
我找到了一种将我的 Chrome 扩展程序转换为模块的便捷方法(更易于维护等)。我是这样做的https://stackoverflow.com/a/53033388/9182284 (把backgro
我有以下代码来设置选择框的样式,它在 chrome 中完美运行,但在 mozilla fire fox 27.0 中运行不正常 .select-box { line-height: inhe
我没有询问变换原点。我问为什么动画在 mozilla 上不起作用 我一直在 Mozilla 上做一些动画 svg。我在 Chrome 中尝试过的动画效果非常好,但是当我在 mozilla 上测试时效果
我是一名优秀的程序员,十分优秀!