我想抓取一个页面,这个页面的HTML内容在时间范围内自动变化。所以我想使用 pageMod 和插件 Sdk 的计时器来获取经常更改的元素 innerHtml。这是我的脚本:
主要.js :
var tag = "container1";
var data = require("sdk/self").data;
var pageMod = require("sdk/page-mod");
var timer = require("sdk/timers");
var i = 0;
function scrapeData()
{
i = i + 1;
console.log("Begin pageMod : " + i);
pageMod.PageMod({
include: "*.test.com",
contentScriptFile: data.url("element-getter.js"),
contentScriptWhen: 'ready',
onAttach: function(worker) {
worker.port.emit("getElements", tag);
worker.port.on("gotElement", function(elementContent) {
console.log(elementContent);
});
}
});
console.log("End pageMod : " + i);
}
timer.setInterval(scrapeData, 10000);
在数据/元素获取器中.js:
self.port.on("getElements", function(tag) {
var elements = document.getElementById(tag);
self.port.emit("gotElement", elements.innerHTML);
});
安装此 Firefox 插件后,当计时器运行时,它只能获取一次 innerHtml,另一次,它只能在控制台日志中显示 Begin pageMod 和 End pageMode。请帮忙。
您目前正在做的是多次附加相同的页面模组。
您应该做的是在内容脚本中移动计时器:
data/element-getter.js:
function scrapeData() {
var elements = document.getElementById(tag);
self.port.emit("gotElement", elements.innerHTML);
}
setInterval(scrapeData, 10000);
如果你真的想把计时器保留在主页上,那么你需要维护一个worker
实例的数组,并循环遍历这个数组来发出你的自定义事件。有关更多详细信息,请参阅此答案。
(PS. 根据您的用例,sdk/frame/hidden-frame
模块可能会感兴趣。