2012-06-25 44 views
2

我已經用SDK構建了Firefox插件。我正在使用簡單首選項模塊來存儲2個用戶首選項。問題是首選項不是腳本的第一次運行。這是main.js代碼:首次運行時不會發出首選項

var pageMod = require("page-mod"); 
var data = require("self").data; 
var prefSet = require("simple-prefs"); 

pageMod.PageMod({ 

include: ["http://www.google.*","https://www.google.*"], 
contentScriptWhen: 'end', 
contentScriptFile: [data.url("jquery-1.7.1.min.js"),data.url("trackingdetector.js")], 
onAttach: function(worker) 
{ 
    // set preference variables 
    var trackPref = prefSet.prefs.trackPref; 
    var submitPref = prefSet.prefs.submitPref; 

    worker.port.emit('get-prefs', [ trackPref, submitPref ]); // emit initial prefs 

    function onPrefChange(prefName) { 
     worker.port.emit('prefchange', [prefName, prefSet.prefs[prefName]]); // emit pref changes 
    } 
    prefSet.on("trackPref", onPrefChange); 
    prefSet.on("submitPref", onPrefChange); 
} 
}); 

然後我用內容腳本的代碼趕上喜好:

var trackPref; 
var submitPref; 

// get preference values here 
self.port.on("get-prefs", function(data) { 
trackPref = data[0]; 
submitPref = data[1]; 
}); 

// get preference changes here 
self.port.on("prefchange", function(data) { 
    prefChange = data[0]; 
    prefValue = data[1]; 
    if (prefChange == "trackPref") { 
     trackPref = data[1]; 
    } 
    else if (prefChange == "submitPref") { 
     submitPref = data[1]; 
    } 
}); 

做工精細,期望在第一次運行時的submitPref的價值觀和trackPref始終爲undefined。我如何確保腳本獲得初始值?

回答

1

在給他們分配任何東西之前,爲什麼prefs的值不同於undefined?只需在您的main.js開始時初始化它們:

// Initialize prefs if necessary 
if (typeof prefSet.prefs.trackPref == "undefined") 
    prefSet.prefs.trackPref = false; 
if (typeof prefSet.prefs.submitPref == "undefined") 
    prefSet.prefs.submitPref = false; 
+0

不知道我理解。首選項都是布爾值,所以不應該從插件的選項菜單設置這些值? –

+0

@JonathanBeeston:好的,調整示例以使用布爾值。當然,這些偏好設置應該從選項菜單中設置 - 但是擴展需要爲它們設置一些*初始值,否則它們將僅僅是「未定義」直到用戶選擇某個值。這就是這個例子所做的,如果用戶沒有選擇任何東西,它會設置默認值。 –

+0

我想我在這裏問錯了問題。事實是,prefs是在'main.js'中定義的(並且在'package.json'中給出了它們的初始值)。問題在於它們沒有及時發送到內容腳本(即使在我們按照您的建議在main.js中初始化它們時)。我想這是什麼意思,當它被描述爲'異步'!這就是爲什麼第一次運行內容腳本時,它將首選項視爲未定義,而後續運行則包含它們。 感謝您的幫助弗拉基米爾在這個問題上,和其他相關的答案,幫助我得到這麼多! –

相關問題