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
。我如何確保腳本獲得初始值?
不知道我理解。首選項都是布爾值,所以不應該從插件的選項菜單設置這些值? –
@JonathanBeeston:好的,調整示例以使用布爾值。當然,這些偏好設置應該從選項菜單中設置 - 但是擴展需要爲它們設置一些*初始值,否則它們將僅僅是「未定義」直到用戶選擇某個值。這就是這個例子所做的,如果用戶沒有選擇任何東西,它會設置默認值。 –
我想我在這裏問錯了問題。事實是,prefs是在'main.js'中定義的(並且在'package.json'中給出了它們的初始值)。問題在於它們沒有及時發送到內容腳本(即使在我們按照您的建議在main.js中初始化它們時)。我想這是什麼意思,當它被描述爲'異步'!這就是爲什麼第一次運行內容腳本時,它將首選項視爲未定義,而後續運行則包含它們。 感謝您的幫助弗拉基米爾在這個問題上,和其他相關的答案,幫助我得到這麼多! –