2012-05-08 1 views
4

Есть ли способ использовать one() с делегацией событий? например on() или live(), чтобы он был применен к элементам DOM, которые не созданы во время привязки?Использование .one() для некоторых элементов, которые еще не созданы (например. .live())

+0

сверху() u можно использовать. – Thulasiram

+0

Да, это точно так же, как on() при делегировании? – adeneo

ответ

1

Да. Из jQuery .one() docs:

вторых две форм, введенных в JQuery 1.7, идентичны .on() за исключением того, что обработчик будет удален после того, как в первый раз событие происходит при делегированном элементе, соответствует ли селектор ничего или нет. Например:

$("#foo").one("click", function() { 
     alert("This will be displayed only once."); 
    }); 
    $("body").one("click", "#foo", function() { 
     alert("This displays if #foo is the first thing clicked in the body."); 
    }); 

После того, как код выполняется, щелчок на элементе с идентификатором Foo будет отображаться предупреждение. Последующие клики ничего не сделают.

Это означает, что, когда вы используете форму $(el).one('click', '.selector', handler) он будет работать как live - обработчик событий связан с el (который должен существовать в DOM), но обработчик события будет выполняться только по кликам на .selector, независимо от того, существует ли этот элемент во время вашего вызова до .one().

Редактировать: Похоже, что документация jQuery по этому поводу неверна - по крайней мере, так, как я ее интерпретирую. В соответствии с приведенным выше alert,

«Это отображается, если #foo - первое, что щелкнуло в теле».

Что заставляет меня думать, что если что-нибудь еще щелкают в теле первого, обработчик события будет удален и не будет стрелять снова. Это не так - обработчик событий будет существовать до тех пор, пока один щелчок не будет нажиматься до #foo.

См. this fiddle для демонстрации.

4

Да есть:

// added in jQuery 1.7 
// .one(events [, selector] [, data], handler(eventObject)) 
$("div").one("click", "span", function (e) { 
    $(this).hide(); 
}); 
1

Точно так же, как и .on

$("#to-bind-to").one('event-type', 'delegated-selector', eventFunction); 
Смежные вопросы