0

我正在開發一個chrome擴展,其設置(基本上是兩個標記)在chrome本地存儲中保存。我可以保存和檢索保存的設置選項頁這樣的罰款:Chrome擴展等待設置被加載到事件處理程序中

節省:

function save_options() { 
    var checkbox1checked = $("#checkbox1").prop("checked"); 
    var checkbox2checked = $("#checkbox2").prop("checked"); 
    chrome.storage.sync.set({ 
    checkbox1: checkbox1checked, 
    checkbox2: checkbox2checked 
    }, function() { 
    $("#status").text("Settings saved."); 
    window.setTimeout(function() { 
     $("#status").text(""); 
    }, 2000); 
    }); 
} 

檢索:

function restore_options() { 
    chrome.storage.sync.get({ 
    checkbox1: true, 
    checkbox2: false 
    }, function(items) { 
    $("#checkbox1").prop("checked", items.checkbox1); 
    $("#checkbox2").prop("checked", items.checkbox2); 
    }); 
} 

然後在我的內容腳本我寫了一個函數來檢索像這樣的設置:

var checkbox1Checked = true; 
var checkbox2Checked = false; 
    function getSettings() { 
     chrome.storage.sync.get({ 
     checkbox1: true, 
     checkbox2: false 
     }, function(items) { 
     checkbox1Checked = items.checkbox1; 
     checkbox2Checked = items.checkbox2; 
     }); 
    } 

而且我正在添加一個'pas te'event like:

window.addEventListener('paste', handlePaste, true); 

而在handlePaste函數中,我調用了getSettings()函數。但問題是,事件的進一步邏輯根據擴展設置決定事件是否應該被取消。

我的邏輯是在getSettings()調用之後,但顯然它在變量初始化爲更新的值之前運行,因爲我只能從第二次發生的粘貼事件中看到正確的功能。

所以我正在尋找一種方式來以某種方式等待設置被加載,然後繼續執行事件處理程序。我已經試過的東西:

  1. 我試圖在設置檢索的回調中編寫我的邏輯。但是這不起作用,因爲處理函數在註冊回調之後返回,並且在異步操作正在進行時其他處理程序繼續運行,從而使事件取消以後不可能。

  2. 我試圖等待設置加載window.setTimeout和其他類似的解決方案,無濟於事。

  3. 當我保存設置時,我可能會從選項頁面向內容腳本運行的所有頁面發送某種消息,讓他們現在瞭解更改後的設置。我還沒有試圖實現這一點,我不確定這是否可能。

  4. 我試圖以某種方式克隆事件,然後取消它,當設置被加載時,如果需要重新啓動克隆的事件。但是,首先克隆粘貼事件時遇到困難。

我應該如何解決這個問題?任何幫助非常感謝,請記住,這是我的第一個Chrome擴展程序(我正在開發個人使用)。

回答

1

內容腳本在啓動後立即檢索設置,然後退出。執行應該在chrome.storage.sync.get()調用的回調函數中繼續執行,該函數應該使用chrome.storage.onChanged.addListener()chrome.storage.onChanged事件添加事件處理程序,以便檢索到的設置可以保持最新。檢索到的設置應該存儲在一個可由Paste事件處理程序訪問的變量中,以便始終可以訪問設置的當前值。例如

var checkbox1Checked, checkbox2Checked; 
chrome.storage.sync.get({ 
    checkbox1: true, 
    checkbox2: false 
}, function(items) { 
    checkbox1Checked = items.checkbox1; 
    checkbox2Checked = items.checkbox2; 
    chrome.storage.sync.onChanged.addListener(function(changes, area) { 
     if (area !== "sync") return; 
     if (changes.checkbox1) { 
      checkbox1Checked = changes.checkbox1.newValue; 
     } 
     if (changes.checkbox2) { 
      checkbox2Checked = changes.checkbox2.newValue; 
     } 
    }); 
    window.addEventListener('paste', handlePaste, true); 
}); 

現在paste事件處理程序可以立即訪問設置的變量checkbox1Checkedcheckbox2Checked無需調用chrome.storage.sync.get()。處理程序被添加到chrome.storage.sync.get()回調函數中,以便在初始化設置變量之前不能調用它。

+0

謝謝,這正是我一直在尋找的。完美的作品。爲了使其正常工作,我必須進行一次小修改: 「chrome.storage.sync.onChanged.addListener」 - >「chrome.storage.onChanged.addListener」。 –

相關問題