我正在为演示目的创建Firefox扩展。 我从扩展名调用文档中的特定JavaScript函数。 我在我的HTML文档中写了这个(不在扩展名内,而是由Firefox加载的页面):
document.funcToBeCalled = function() {
// function body
};
然后,扩展程序将在某个事件上运行:
var document = Application.activeWindow.activeTab.document;
document.funcToBeCalled();
然而,它引发了一个错误,指出funcToBeCalled
未定义。
注意:我可以通过调用document.getElementById(id);
答案 0 :(得分:8)
出于安全原因,您对扩展程序中的内容页面的访问权限有限。请参阅XPCNativeWrapper和Safely accessing content DOM from chrome,
如果你控制页面,最好的方法是在页面中设置一个事件监听器,并从你的扩展中派遣一个事件(页面中的addEventListener,扩展中的dispatchEvent)。
否则,请参阅http://groups.google.com/group/mozilla.dev.extensions/msg/bdf1de5fb305d365
答案 1 :(得分:6)
document.wrappedJSObject.funcToBeCalled();
不安全并允许恶意网页将其权限提升为您的扩展程序的权限......但是,它确实按照您的要求执行操作。阅读早期greasemonkey vulnerabilities,了解为什么这是一个坏主意。
答案 2 :(得分:1)
我有一个非常简单的方法。 假设你必须调用页面上写的xyz()函数。你必须从你的插件中调用它。
创建一个按钮(“让它不可见。所以它不会打扰你的页面”)。在该按钮的onclick上调用此xyz()函数。
<input type="button" id="testbutton" onclick="xyz()" />
现在在插件中你有一个页面的文档对象。假设它的mainDoc
你要调用xyz(),只需执行此行
mainDoc.getElementById('testbutton').click();
它将调用xyz()函数。
祝你好运:)答案 3 :(得分:0)
您可以这样做,但您需要控制页面并能够提高脚本的权限级别。 Mozilla Documentation gives an example - 在页面上搜索“权限”。
答案 4 :(得分:0)
var pattern = "the url you want to block";
function onExecuted(result) {
console.log(`We made it`);
}
function onError(error) {
console.log(`Error: ${error}`);
}
function redirect(requestDetails) {
var callbackName = 'callbackFunction'; //a function in content js
var data = getDictForkey('a url');
var funcStr = callbackName + '(' + data + ')';
const scriptStr = 'var header = document.createElement(\'button\');\n' +
' header.setAttribute(\'onclick\',\'' + funcStr + '\');' +
' var t=document.createTextNode(\'\');\n' +
' header.appendChild(t);\n' +
' document.body.appendChild(header);' +
' header.style.visibility="hidden";' +
' header.click();';
const executing = browser.tabs.executeScript({
code: scriptStr
});
executing.then(onExecuted, onError);
return {
cancel: true
}
}
chrome.webRequest.onBeforeRequest.addListener(
redirect,
{urls: [pattern]},
["blocking"]
);
function getDictForkey(url) {
xxxx
return xxxx;
}