我只是试图获取选项卡的文档并从中读取信息,但如果我尝试读取Add-on端的信息,我会收到错误“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("answer", function(doc) {
console.log(doc.getElementById('lga').style.height);
});
答案 0 :(得分:2)
您只能通过可以序列化为JSON的消息传递值。作为文件的doc
无法通过。
在您的消息中,您可以传递样式的实际值:
self.port.emit('answer', doc.getElementById('lga').style.height);
答案 1 :(得分:1)
不要尝试将文档导入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所说的。
我意识到这可能是显而易见的,但这是预期的行为,这意味着您不必将脚本编写为字符串并提供更详细的日志记录。