阻止事件侦听器在Google Chrome扩展程序中执行

时间:2011-10-12 05:11:09

标签: google-chrome javascript-events event-handling google-chrome-extension

我想构建一个Google Chrome扩展程序,以便在Chrome中同步我的所有书签,因此我已将事件监听器附加到onCreated;

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'
});

3 个答案:

答案 0 :(得分: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);
    });
}

另一种方法是以编码方式标记书签(例如,通过在标题中附加内容),然后在侦听器中,您可以检测它们并删除此标记。

答案 1 :(得分:0)

我不确定您为什么要阻止用户手动添加书签。

如果您想让浏览器的书签与服务器保持同步,那么您应该只需要确保以下内容;

  1. 服务器上的所有书签都存在于浏览器中
  2. 对服务器上书签的任何修改都应反映在浏览器中(例如删除,层次结构)
  3. 添加到浏览器的所有书签都会添加到服务器
  4. Chrome已经阻止用户创建两次书签,因此您不需要执行此检查,但只会通知您的服务器,如果该数据库中尚不存在,则应将其添加到数据库中。

    书签同步相对简单,但您需要在尝试编写此代码之前将您的用例和逻辑写在纸上,否则它将无法成功。

    积分1&可以通过定期检查服务器的更新来管理2。您已经介绍过的第3点,但服务器需要执行逻辑而不是扩展。

答案 2 :(得分:0)

虽然上述解决方案可行,但Google团队的Boris Smus发现了另一种做同样事情的方法:

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

当您需要以编程方式创建书签/文件夹时,这将删除侦听器,并在您准备好后重新添加它。

我刚刚在我的代码中测试并使用了此解决方案。非常感谢Boris Smus,

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

最好能够执行不触发事件的程序化创建,或者更确切地说能够仅将事件附加到用户特定的操作。但是,这里的解决方案现在可以做到。