编辑3:找到解决方案/修复
这是为我解决的SO线程:PageMod attaching worker to same URL multiple times
TLDR:如果页面包含iFrame,它会将一个worker / content脚本附加到它,这会导致多个内容脚本尝试运行。使用attachTo: 'top'
仅将脚本附加到顶级文档而不附加iFrame。
我正在努力移植我制作的简单Chrome扩展程序,而且我很难为Firefox插件传递消息。这就是我所拥有的。
csScript.js
self.port.emit("url", getVideoUrl());
function getVideoUrl() {
return $('meta[itemprop=contentURL]').prop('content');
}
main.js
pageMod.PageMod({
include: [URLs],
exclude: [URLs],
contentScriptFile: [data.url("jquery-2.1.1.min.js"),
data.url("csScript.js")],
onAttach: function(worker) {
worker.port.on("url", function(url) {
var videoUrl = validateUrl(url);
});
}
});
当某个网址被点击时,我想获取一个属性值并将其发送回我的main.js并使用它。由于它现在有效,我收到message is null
错误。我已经阅读了文档,但似乎无法理解如何传递消息。
修改:将onAttach
更改为:
onAttach: function(worker) {
worker.port.on("url", function(url) {
var videoUrl = validateUrl(url);
});
}
});
似乎没什么变化。我需要做的就是将内容脚本中的一个字符串传递回我的main.js
文件。但是,根据上面的代码,它告诉我url
是null
。我查看的所有文档似乎表明这是Firefox插件中消息传递的工作方式。
Edit2:添加一些日志语句后,我注意到了几件事:
1)匹配URL时,我的内容脚本运行10次以上。我不知道原因。 脚本附加到每个iFrame。
2)大多数时候,URL返回null / undefined。但是,它可以正常工作一次 - 从内容脚本中提取URL,然后将其正确传递回 main.js
文件。然而,它会被再次运行的内容脚本迅速消灭。
答案 0 :(得分:2)
首先确保getVideoUrl()
正在返回一个字符串,我猜测
$('meta[itemprop=contentURL]').prop('content')
在您获得message is null
的情况下,不会返回字符串。
你也有:
onAttach: function(worker) {
worker.port.on("url", function(message) {
var videoUrl = validateUrl(message.url);
videoUrl5k = make5kUrl(videoUrl);
});
}
我改为:
onAttach: function(worker) {
worker.port.on("url", function(url) {
var videoUrl = validateUrl(url);
videoUrl5k = make5kUrl(videoUrl);
});
}
也许这解决了这个问题?因为我没有看到make5kUrl
答案 1 :(得分:0)
在pageMod
构造函数中,使用attachTo: 'top'
选项会将脚本仅附加到顶级文档。内容脚本已附加到其他iFrame,然后尝试运行。