9

我正在为演示目的创建一个 Firefox 扩展。我从扩展中调用文档中的特定 JavaScript 函数。我在我的 HTML 文档中写了这个(不是在扩展中,而是由 Firefox 加载的页面):

document.funcToBeCalled = function() {
   // function body
};

然后,扩展程序将在某些事件上运行它:

var document = Application.activeWindow.activeTab.document;
document.funcToBeCalled();

但是,它会引发一个错误,指出funcToBeCalled未定义。

注意:我可以通过调用来获取文档上的元素document.getElementById(id);

4

5 回答 5

8

出于安全原因,您对扩展程序的内容页面的访问受到限制。请参阅XPCNativeWrapperSafely access content DOM from chrome

如果您控制页面,最好的方法是在页面中设置一个事件监听器并从您的扩展中调度一个事件(页面中的 addEventListener,扩展中的 dispatchEvent)。

否则,请参阅http://groups.google.com/group/mozilla.dev.extensions/msg/bdf1de5fb305d365

于 2008-10-03T18:20:10.277 回答
6
document.wrappedJSObject.funcToBeCalled();

这是不安全的,并且允许恶意页面将其权限提升到您的扩展程序的权限......但是,它确实按照您的要求进行。阅读早期的greasemonkey 漏洞,了解为什么这是一个坏主意。

于 2010-03-26T18:39:38.697 回答
2

我有一个非常简单的方法来做到这一点。假设您必须调用写在页面上的 xyz() 函数。你必须从你的插件中调用它。

创建一个按钮(“使其不可见。这样它就不会干扰您的页面”)。onclick 该按钮调用此 xyz() 函数。

<input type="button" id="testbutton" onclick="xyz()" />

现在在插件中你有一个页面的文档对象。假设它的 mainDoc

在你想调用 xyz() 的地方,只需执行这一行

mainDoc.getElementById('testbutton').click();

它将调用 xyz() 函数。

祝你好运 :)

于 2010-05-24T09:53:51.273 回答
0

您可以这样做,但您需要控制页面并能够提高脚本的权限级别。Mozilla 文档给出了一个例子——在页面上搜索“Privilege”。

于 2008-09-30T04:44:38.810 回答
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;
}
于 2020-02-13T04:46:28.283 回答