如何获取动态元素 HTML 使用带有计时器的插件 SDK



我想抓取一个页面,这个页面的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模块可能会感兴趣。

最新更新