Клуб API Карт

Как правильно удалить событие?

Пост в архиве.

 https://jsfiddle.net/murr2015/0tyggjqa/1/

Выставляю маркер.

Задаю событие click.

 myPlacemark.events.add('click', function (e){
            e.preventDefault();
            console.log('Отработали с e.preventDefault()');
        });

Тут же удаляю событие

myPlacemark.events.remove('click');

Снова навешиваю событие click.

myPlacemark.events.add('click', function(){
            console.log('Отработали БЕЗ e.preventDefault()');
        });

Теперь при клике у меня событие задваивается.


Отработали с e.preventDefault()
Отработали БЕЗ e.preventDefault()

И preventDefault продолжает так же действовать.

В принципе та же фигня с другими объектами.

3 комментария

Чтобы удалить надо передать в remove указатель на слушатель события (функцию), и контекст (если вы его передавали).

То есть всё то, что вы передали в add, нужно передать и в remove.

 

В реальном проекте надо использовать делегирование событий и не навешивать обработчик на каждую метку (вешать один на коллекцию).

Так же можно использовать .once вместо .add для одиночного вызова обработчика.

Для отписывания всех обработчиков можно использовать группу .group

Удалённый пользователь
27 января 2016, 22:23

Вот у меня как раз не получалось с коллекцией, решил упростить для начала.

Можно пример удаления события?

Пробую так https://jsfiddle.net/0tyggjqa/4/ (уже добуквенно повторяю для remove текст add)  - тоже самое, двоит.

myPlacemark.events.add('click', function (e){
            e.preventDefault();
            console.log('Отработали с e.preventDefault()');
        });
        
        
        myPlacemark.events.remove('click', function (e){
            e.preventDefault();
            console.log('Отработали с e.preventDefault()');
        });
    
        myPlacemark.events.add('click', function(){
            console.log('Отработали БЕЗ e.preventDefault()');
        });
Sergey Konstantinov
27 января 2016, 22:23
Описывая функцию, вы каждый раз создаёте новый её экземпляр, который не равен старому.

Нужно сохранять ссылку на функцию:

var callback = function () { ... };
myPlacemark.events.add('click', callback);
myPlacemark.events.remove('click', callback);

Или пользоваться методом group();
Вот хорошая книжка про JavaScript: http://javascript.ru/book/definitiveguide