Клуб 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

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

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

Пробую так 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