2016-04-26 22 views
1

我是Firefox Addon SDK,高级API的新手。Firefox Addon SDK - 如何使新页面中的页面只运行一次

我想这样做,如果用户单击工具栏上的图标,打开一个新选项卡,然后运行在contentscriptfile中定义的脚本。

我用下面的脚本:

var self = require("sdk/self"); 
var tabs = require("sdk/tabs"); 
var buttons = require('sdk/ui/button/action'); 

var button = buttons.ActionButton({ 
    id: "mm-link", 
    label: "Visit mm", 
    icon: { 
    "32": "./icon-32.png", 
    "64": "./icon-64.png" 
    }, 
    onClick: handleClick 
}); 

function handleClick(state) { 
    tabs.open("about:blank"); 
    tabs.on('ready', function (tab) { 
    tab.attach({ 
     contentScriptFile: self.data.url("home.js"), 
     contentScriptOptions: {"aaa" : "1111", "bob" : "222"} 
    }); 
}); 
} 

但预期它不工作,并具有下列问题:

  1. 脚本重复运行。 (我希望它在每个新标签上只运行一次)
  2. 即使我点击“+”图标创建一个新选项卡,脚本将会运行 。 (我想它只是点击我的工具栏上创建的图标时运行)

我也试图改变“准备”到“activiate”,反复运行的问题消失了,但每次我创建的标签,脚本将运行。

非常感谢任何帮助。

回答

4

问题是您正在聆听任何和所有选项卡的ready事件,而不是刚刚打开的那个事件。一种选择是做这样的事情:

function handleClick(state) { 
    tabs.open({ 
     url: "about:blank", 
     onOpen: function onOpen(tab) { 
      tab.attach({ 
       contentScriptFile: self.data.url("home.js"), 
       contentScriptOptions: {"aaa" : "1111", "bob" : "222"} 
      }); 
     } 
    }); 
} 

并采用onOpen处理程序附加脚本。欲了解更多信息,文档在这里:https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/tabs#open%28options%29

+0

真棒,它运作良好!它花了我整整一天,但无法找到答案。你的帮助使我更容易和可靠。非常感谢! – user1748640

+0

只是好奇心,如果我将“onOpen”更改为“onReady”,它会不断发送请求。 (在home.js中,我创建了一个表单,并通过POST方法提交表单)。只是想知道为什么会发生。 – user1748640

+0

我不确定我明白你的意思是“它会不断发送请求”。会怎样?在home.js中的表单?我对“onReady”的行为持谨慎态度,因为我没有看到它的记录。 – winhowes