Google Map Double Click Распространение событий

Этот вопрос задают часто, но на самом деле он не ответил хорошо. Посмотрим, можем ли мы исправить это!

Распространение событий

Google позволяет привязываться к событиям в виде карты Google через их API, используя обработчики событий.

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

Хм, могу ли я обработать событие, чтобы мой код запускался, но остановить событие от продолжения и увольнения обработчика событий Google?

Вы можете! Добро пожаловать в Event Propagation (также называемый Event Bubbling).

Взгляните на этот код

Здесь я привязываю обработчик события к двойному щелчку на карте Google:

var aListener = google.maps.event.addListener(map, 'dblclick', function(event) {
    // Try to prevent event propagation to the map
    event.stop();
    event.cancelBubble = true;
    if (event.stopPropagation) {
        event.stopPropagation();
    }
    if (event.preventDefault) {
        event.preventDefault(); 
    } else {
        event.returnValue = false;  
    }
});

Здесь map - объект Google Map для привязки.

Это не работает. Событие пузыри, и карта увеличивает. Я не знаю, почему.

Вы спрашиваете, прочитали ли вы документацию?

Действительно. documentation говорит использовать event.stop();

Я посмотрел, что говорят другие. Эта проблема - это моя проблема. Он был отмечен как фиксированный, но решение не работает.

Идеи?

Обход

Возможным обходным путем для события doubleclick является отключение поведения по умолчанию Google, когда вам нужно его не запускать, а затем снова включить его позже.

Вы делаете это с помощью аргумента disableDoubleClickZoom. См. Документацию здесь.

Вот какой код отключить:

map.set("disableDoubleClickZoom", true);

Теперь для повторного включения:

map.set("disableDoubleClickZoom", false);

Конечно, вы можете установить свойство в аргументе MapOptions, если вначале создается объект map.

Ответы

Ответ 1

UPDATE: К сожалению, мне пришлось выяснить, что Firefox не делает текущее событие доступным через window.event, поэтому этот код там не работает. Я еще не нашел обходного пути для этого.


Оказывается, исправление вашего кода минимально: просто удалите параметр event из функции обработчика событий, тем самым получив доступ к глобальному объекту window.event внутри обработчика.

Следующий пример кода работал у меня в IE и Chrome, но не в Firefox:

google.maps.event.addListener(map, "dblclick", function(googleMapsEvent) {
    console.debug("caught double click");
    // reference the global event object
    // ignore the googleMapsEvent passed in by Google Maps!
    event.preventDefault();
});

Этот ответ поставил меня на правильный путь!

Ответ 2

Не решение, а некоторые идеи, как было запрошено...

event.stopPropagation() не является обобщенной панацеей по вопросам этого типа по двум причинам:

  • ваш обработчик событий может реагировать на уже запущенное событие, то есть слишком поздно, чтобы предотвратить обработку событий (увеличение в этом случае), которое было инициировано ранее в цикле барботажа.
  • это может быть не проблема с пузырями, а событие, которое обрабатывается на одном уровне. .addListener() реализует шаблон наблюдателя, что означает, что новые добавления добавляются в очередь "конкретный наблюдатель" элемента без удаления каких-либо обработчиков, ранее добавленных одним и тем же механизмом.

Обходной путь почти наверняка доступен для обеих этих ситуаций, но, вероятно, потребуется "внутреннее знание" Google Maps для решения.

Может быть, кто-то знает больше, чем я.