我正在开发一个Firefox插件。我想要做的是注入自定义JavaScript函数。
即
function foo() {..}
所以所有页面都可以调用 foo 而不先定义它。
我从其他答案中看到:http://groups.google.com/group/greasemonkey-users/browse_thread/thread/3d82a2e7322c3fce
但它需要在网页上进行修改。如果我想将功能 foo 注入Google.com怎么办?是否可以这样做?
我可以使用用户脚本来完成,但是如果可能的话我想使用扩展方法。
答案 0 :(得分:6)
我在阅读你的问题时首先想到的是“这看起来像一个骗局”。你想要实现什么目标?
无论如何,这里是a Jetpack (Add-on builder) add-on that injects a script in every page loaded:
<强> main.js:强>
const self = require("self"),
page_mod = require("page-mod");
exports.main = function() {
page_mod.PageMod({
include: "*",
contentScriptWhen: "ready",
contentScriptFile: self.data.url("inject.js")
});
};
<强> inject.js:强>
unsafeWindow.foo = function() {
alert('hi');
}
unsafeWindow.foo();
答案 1 :(得分:1)
如果您在页面上使用javascript函数进行简单的href,该怎么办?
像书签一样工作。
以下是示例代码:
function(scriptUrl) {
var newScript = document.createElement('script');
// the Math.random() part is for avoiding the cache
newScript.src = scriptUrl + '?dummy=' + Math.random();
// append the new script to the dom
document.body.appendChild(newScript);
// execute your newly available function
window.foo();
}('[url of your online script]')
要使用它,请输入脚本的URL。
它必须只有一行代码,url格式化,但为了代码可读性,我已经形成了它。
我从来没有开发过Firefox扩展,但是对于javascript注入,这就是我要滚动的方式。
希望它有所帮助。
答案 2 :(得分:1)
您可以使用Sandbox
// Define DOMContentLoaded event listener in the overlay.js
document.getElementById("appcontent").addEventListener("DOMContentLoaded", function(evt) {
if (!evt.originalTarget instanceof HTMLDocument) {
return;
}
var view = evt.originalTarget.defaultView;
if (!view) {
return;
}
var sandbox = new Components.utils.Sandbox(view);
sandbox.unsafeWindow = view.window.wrappedJSObject;
sandbox.window = view.window;
sandbox.document = sandbox.window.document;
sandbox.__proto__ = sandbox.window;
// Eval your JS in the sandbox
Components.utils.evalInSandbox("function foo() {..}", sandbox);
}, false);