我正在尝试创建一个简单的Firefox插件来预取一些网页。我想使用Firefox的链接标记进行预取,因为这似乎是最简单的方法。这是我的代码:
main.js:
exports.main = function() {
var commentFinder = pageMod.PageMod({
include: "*",
contentScriptFile: data.url("prefetch.js"),
attachTo: ["top"],
onAttach: function(worker) {
worker.port.emit("init");
}
});
}
prefetch.js:
var start = '<link rel="prefetch" href="';
var end = '">'
var links = [];
var aTags = document.body.getElementsByTagName("a")
for(var i=0; i<aTags.length; i++){
var href = aTags[i].getAttribute("href");
if(links.indexOf(href) == -1)
links.push(href);
}
for(var i=0;i<links.length;i++){
console.log(links[i]);
var tag = start + String(links[i]) + end;
document.head.innerHTML = tag + document.head.innerHTML;
}
当我在我请求的页面的HTML中包含链接标记时,它们会被预取,但是当我使用附加组件添加链接标记时,它们就不会被删除。我认为问题可能出在Firefox检查链接标签时,但我不确定。有没有办法测试/解决这个问题?
答案 0 :(得分:2)
我查看了代码,看来<link rel="prefetch">
元素仅在解析器仍处于活动状态时才会处理(请参阅ProcessLink
(hg)的调用图)。因此,当在网站中使用内联脚本但不使用常规page-mod
时,它可以正常工作。
您可以尝试更早地附加脚本,即将contentScriptWhen: "start"
添加到您的page-mod选项中。但是你应该知道,在这一点上,DOM中只有文档元素,但没有别的,所以你需要让你的脚本等待其他节点......
另一种选择是,您可以使用nsIPrefetchService
代替创建<link>
元素,方法是将内容脚本消息传递给main.js
的链接/引荐列表,然后通过require("chrome")
调用该服务。
除此之外:从带宽和性能角度无条件预取所有链接可能不是最佳选择。
另外:并非所有链接都是可预取的(mailto:
等)。