JQuery жить с готовым или загрузить событие
Я использую плагин jQuery Tools, который инициализируется с помощью $('selector').tooltip()
, Я хотел бы назвать это на любой текущий или будущий .tooltipper
элемент. Я подумал, что будет работать следующее:
$('.tooltipper').live('ready', function(){
$(this).tooltip()
}
Но это было неудачно - готовое событие не сработало. То же самое для нагрузки. Я читал, что livequery может дать результат, который я ищу, но, безусловно, есть способ использовать jQuery .live()
чтобы проверить это, учитывая, что документация говорит, что это работает для всех событий jQuery, в которые я верю ready
это один.
3 ответа
Цитируется из jQ API ( http://api.jquery.com/live/):
В jQuery 1.3.x с помощью.live() могут быть связаны только следующие события JavaScript (в дополнение к настраиваемым событиям): click, dblclick, keydown, нажатие клавиши, keyup, mousedown, mousemove, mouseout, mouseover и mouseup.
Начиная с jQuery 1.4 метод.live() поддерживает пользовательские события, а также все события JavaScript.
Начиная с jQuery 1.4.1, даже фокусировка и размытие работают в режиме реального времени (отображение на более подходящее, всплывающее, фокусирование событий и фокусировка).
Начиная с jQuery 1.4.1, можно указывать событие hover (сопоставление с "mouseenter mouseleave").
.live()
не поддерживает готовое событие.
Чтобы добавить в отличный ответ HurnsMobile; Смотря на bindReady()
, который является внутренним вызовом jQuery для привязки к событию загрузки документа каждый раз, когда вы вызываете $(some_function)
или же $(document).ready(some_function)
мы видим, почему мы не можем связать с "ready"
:
bindReady: function() {
if ( readyBound ) {
return;
}
readyBound = true;
// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
if ( document.readyState === "complete" ) {
return jQuery.ready();
}
// Mozilla, Opera and webkit nightlies currently support this event
if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
// A fallback to window.onload, that will always work
window.addEventListener( "load", jQuery.ready, false );
// If IE event model is used
} else if ( document.attachEvent ) {
// ensure firing before onload,
// maybe late but safe also for iframes
document.attachEvent("onreadystatechange", DOMContentLoaded);
// A fallback to window.onload, that will always work
window.attachEvent( "onload", jQuery.ready );
// If IE and not a frame
// continually check to see if the document is ready
var toplevel = false;
try {
toplevel = window.frameElement == null;
} catch(e) { //and silently drop any errors
}
// If the document supports the scroll check and we're not in a frame:
if ( document.documentElement.doScroll && toplevel ) {
doScrollCheck();
}
}
}
Подвести итог, $(some_function)
вызывает функцию, которая связывается с:
- DOMContentLoaded
- onreadystatechange (DOMContentLoaded)
- window.load / onload
Лучше всего связать с теми действиями, которые могут создать новые .tooltipper
элементы, а не пытаться прослушать готовое событие (которое происходит только один раз).
HurnsMobile прав. JQuery live не поддерживает готовое событие.
Вот почему я создал плагин, который сочетает в себе два. Вы регистрируете свой обратный вызов один раз, а затем вам нужно будет один раз вызвать плагин для контента, который вы добавляете вручную.
$.liveReady('.tooltipper', function(){
this.tooltip()
});
Тогда при создании нового контента:
element.html(somehtml);
element.liveReady();
или же
$('<div class="tooltipper">...').appendTo($('body')).liveReady();
Демоверсия доступна здесь: http://cdn.bitbucket.org/larscorneliussen/jquery.liveready/downloads/demo.html
Проверьте вступительный пост здесь: http://startbigthinksmall.wordpress.com/2011/04/20/announcing-jquery-live-ready-1-0-release/
Также посмотрите на http://docs.jquery.com/Plugins/livequery, который прослушивает изменения в дом.