Событие команды пункта контекстного меню расширения Safari запускается дважды - PullRequest
1 голос
/ 28 марта 2012

Я разработал расширение для Safari, которое использует контекстное меню.

В коде я слушаю командное событие элемента контекстного меню, используя:

safari.application.addEventListener("command", commandHandler, false);

В функции commandHandler() я добавил оператор alert для целей отладки. Таким образом я обнаружил, что функция commandHandler() запускается дважды, когда я нажимаю на пункт контекстного меню.

Также я добавил элемент панели инструментов, который также запускает событие command() при нажатии. Функция, связанная с событием command(), также срабатывает дважды после нажатия на элемент.

Кто-нибудь знает об этой проблеме и как ее решить?

1 Ответ

4 голосов
/ 01 мая 2012

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

Структура обратного вызова уведомлений о событиях для расширений Safari позволяет регистрировать несколько событий для одного и того же типа события, и во многих случаях может быть создано несколько различных событий. С этой целью ваша попытка добавить прослушиватель событий в область «команда» означает, что вы буквально получаете все команды, переданные уровню обратного вызова. Это может быть многократное срабатывание в тех случаях, когда у вас есть, например, сложное отношение вложенности (A содержит B, где A и B оба уведомляют), или сложный шаблон поведения (например, mousedown , за которым следует mouseup ).

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

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

...