Google Maps API v3: как удалить прослушиватель событий?

91

Как удалить прослушиватель событий bounds_changed в Google Maps API v3 ?

google.maps.event.removeListener(_???_);    
mp_
источник
1
Думаю, я нашел то, что вы искали. Это была третья функция события в документации API.
Майку Мори,
1
Я чувствую твою боль. Вы могли подумать, что эта документация находится на code.google.com/apis/maps/documentation/javascript/events.html, но это не так. Grrrr
Drew LeSueur

Ответы:

152

Обычно ответы на такие вопросы можно найти в документации Google Maps API.

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

Также есть функция, которая удаляет всех слушателей одновременно:

clearListeners(instance:Object, eventName:string);
//In your case:
google.maps.event.clearListeners(map, 'bounds_changed');

Вот справочник по API Карт Google, где вы можете прочитать об этом.

Майку Мори
источник
2
Так удалит ли это ТОЛЬКО событие bounds_changed?
mp_
В чем преимущества этого метода по сравнению с методом Эндрюса?
mp_
Это удаляет всех слушателей из события bounds_changed. Пока метод Андрея убирает один. Если вы не хотите где-то хранить дескриптор, и вам нужно беспокоиться только об 1 слушателе для данного события, тогда это правильный путь.
Майку Мори,
Как я уже сказал, у событий может быть много слушателей, но похоже, что вы просто используете 1 в своем коде. Если вы поймете эту концепцию, вы увидите различное использование обеих функций. Также см. Ссылку, которую я предоставил, там есть хорошие объяснения для обеих этих функций.
Майку Мори,
2
Догадаться. google.maps.event.clearListeners(map, 'idle')работает. Но map.clearListeners('idle')не делает. Этот синтаксис работает для всего остального в API ( .addListenerи т. Д.). Странный.
Энди Мерсер,
93

addListener возвращает дескриптор, который позже можно передать removeListener:

var listenerHandle = google.maps.event.addListener(map, 'bounds_changed', function() {

google.maps.event.removeListener(listenerHandle);
Андрей
источник
Значит, для слушателей больше нет статических переменных?
mp_
Слушателей нужно удалять по одному. Вы не можете их всех отвязать аля jQuery. Я знаю, потому что думал так же и тоже запутался в этом вопросе. В конце концов я решил это, и приведенный выше псевдокод примерно иллюстрирует, как я это сделал.
Эндрю
1
Драт! Ваш является лучшим ответом.
Эндрю
4
Для меня лучший ответ: это удаляет только созданный нами прослушиватель событий, и это не влияет на другие скрипты
Матье Наполи
2
Лучший ответ по двум причинам. Только удаляет фактического слушателя. Кроме того, в нем нет язвительности "Вы можете найти это в комментарии к документации API.
keithhackbarth
17

Кажется, это работает в текущей версии.

var listenerHandle = google.maps.event.addListener(map, 'bounds_changed', function() {
    // Handler code.
});
listenerHandle.remove();
эфир6
источник
И что хорошо в этом подходе, так это то, что он listenerHandler.remove()работает и для слушателей уровня данных, т. Е. google.maps.data.addListenerПоскольку здесь НЕТ google.maps.data.removeListenerопределенного метода.
Кристофер Кинг
Ага .... developers.google.com/maps/documentation/javascript/…
Педро Феррейра,
0

Если вы не могли каким-то образом удерживать объект слушателя, вы могли бы удалить слушателя (ов) напрямую как google.maps.event.clearListeners(objectListened, 'event');

Пример: google.maps.event.clearListeners(map, 'bounds_changed');

Тарик Озгюн Гюнер
источник