1

我想構建Google Chrome瀏覽器擴展程序以同步Chrome上的所有書籤,因此我已將一個事件偵聽程序附加到onCreated;防止事件偵聽器在Google Chrome擴展程序中執行

chrome.bookmarks.onCreated.addListener(function (id, bookmark) { 
    console.log('Hey bookmark created ' + id); 
}); 

的想法是,當用戶創建一個新的書籤onCreated事件監聽器通過Ajax請求,說明書籤已創建發送JSON對象到服務器。

如果服務器然後返回一個JSON對象,表明應該在瀏覽器上創建新書籤,我不需要執行onCreated事件偵聽器。

基本上,這個想法是,只有當書籤已經由用戶手動創建並且不是以編程方式才應該觸發事件監聽器。

例如,如果使用以下命令創建書籤,則不應執行事件偵聽器;

chrome.bookmarks.create({ 
    parentId: '648', 
    title: 'Google Folder' 
}); 
+0

您是否有使用Chrome的同步功能的原因? chrome:// settings/syncSetup – Alasdair

+0

是的,我目前使用Chrome「同步功能」。但我想構建擴展,以便將來我可以構建Firefox和Opera的擴展(如果允許),以在所有瀏覽器中同步我的書籤。 – Viren

+0

如果這就是您要找的內容,我強烈建議您使用已經建立的[Xmarks](http://www.xmarks.com/)瀏覽器插件。 – Alasdair

回答

2

如果我理解正確,您希望在編程創建書籤時能夠暫停chrome.bookmarks.onCreated。由於Chrome API不提供刪除事件偵聽器的方法,因此只能添加。

我會盡量讓可能是一些全局開關:

var listenerEnabled = true; 
chrome.bookmarks.onCreated.addListener(function (id, bookmark) { 
    if(listenerEnabled) { 
     console.log('Hey bookmark created ' + id); 
    } 
}); 

function createBookmark() { 
    listenerEnabled = false; 
    chrome.bookmarks.create({parentId: '648',title: 'Google Folder'}, function() { 
     //enable with delay in case listener fires late 
     setTimeout(function() { 
      listenerEnabled = true; 
     }, 500); 
    }); 
} 

另一種方法是標記programattically創建(通過附加的東西題爲例)書籤,然後在監聽器裏,你可以發現它們並刪除這個標記。

+0

Ohh,這是醜陋的。是否沒有其他具體的方式來做到這一點更清潔,更好 – Viren

+0

@Viren我想不出一個,也許別人會。 – serg

0

我不確定爲什麼要防止用戶手動添加書籤。

如果你想保持瀏覽器的書籤與服務器保持同步,那麼你應該只需要確保以下內容;

  1. 服務器上的所有書籤在瀏覽器中存在
  2. 任何修改到服務器上的書籤應該反映在瀏覽器(例如去除,層次)
  3. 添加到瀏覽器的任何書籤被添加到服務器

Chrome已經阻止用戶創建書籤兩次,因此您不需要執行此檢查,但只會通知您的服務器,如果該服務器尚未存在,該服務器應將其添加到數據庫。

書籤同步是相對容易的,但您需要在您嘗試編寫代碼或代碼不成功之前,將您的用例和邏輯放在紙上。

積分1 & 2可以通過定期檢查服務器的更新進行管理。第3點你已經覆蓋,但服務器需要做的邏輯,而不是擴展。

+0

否否否,我不打算阻止用戶手動添加書籤。想法是,當用戶使用瀏覽器創建書籤(通過點擊星形圖標),「oncreated」偵聽器將被執行,並且新創建的書籤的json對象將被髮送到服務器,但是如果服務器返回json對象需要在瀏覽器上創建的書籤(這是在服務器中,而不是在瀏覽器上),那麼我不需要onCreated偵聽器來執行,因爲onCreated偵聽器不需要發送書籤json,因爲它已經存在於服務器上。 – Viren

+0

所以我需要的是防止「onCreated」偵聽器執行時,編程創建書籤。 – Viren

+0

它仍然聽起來像你正試圖做1到2個服務器調用,當你需要的只有1個。而不是檢查它是否存在,然後再發送它,如果不是。但是,爲什麼不直接發送一次到服務器,以決定是否需要創建它? – Alasdair

0

雖然上述方案將工作,鮑里斯的SMU在谷歌研究小組發現的另一種方式做同樣的事情:

var myListener = function(...) {...}; 
chrome.bookmarks.onCreated.addListener(myListener); 
// Remove temporarily 
chrome.bookmarks.onCreated.removeListener(myListener); 
// Add again... 

當你需要以編程方式創建書籤/文件夾,這消除了監聽器,並重新當你準備好時添加它。

我剛剛在我的代碼中測試並使用了這個解決方案。非常感謝鮑里斯的SMU,在

https://groups.google.com/a/chromium.org/forum/?fromgroups=#!topic/chromium-extensions/fKYpINyqs1k

這將是最好能做到的綱領性創建不觸發一個事件,或者說能夠做到只連接到用戶特定的動作事件。然而,這裏的解決方案現在會做。

相關問題