在新标签页中打开页面上的所有链接并跟踪这些标签

时间:2015-04-18 15:04:10

标签: javascript firefox-addon firefox-addon-sdk

我知道我无法使用SDK在firefox插件中从main函数直接访问DOM,因此我也无法直接从a标签中获取href值。如何让我的插件打开页面上的所有链接作为新选项卡并将其添加到阵列?我不想要跟踪用户手动打开的新标签,只需要跟踪该插件创建的标签。

1 个答案:

答案 0 :(得分:1)

暂时解决了这个问题所以我想我会指出我所知道的。

由于主脚本无法访问DOM本身,因此可以将工作者附加到当前选项卡。工作人员可以读取所有链接并将其存储为列表,然后将该列表发送回加载项。然后,加载项可以打开针对该列表中所有链接的新选项卡。

在main中,将内容脚本添加到选项卡:

function attachScript() {
  var worker = tabs.activeTab.attach({
    contentScriptFile: self.data.url("content-script.js")
  });
  worker.port.on("links", function(links) {
    for each(var l in links) {
        tabs.open(l);
    }
  }); // Start listening for links sent by the tab's worker
  worker.port.emit("get-links"); // Request links from worker
}

在内容脚本中,收到get-links消息后,读取所有链接并使用端口将其发回:

self.port.on("get-links", handleMessage); // Start listening for requests for links on page

function handleMessage(message) {
  var anchors = document.getElementsByTagName("a"); // Get all a elements on page
  alert(anchors.length); // Report quantity of a elements found
  var hrefs = [];
  for each (var a in anchors) {
    hrefs.push(a.href); // Add all target urls of a elements to array
  }
  self.port.emit("links", hrefs); // Send array of urls to add-on script
}

至于跟踪标签,我想保留一份工人清单是实现这一目标的合适方式。我还没试过那个部分,因为我不得不放下这个项目一段时间。