.live( типСобытия, обработчик )
Возвращает: jQuery
Описание:
Прикрепляет обработчик к событию для всех элементов, которые соответствуют текущему селектору, в настоящее время или в будущем.
.live( типСобытия, обработчик )
Добавлена в версию: 1.3
Строка, содержащая тип события JavaScript, такие как "click" или "keydown". Начиная с jQuery 1.4 строка также может содержать несколько, разделенных пробелами типов событий или пользовательские имена событий.
Функции для выполнения во время вызова события.
.live( типСобытия, данныеСобытия, обработчик )
Добавлена в версию: 1.4
Строка, содержащая тип события JavaScript, такие как "click" или "keydown". Начиная с jQuery 1.4 строка также может содержать несколько, разделенных пробелами типов событий или пользовательские имена событий.
Карта данных, которые будут переданы в обработчик события.
Функции для выполнения во время вызова события.
Этот метод является вариацией базового метода .bind()
для подключения обработчиков событий для элементов.
Когда .bind() вызывается, элементы, к которым относится объект jQuery
получают прикрепленный обработчик;
элементы, которые введены позже не получают его, поэтому они будут нуждаться в другом вызове .bind() . Для наглядности, рассмотрим HTML:
<body>
<div class="clickme">
Click here
</div>
</body>
Мы можем связать простой обработчик щелчка мыши на этот элемент:
$('.clickme').bind('click', function() {
// Bound handler called.
});
Когда элемент нажали, обработчик вызывается. Тем не менее, предположим, что после этого еще один элемент добавляется:
$('body').append('<div class="clickme">Another target</div>');
Этот новый элемент также соответствует селектору .clickme , но, поскольку он был добавлен после вызова .bind() , нажатие на него ничего не даст.
Метод .live() является альтернативой такого поведения. Если мы связываем обработчик нажатия к целевому элементу с помощью этого метода:
$('.clickme').live('click', function() {
// Live handler called.
});
И затем, когда новый элемент добавлен:
$('body').append('<div class="clickme">Another target</div>');
Затем нажатие на новый элемент также запустит обработчик. Делегирование событий
Метод .live()
может повлиять на элементы, которые еще не были добавлены к DOM с
помощью события делегации: обработчик привязанный к предку элемента
несет ответственность за события, которые вызваны на его потомков.
Обработчик, переданный с .live() никогда не привязывется к элементу; вместо этого, .live() привязывает специальный обработчик к корню дерева DOM. В нашем примере, когда новый элемент нажат, происходят следующие шаги:
- Событие нажатия генерируется и передается в
<div> для обработки. - Ни один обработчик напрямую не привязывается к
<div> , таким образом событие распространяется вверх по дереву DOM. - Событие поднимается вверх пока не достигает корня дерева, к которому
.live() прикрепил по умолчанию специального обработчика.
* Начиная с jQuery 1.4, распространение события можно опционально остановить "контекстно" на элементе DOM.
- Специальный обработчик
нажатия , прикрепленный с помощью .live() выполняется. - Обработчик тестирует
цель события объекта, чтобы посмотреть должен ли он продолжать. Этот тест проводится путем проверки, если $(event.target).closest('.clickme') может найти соответствующий элемент. - Если соответствующий элемент найден, оригинальный обработчик вызывается на него.
Потому что испытания в шаге 5 не выполняется, пока не произойдет
событие, элементы могут быть добавлены в любое время и по-прежнему
реагировать на события.
Смотрите обсуждение по .bind() для более подробной информации о связвании события. Множественные события
Начиная с jQuery 1.4.1 .live() может принимать множественные, разделенные запятой события, аналогичные функциональной возможности, предоставленной в .bind().
Например, мы можем "прикрепить в живую" события mouseover и mouseout в одно и то же время, как:
$('.hoverme').live('mouseover mouseout', function(event) {
if (event.type == 'mouseover') {
// do something on mouseover
} else {
// do something on mouseout
}
});
Данные события
Начиная с jQuery 1.4, опциональный параметр eventData позволяет нам передавать дополнительную информацию в обработчик.
Одно удобное применение этого параметра, это обход проблем, связанных с закрытием.
Смотрите обсуждение метода .bind() "Передача данных событий" для более подробной информации. Контекст события
Начиная с jQuery 1.4, живые события могут быть прикрепленны к
"контексту" элемента DOM, а не к корню документа, по умолчанию. Для
определения этого контекста, мы используем второй аргумент функции jQuery(),
переданный в единственный элемент DOM (в противовес к коллекции jQuery или селектору).
$('div.clickme', $('#container')[0]).live('click', function() {
// Live handler called.
});
Обработчик live в этом примере вызывается только тогда, когда
<div class="clickme"> это потомок элемента с идентификатором "container." Предостережения
Техника .live() является полезной, но из-за своего особого подхода не может быть просто заменена на .bind() во всех случаях.
Конкретные различия включают в себя:
- Методы обхода DOM не полностью поддерживаются для нахождения элементов для отправки в
.live() . Пожалуй, метод .live() всегда должен быть вызван непосредственно после выбора, как в приведенном выше примере. - Чтобы остановить дальнейшие обработчики от исполнения после первого связывания используя
.live() , обработчик должен вернуть false . Вызов .stopPropagation() не решит эту задачу. - В jQuery 1.3.x только следующие события JavaScript (в дополнение к пользовательским событиям) могут быть прикрепленны с
.live() : click , dblclick , keydown , keypress , keyup , mousedown , mousemove , mouseout , mouseover , и mouseup .
- Начиная с jQuery 1.4 метод
.live() поддерживает пользовательские события так же как и все события JavaScript. Начиная с jQuery 1.4.1 даже focus и blur работают с методом live
(соответствующие более подходящим событиям focusin и focusout ). - Начиная с jQuery 1.4.1 событие
hover может быть определенно (соответствует mouseenter и mouseleave , которые, в свою очередь, соответствуют mouseover и mouseout ).
Примеры
Пример 1
Нажмите на параграфе, чтобы добавить еще один. Обратите внимание, событие по нажатию привязывается и ко всем новым параграфам.
$("p").live("click", function(){
$(this).after("<p>Another paragraph!</p>");
});
Пример 2
Отображение содержимого параграфа в сообщении alert при нажатии:
$("p").live("click", function(){
alert( $(this).text() );
});
Пример 3
Для отмены действия по умолчанию и предотвращения передачи событий необходимо возвратить false:
$("a").live("click", function() { return false; })
Пример 4
Для отмены только действия по умолчанию необходимо использовать метод preventDefault.
$("a").live("click", function(event){
event.preventDefault();
});
Пример 5
Пример связывания пользовательских событий.
$("p").live("myCustomEvent", function(e, myName, myValue){
$(this).text("Hi there!");
$("span").stop().css("opacity", 1)
.text("myName = " + myName)
.fadeIn(30).fadeOut(1000);
});
$("button").click(function () {
$("p").trigger("myCustomEvent");
});
|