Пространство имен

Как вы уже узнали, когда мы хотим создать свой обработчик событий, мы пишем вот такой код:

// создаем свой обработчик
$("p").on("click", function() {
    // что-то делаем
    alert("Click!");
});

Когда нам надо удалить обработчики, используем следующий код:

// удаляем все обработчики
$("p").off();

// удаляем все обработчики click
$("p").off("click");

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

При создании обработчика события добавляем namespace через точку:

// создаём обработчик
$("p").on("click.namespace", function(event){
    // что-то делаем
    alert("Click: " + event.namespace + "!");
});

Когда нам надо вызвать обработчик события привязанный только к нашему namespace используем следующий синтаксис:

$("p").trigger("click.namespace");

Когда вызываем событие из другого пространства имён, наш обработчик не будет вызван:

$("p").trigger("click.other");

Когда вызываем все-все обработчики событий:

// вызываем все обработчики события click
$("p").trigger("click");

Когда вызываем все обработчики без пространства имён:

// вызываем все обработчики без пространства имён
$("p").trigger("click.$");

До версии 1.9 для это цели следовало использовать имя события с восклицательным знаком click!, а после — вот такой workaround завязанный на недостатке одного регулярного выражения.

И последний случай — удаление обработчика событий привязанного к нашему «namespace»:

// удаляем все обработчики click в данном пространстве имён
$("p").off("click.namespace");

Хот можно одним махом удалить все обработчики из определённого пространства имён:

// обработчик клика
$("p").on("click.color", function() {
  $(this).css("color", "red");
});

// обработчик при наведении
$("p").on("mouseenter.color", function() {
  $(this).css("color", "green");
});
// передумали, и все отменили
$("p").off(".namespace");

Ещё полезный пример хитрого обработчика — он может ловить и обрабатывать данные:

// создаём обработчик
$("p").on("click.data", function(event, one, two, three) {
    alert("Click data: " + one + ", " + two + ", " + three);
});

Инициируем обработку события, в качестве данных передаём массив аргументов:

$("p").trigger("click.data", [1, 2, 3]);

Так же хотел обратить внимание на поддержку нескольких пространств имён:

// создаём обработчик для a
$("p").on("click.a", function(event) {
    alert("Click A!");
});

// создаём обработчик для b
$("p").on("click.b", function(event) {
    alert("Click B!");
});

// создаём обработчик для пространства a и b
$("p").on("click.a.b", function(event) {
    // для пространства имён a и b    
    alert("Click: " + event.namespace + "!");
});
// вызываем обработчик из пространства a
$("p").trigger("click.a");
// вызываем обработчик из пространства b
$("p").trigger("click.b");
// отменяем обработчик click для пространства b
$("p").off("click.b");

Официальная документация скудна на этот счёт, и я надеюсь, мои примеры помогли вам лучше разобраться в данном вопросе. Ну и ещё один комплексный пример работы с namespace:

Last updated