В чем разница между jQuery off() и unbind()

Я использовал jQuery .bind() и .unbind() для обработки события анимации при прокрутке.

$(window).bind('scroll', function(){
  ... code ...
  if(code_was_successful){
    $(window).unbind(e);
  }
});

Начиная с версии 1.7 (я использую 1.11), мы должны использовать .on() и .off(), но, похоже, .off() не поддерживает обработчик событий, отменяющий привязку. Для обычных событий щелчка и тому подобного мне нужно было бы сохранить обработчик в переменной и настроить другой обработчик событий, чтобы отсоединить его (что противоречит цели), а для событий прокрутки это невозможно, поскольку .off() требует селектора для отсоединения определенный обработчик, и события прокрутки не могут иметь его.

Какой современный способ сделать это?

Ответ 1

Какой современный способ сделать это?

Используйте выражение с именем функции:

$(window).on('scroll', function handler(){
  ... code ...
  if(code_was_successful){
    $(window).off('scroll', handler);
  }
});

.off() требует, чтобы селектор отвязывал определенный обработчик

Нет, нет. Точно так же, как .on не требует селектора. Вам нужен только селектор, если вы хотите отменить делегированный обработчик событий.

Как вы можете прочитать в документации .off о аргументе селектора:

Селектор, который должен соответствовать первому, переданному в .on() при прикреплении обработчиков событий.

Итак, если вы не использовали его в .on, вы не используете его в .off.

Ответ 2

вы можете использовать .on() и .off() так:

function scrollHandler(e){
    if (myCondition) $(e.target).off('scroll', scrollHandler);
}

$(window).on('scroll', scrollHandler);