2016-04-26 19 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