2011-03-08 61 views
2

我正在开发一个Firefox扩展项目,该项目要求我使用TAB键切换页面上的所有链接,提取其URL,提取其源代码并解析它。使Pagemod和页面工作者模块一起工作?

目前,我能够使用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得到了URL(在这种情况下document.activeElement.href)进入页面,工人的contentURL并使其读取和显示源代码每当我按Tab键,因为新的URL保持在Pagemod中提取。

我试过以下,但它不起作用,似乎不能调用页面工作者作为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);'+ 
'}'+ 
'});'+ 

    ' } };' 

}); 

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

回答

2

内容脚本无法使用addon-sdk资源,因为它们在网页上下文中运行。所以你必须使用消息传递。你的按键处理程序应传递一个消息给附加的东西,如

self.port.emit('url', document.activeElement.href) 

,然后在你的页面国防部声明,你会收到消息,并创建一个页面工人获得源:

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

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

+0

谢谢,我以一些不同但类似的方式解决了这个问题。 – eastboundr 2011-11-17 17:38:22