Подтвердить что ты не робот

Использование Jquery off(). On() или просто on()

Я знаю, что мы можем присоединить события с помощью функции jQuery on() и снова удалить их с помощью off().

В существующем проекте я иногда встречаю код, похожий на этот:

$("#SomeId").off("click").on("click");

или иногда при использовании namespacing, аналогичного этому:

$("#SomeId").off("click.namespace").on("click.namespace"); 

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

Например, если я просто делаю on("click"), он присоединяет мою указанную функцию, переписывает текущую функцию, назначенную, добавляя к событию "click".

Если я сделаю on("click.namespace"), он добавит мою указанную функцию , перезаписав текущую функцию, назначенную, добавив к click.namespace.

Какова точка, удаляющая какие-либо события путем привязки off("click") к on("click), если on() уже заменяет любые функции, назначенные указанному событию/событию .namespace?

Является ли это избыточным синтаксисом в нашем коде или есть причина, по которой я пропустил?

Изменить - Спасибо kapa
Я чувствую себя немного глупо сейчас, я исправил свои ошибочные знания выше. Выполняя on("click.namespace1") несколько раз, я заметил, что объект data("events") продолжал добавлять в массив событий click.

Я думаю, что отвечает на мой собственный вопрос. Вот почему можно использовать off("event.namespace"), чтобы гарантировать, что к этому конкретному событию event/event.namespace ничего не привязано.

4b9b3361

Ответ 1

На самом деле вы можете присоединить несколько обработчиков событий к одному и тому же событию, а не только к одному. Даже если используются пространства имен. Просмотрите эту быструю демонстрацию.

На самом деле, одно из преимуществ пространств имен заключается в том, что вы можете отметить группу обработчиков событий и легко удалить их позже, чтобы не связывать их несколько раз. Вот что делает эта строка:

$("#SomeId").off("click.namespace").on("click.namespace"); 

Ответ 2

Если есть существующий hander (так как у вас может быть несколько, в этом случае они будут цепочка), и он вызывает . stopPropagation(), то ваш сторонник не будет вызван. Написание кода, как указано выше, позволит избежать этой проблемы.

Ответ 3

Вы можете попробовать .one('click.namspace') вместо .on('click.namespace').

$('p')
  .off('click.namespace', clickCB)
  .one('click.namespace', clickCB); // note the .one() here

Таким образом вы гарантируете, что щелчок вызывается не более одного раза, в противном случае .on(...) будет только добавлять click-event-handlers (clickCBs) к событию click.namespace в элементе p и будет называться множественным раз до .off().

Удачи...