Firefox加载项:从选项卡获取文档

Firefox Add-on: get document from a tab

本文关键字:获取 文档 选项 加载项 Firefox      更新时间:2024-05-03

我只是想获取一个选项卡的文档并从中读取信息,但如果我试图读取加载项侧的信息,我会收到一个错误"doc.getElementById不是一个函数"。在内容脚本中,它运行良好。那么,通过self.port传递整个对象有问题吗?

var tabs = require('sdk/tabs');
var myTab;
var myScript = "self.port.on('getDocument', function() {" +
               "  var doc = window.document;" +
               "  console.log(doc.getElementById('lga').style.height);" +
               "  self.port.emit('answer', doc);" +
               "})";
for each (var tab in tabs) {
    if (tab.url == "https://www.google.com/") {
        myTab = tab;
    }
}
worker = myTab.attach({
    contentScript: myScript 
});
worker.port.emit("getDocument");
worker.port.on("answerswer", function(doc) {
  console.log(doc.getElementById('lga').style.height);
});

您只能通过可以序列化为JSON的消息传递值。doc作为文档,无法传递。

在您的消息中,您可以传递样式的实际值:

self.port.emit('answer', doc.getElementById('lga').style.height);

与其尝试将文档导入main.js,不如在data文件夹ContentScript.js中创建一个新的Javascript文件。用contentScriptFile将其注入页面,如下所示:

worker = myTab.attach({
    contentScriptFile: require('sdk/self').data.url('ContentScript.js')
});

同时,在ContentScript.js

var doc = window.document;
//Now have your way with the document

然后,如果您在main.js中需要任何变量,请按照@nmaier所说的操作。

我意识到这可能是显而易见的,但这是预期的行为,这意味着您不必将脚本写成字符串,并提供更详细的日志记录。