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

这将是最好能做到的纲领性创建不触发一个事件,或者说能够做到只连接到用户特定的动作事件。然而,这里的解决方案现在会做。

相关问题