使Pagemod和Page-worker模块一起工作?

时间:2011-03-08 20:13:47

标签: javascript dom firefox-addon pagemethods

我正在开发一个Firefox扩展项目,要求我使用TAB键切换页面上的所有链接,提取其URL,获取其源代码并解析它。

目前,我可以使用TAB键切换页面以通过以下方式获取其URL:

exports.main = function() {};
var pageMod = require("page-mod");

pageMod.PageMod({
  include: "*.org",
  contentScriptWhen: 'ready',
  contentScript:

  'document.onkeydown = function(ev) {var key; ev = ev || event; key = ev.keyCode; if (key == 9) { setTimeout (function(){console.log(document.activeElement.href);'+
  '}, 1000 ); } };'+

  'var a = "Access Tab URL Extraction: New Page Found."; console.log(a);'
});

...并使用以下内容获取任何给定URL的源代码(例如维基百科):

exports.main = function() {};

console.log("Start");
var pageWorkers = require("page-worker");

var script = "var elements = document.body.innerHTML; " +

             "  postMessage(elements) " ;

// Create a page worker that loads Wikipedia:
pageWorkers.Page({
  contentURL: "http://en.wikipedia.org/wiki/Internet",
  contentScript: script,
  contentScriptWhen: "ready",
  onMessage: function(message) {
    console.log(message);
  }
});

那么,我如何将从Pagemod(在本例中为document.activeElement.href)中获取的URL传递给Page-worker的contentURL,并在每次按TAB键作为新URL时使其获取并显示源代码继续在Pagemod中提取。

我尝试了以下但是它不起作用,似乎不能将page-worker称为page-mod的contentScript的一部分?

exports.main = function() {};
var pageMod = require("page-mod");
var pageWorkers = require("page-worker");


pageMod.PageMod({
  include: "*.org",
  contentScriptWhen: 'ready',
  contentScript:

//Get New URLs by Pressing the Tab Key

'document.onkeydown = function(ev) { var key; ev = ev || event; key = ev.keyCode; if (key == 9) { setTimeout (function(){console.log(document.activeElement.href);'+

  '}, 1000 ); } };'+



//Fetch new URL source code

'document.onkeyup = function(ev) { var key; ev = ev || event; key = ev.keyCode; if (key == 9) {'+

'pageWorkers.Page({'+
'contentURL: "document.activeElement.href",'+
'contentScript: "var elements = document.body.innerHTML;"+"postMessage(elements)",'+
'contentScriptWhen: "ready",'+
'onMessage: function(message) {'+
'console.log(message);'+
'}'+
'});'+

   ' } };'

});

任何帮助将不胜感激! :)

1 个答案:

答案 0 :(得分:2)

内容脚本无法使用addon-sdk资源,因为它们在网页的上下文中运行。所以你必须使用消息传递。您的按键处理程序应该使用类似

的消息将消息传递回插件
  self.port.emit('url', document.activeElement.href)

然后在你的page-mod声明中,你会收到消息并创建一个页面工作者来获取源代码:

onAttach: function(worker) {
  worker.port.on('url', function(url) {
    pageWorkers.Page({
      contentURL: url,
      contentScript: script,
      contentScriptWhen: "ready",
      onMessage: function(message) {
        console.log(message);
      }
    });
  });
}

请注意,您可能需要进行一些验证,因此您只需将URL传递回插件,并且您可能希望处理在页面工作程序中加载页面时出现的错误。