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, который прослушивает изменения в дом.

Другие вопросы по тегам