2012-04-26 128 views
1

我试图通过创建Mozilla附加在生成器的插件。我需要知道的是如何获得通过附加的活动标签左点击链接的URL,并在新标签中打开它。如何获取点击链接的URL?

我知道涉及通过一个页面-MOD添加事件侦听,然后使用标签模块这个过程中,但我似乎无法得到正确的语法。

编辑:(这是我迄今为止)

var Widget = require("widget").Widget; 
var tabs = require('tabs'); 
var pageMod = require("page-mod"); 

exports.main = function() { 


    pageMod.PageMod({ 
    include: '*', 
    contentScriptWhen: 'ready', 
    contentScript: "window.addEventListener('click', function(event) { self.port.emit('click',event.target.toString())},false)", 
    onAttach: function(worker) { 
     worker.port.on("click", function(urlClicked) { 
      tabs.open(urlClicked); 

     }); 
    } 

    }); 

}; 
+2

您能告诉我们您尝试过什么吗?该方法是正确的,所以如果没有你的代码,我不能告诉你你犯了什么错误。只有怀疑您尝试使用内容脚本中的“tabs”模块,而不是将消息发送回扩展程序,以便它可以执行此操作。 – 2012-04-26 07:48:07

+0

弗拉基米尔,我haved编辑我原来的职位,包括我到目前为止的代码。我所需要的是能够获得点击链接的网址,然后能够操作该网址的一部分来形成不同的链接,然后将打开一个新的标签。现在有道理? – Cuyware 2012-04-26 21:50:33

回答

0

你必须有正确的大多是和对我的作品的代码。但是,您的内容脚本代码存在两个问题:

  • 它需要调用event.preventDefault()以防止浏览器关注链接。否则,链接页面将被加载到当前选项卡和扩展名打开的新选项卡中。
  • 它不检查event.target是否实际上是一个链接。它可能是链接的子节点,也可能不是链接。

总之,你的内容脚本应该是这样的:

window.addEventListener("click", function(event) 
{ 
    var link = event.target; 
    while (link && link.localName != "a") 
    link = link.parentNode; 

    if (link) 
    { 
    self.port.emit("click", link.href); 
    event.preventDefault(); 
    } 
}, false); 

对于这样一个不平凡的内容脚本,你不应该使用contentScript参数,而是把它放到在其自己的文件data/目录。然后,您可以在构建面板时使用contentScriptFile参数:

contentScriptFile: require("self").data.url("contentScript.js"), 
+0

弗拉基米尔,这似乎是工作。我还有一个问题。当我点击谷歌文档中使用https的链接时,我得到一个安全错误,说“安全错误:https:***的内容可能无法从https:***加载数据,星星代表一个url。你知道吗?是否会导致这种情况?还有一种方法可以确定文件是否被点击,例如PDF文件吗? – Cuyware 2012-04-27 17:31:57

+0

@Cuyware:我确定安全错误与您的扩展无关 - 这是一些Google内部问题。至于识别PDF文件 - 这是不可能的,至少在文件开始下载之前 – 2012-04-27 20:51:38

+0

我认为href目标在标题中会有.pdf,所以我想有一种方法可以测试这个。 – Cuyware 2012-04-27 21:05:23