2015-03-29 2 views
0

У меня есть карта, которая имеет google.maps.event.addListener, установленную на объекте map, для click событий для размещения маркера на карте. Теперь я хочу добавить контекстное меню к маркерам, поэтому создаю пользовательский оверлей в floatPane. Снова google.maps.event.addListener используется для добавления события rightclick для каждого маркера в положение и отображение меню.Приоритет прослушивания событий API Карт Google

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

меню имеет div для каждой детали с помощью JQuery .on прикрепить click обработчик к ним, в то время, когда отображается меню из keydown Обработчика прикрепляется к document.on, используя для проверки побега нажат. Они работают по желанию, но я не могу найти удовлетворительное решение для обнаружения щелчка на карте.

Если я использую google.maps.event.addListener на map объекта, чтобы отменить меню он работает, но и регистрирует со слушателем, чтобы добавить маркер и event.stopPropagation() не влияет на это. i.e. Отмена меню также добавляет маркер. Я считаю, что API Google запускает обработчики в том порядке, в котором они были добавлены, и не имеет возможности изменить приоритет.

Я также пробовал использовать обработчик jQuery .on на div, к которому прилагается карта. Но если я использую событие click или mouseup, он запускается щелчком правой кнопки мыши, который добавляет меню. т. Е. Меню мигает на экране по мере его появления, но сразу же закрывается. Событие mousedown избегает этой проблемы, но, очевидно, все же вызывает обработчик API Google для добавления маркера. Он также регистрирует щелчок, чтобы перетащить карту, чтобы прокрутить ее, что API Google не делает и будет предпочтительным.

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

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

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

Но это сделало бы код менее многоразовым и противоречил бы наличию отдельных обработчиков событий. Я также могу просто поместить код, чтобы закрыть меню в исходном обработчике.

Есть ли что-нибудь, что мне не хватает? Похоже, что это не слишком сложно, но неспособность установить приоритет обработчиков в Google API означает либо необходимость кодировать обработчики друг вокруг друга.

+0

Попробуйте разместить немного своего кода или создать полурабочую [jsfiddle] (http://jsfiddle.net), чтобы мы могли лучше помочь вам. –

ответ

0

Для чего это стоит, я считаю, что ваш первый подход (добавление и удаление обработчиков) - это «самый чистый» (или самый элегантный?) Подход.

Если вы считаете, что у обработчиков есть только значение/смысл, когда меню присутствует, с концептуальной точки зрения, нет необходимости в том, чтобы они существовали, когда меню не видно.

Если вы объединяете проводку событий в те же функции или методы, которые обрабатывают меню, то он становится автономным, повторно используемым элементом, который не оставляет никакого «мусора» позади ,

Поскольку у меня нет кода перед вами, вот некоторые псевдокод:

function displayMenu() { 
    $menu.show() 
     .on('click', function() { /* etc */ }); 
} 

function hideMenu() { 
    $menu.hide() 
     .off() // remove ALL event handlers 
} 

Или, еще лучше, инкапсулировать в объекте:

var menu = { 
    show: function() { 
     // ... 
    } 
    hide: function() { 
     // ... 
    } 
}; 

Или вы могли бы использовать функция jQuery тоже (хотя я вообще избегаю jQuery, когда я работаю с API-интерфейсом карты, просто для того, чтобы поддерживать низкое количество зависимостей).