Запретить выполнение прослушивателя событий в расширении Google Chrome - PullRequest
1 голос
/ 12 октября 2011

Я хочу создать расширение Google Chrome для синхронизации всех моих закладок в Chrome, поэтому я прикрепил прослушиватель событий к onCreated ;

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

Идея заключается в том, что когда пользовательсоздает новую закладку, этот onCreated прослушиватель событий отправляет объект JSON на сервер с помощью запроса AJAX о том, что была создана закладка.

Если сервер затем возвращает объект JSON, который указывает, что новая закладка должнабыть созданным в браузере. Мне не нужно выполнять прослушиватель событий onCreated.

По сути, идея заключается в том, что прослушиватель событий должен запускаться только в том случае, если пользователь создал закладку вручную, а , а не программно.

Например, прослушиватель событий не должен выполняться, если закладка создается с помощью следующей команды:

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

Ответы [ 3 ]

2 голосов
/ 12 октября 2011

Если я правильно понял, вы хотите сделать паузу 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);
    });
}

Другим способом было бы пометить закладки, созданные программно (например, добавив что-то к заголовку), а затем внутри слушателя вы можете обнаружить их и удалить эту отметку.

0 голосов
/ 23 ноября 2012

Хотя вышеприведенное решение будет работать, Борис Смус из групп Google нашел другой способ сделать то же самое:

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

Это удаляет слушателя, когда вам нужно программно создать закладку / папку, и повторно добавляет его, когда вы будете готовы.

Я только что протестировал и использовал это решение в своем коде. Большое спасибо Борису Смусу на

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

Было бы предпочтительнее иметь возможность создавать программным способом, который не вызывает событие, или, скорее, иметь возможность прикреплять события только к действиям пользователя. Тем не менее, решения здесь пока подойдут.

0 голосов
/ 12 октября 2011

Я не уверен, почему вы хотите запретить пользователю добавлять закладки вручную.

Если вы хотите синхронизировать закладки браузера с сервером, вам действительно нужно только обеспечить следующее:

  1. Все закладки на сервере существуют в браузере
  2. Любые изменения в закладках на сервере должны отображаться в браузере (например, удаление, иерархия)
  3. Любые закладки, добавленные в браузер, добавляются на сервер

Chrome уже запрещает пользователям создавать закладки дважды, поэтому вам не нужно выполнять эту проверку, а только уведомлять сервер, который должен добавить его в базу данных, если его там еще нет.

Синхронизация закладок относительно проста, но вам нужно записать свои варианты использования и логику на бумаге, прежде чем пытаться ее кодировать, иначе это не удастся.

Точками 1 и 2 можно управлять, периодически проверяя сервер на наличие обновлений. Пункт 3, который вы уже рассмотрели, но сервер должен выполнять логику вместо расширения.

...