- •Об авторе
- •О книге
- •Условия распространения
- •Оглавление
- •0% О HTML, CSS и JavaScript
- •Семантическая вёрстка
- •Валидный HTML
- •CSS-правила и селекторы
- •CSS. Погружение
- •О форматировании
- •Именование классов и идентификаторов
- •О цветах
- •Блочные и строчные элементы
- •О размерах блочных элементов
- •Плавающие элементы
- •Позиционирование
- •Разделяй и властвуй
- •Немного о JavaScript
- •О форматировании
- •Основы JavaScript
- •Переменные
- •Константы
- •Типы данных
- •Массивы
- •Функции
- •Анонимные функции
- •Объекты
- •Область видимости и чудо this
- •Замыкания
- •10% Подключаем, находим, готовим
- •Будь готов
- •Селекторы
- •Поиск по атрибутам
- •Поиск по дочерним элементам
- •Sizzle
- •Оптимизируем выборки
- •Примеры оптимизаций
- •20% Атрибуты элементов и CSS
- •30% События
- •Учимся рулить
- •Пространство имен
- •«Живые» события
- •Оптимизация
- •Touch события
- •40% Анимация
- •Step-by-step
- •В очередь…©
- •Отключение
- •50% Манипуляции с DOM
- •60% Работа с формами
- •70% AJAX
- •Обработчики AJAX событий
- •JSONP
- •Лечим JavaScript зависимость
- •Прокачиваем AJAX
- •Префильтры
- •Конверторы
- •Транспорт
- •80% Объект Deferred и побратимы
- •Callbacks
- •90% Пишем свой плагин
- •jQuery плагин
- •JavaScript и даже не jQuery
- •jQuery, но еще не плагин
- •Таки jQuery плагин
- •Работаем с коллекциями объектов
- •Публичные методы
- •О обработчиках событий
- •Data
- •События data
- •Animate
- •Easing
- •Sizzle
- •100% Последняя глава
- •Дополнение
- •jQuery-inlog
- •jQuery UI
- •Интерактивность
- •Виджеты
- •Утилиты
- •Эффекты
- •Темы
- •Пишем свой виджет
- •jQuery Tools
- •UI Tools
- •Form Tools
- •Toolbox
- •jQuery Mobile
- •Еще плагины
- •История изменений
- •Благодарности
Пространство имен
Как вы уже узнали, когда мы хотим создать/удалить свой обработчик событий, мы пишем следующий код:
// создаем свой обработчик $('.class').on('click', function(){
// что-то делаем
});
// удаляем все обработчики $('.class').unbind();
Но как всегда, есть ситуации когда нам необходимо отключить не все обработчики (как пример, надо отключить обработку какого-то контрола определенным плагином), в этом случае нам на помощь приходят пространства имен, использовать их достаточно легко:
// создаём обработчик $('.class').on('click.namespace', function(){
// что-то делаем
});
// вызываем обработчик $('.class').trigger('click.namespace');
// вызываем все обработчики без пространства имён $('.class').trigger('click!');
// удаляем все обработчики click в данном пространстве имён $('.class').unbind('click.namespace');
Еще примерчик, вешаем обработчик, который выводит текст в консоль:
$('.class').on('click.namespace', function(){ console.log('bang');
}); // вызываем событие, наш обработчик сработает
$('.class').trigger('click.namespace'); // тоже работает $('.class').trigger('click');
// событие из другого пространства имён, наш обработчик не будет вызван $('.class').trigger('click.other');
47
Также, есть поддержка нескольких пространств имён:
$('.class').on('click.a.b', function(){
// для пространства имён a и b
});
// вызываем обработчик из пространства a $('.class').trigger('click.a');
// отменяем обработчик click для пространства b $('.class').unbind('click.b');
Можно одним махом удалить все обработчики с определенного пространства имен:
// обработчик клика $('.class').on('click.namespace', function(){}); // обработчик фокус $('.class').on('blur.namespace', function(){});
// передумали, и все отменили $('.class').unbind('.namespace');
Официальная документация скудна на этот счёт, и я надеюсь мой пример поможет лучше разобраться в данном вопросе (events.namespace.html).
«Живые» события
Я тут немного забегу вперёд, так что если чего стало непонятно, отложите данный раздел «на потом».
Стоит обратить внимание на еще одну задачку, которая очень часто ставится перед разработчиком – это добавление обработчиков событий для элементов, которые добавляются на страницу динамически. Пожалуй, надо привести пример подобной задачи:
«У нас есть HTML страница, на которой все внутренние ссылки будут подгружаться AJAX’ом, данное утверждение справедливо и для подгружаемого HTML’а тоже»
48
Первое условие решается просто:
$('a[href^=\\/]').on('click', function() { var url = $(this).attr('href'); $('body').load(url + ' body > *'); return false;
});
Для наглядности, условимся, что внутренние ссылки содержат относительные пути от корня сайта.
Со вторым условием чуть-чуть посложнее ситуация, но тоже вполне решаема:
$('body').on('click', 'a[href^=\\/]', function() { var url = $(this).attr('href'); $('body').load(url + ' body > *');
return false;
});
Отличий не так уж и много, проясню происходящее:
—первым делом на элемент body будет повешен обработчик события click
—данный обработчик будет срабатывать только в том случае, когда событие будет относится к элементу a
Работа данной схемы базируется на «всплытии» событий, так что используя метод event.stopPropagation() вы сможете предотвратить выполнение «живых» обработчиков
Лирическое отступление к истории: жил да был когда-то плагин для jQuery, назывался live, позволял он вешать обработчики на элементы DOM дерева которых ещё нет (подгружаемые AJAX’ом или ещё как), а потом он умер его внесли в само ядро. Метод live() к тому времени работал лишь с document. Затем появился метод delegate() который научился вешать обработчик на произвольный элемент, а затем и он был поглощён методом on(). Так что не пугайтесь сильно, если встретите старый, адаптировать под новые версии jQuery его будет не так уж и сложно (ну я на это надеюсь)
49
Оптимизация
Неявным бонусом от использования «живых» событий можно считать возможность оптимизации, о «подходящих» случаях я и расскажу.
Случай первый, банальный – представьте себе таблицу на тысячу строк да десяток столбцов, а теперь попытайтесь подсчитать, сколько памяти скушают обработчики события click для каждой ячейки? Вот-вот, стоит это переписать в один обработчик:
$('table').on('click', 'td', function() { /* ... */ }
Случай второй, надуманный – нам необходимо логировать действия пользователя на странице, т.е. отслеживать клики по бессчётному количеству объектов:
$('body').on('click', '*', function() {
console.info("Click on "+this.tagName);
});
Пример работы данного «надуманного» варианта можно посмотреть на странице events.optimization.html
Touch события
Смартфоны с большим сенсорным экраном — это уже норма жизни, и любому webразработчику рано или поздно потребуется разрабатывать интерфейсы с поддержкой «touch» событий. На этот случай в JavaScript'е предусмотрены следующие события:
touchstart — событие схоже с mousedown, происходит при касании пальцем экрана
touchend — убираем палец с экрана, ака mouseup
touchmove — водим пальцем по экрану — mousemove
touchcancel — странное событие, отмена touch до того, как палец был убран
О том как с ними работать, можно подчерпнуть из статьи Touching and Gesturing on iPhone, Android, and More (хоть рассказ там и о Dojo Toolkit). Для обработки touch событий с использованием jQuery лучше всего использовать jQuery Mobile.
50