Использование 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 ничего не привязано.
Ответы
Ответ 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()
.
Удачи...