我正在开发一个简单的字典插件,允许用户突出显示一个单词(通过双击它),这将导致弹出窗口显示单词的字典定义。
我无法动态更改我正在使用的页面工作者的ContentURL,以便我可以访问其DOM并从中删除定义。 我已尝试动态更改单个页面工作程序的URL,以及每次选择新单词时创建页面工作程序,将信息发送到插件,然后销毁页面工作程序。
这是我的代码(第二个想法):
define.js:
$(window).dblclick(function() {
var selected = getSelected();
if (selected!="") {
calldictionary(selected);
var completedURL = "http://www.dictionary.com/browse/" + selected;
$('#define').dialog("open");
createPageWorker(completedURL);
}
});
function getSelected() {
if (window.getSelection) {
return window.getSelection().toString();
} else if (document.selection) {
return document.selection.createRange().text;
}
return '';
}
definitionsender.js:
var sendInformation = "var elements = document.querySelectorAll('div.def-set > div'); " +
"for (var i = 0; i < elements.length; i++) {" +
" postMessage(elements[i].textContent) " +
"}" +
"self.destroy();";
function createPageWorker(URL){
dictionaryReference.Page({
contentScriptWhen: "ready",
contentScriptFile: [
data.url("jquery.js"),
data.url("jquery-ui.min.js"),
data.url("define.js"),
data.url("definitionsender.js")
],
contentURL: URL,
contentScript: sendInformation,
onMessage: "function(message){"+
"console.log(message);}"
});
}
如果我使用的是我的第一个想法,那么
createPageWorker(completedURL);
将替换为
行dictionaryReference.contentURL = completedURL;
到页面工作者&#34; dictionaryReference&#34;包含在我的index.js文件中。
请不要简单地发布指向MDN的链接;我已经阅读了所有相关文档,并没有给我很多指导。
答案 0 :(得分:1)
来自https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts(原谅我发布MDN文档;-)):
- 附加组件的主要代码,包括&#34; main.js&#34; &#34; lib&#34;中的其他模块,可以使用SDK高级和低级API ,但不能 直接访问网页内容
- 内容脚本无法使用SDK的API (无法访问全局导出,需要)但可以访问网络内容
好像您正试图从createPageWorker()
访问define.js
,这似乎是一个内容脚本。关注点分离是禁止的。沟通的方式是使用像
self.port.emit("createPageWorker", URL);
在内容脚本中,并通过
收听该消息self.port.on("createPageWorker", function(URL) {
// do something here
);
在附加代码(index.js
或其他)中。