8

我正在使用 jQuery Tools 工具提示插件,该插件使用$('selector').tooltip(). 我想在任何当前或未来的.tooltipper元素上调用它。我认为以下方法会起作用:

$('.tooltipper').live('ready', function(){
  $(this).tooltip()
}

但它没有成功——ready 事件没有触发。负载也一样。我已经读过 livequery 可以产生我正在寻找的结果,但是肯定有一种方法可以使用 jQuery.live()来实现它,考虑到文档说它适用于所有 jQuery 事件,我相信这ready是其中之一。

4

3 回答 3

12

引用自 jQ API ( http://api.jquery.com/live/ ):

在 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 开始,甚至可以使用 live 进行焦点和模糊工作(映射到更合适的、冒泡、事件 focusin 和 focusout)。

从 jQuery 1.4.1 开始,可以指定悬停事件(映射到“mouseenter mouseleave”)。

.live()似乎不支持 ready 事件。

于 2010-07-07T15:50:43.340 回答
5

添加到 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元素的操作,而不是尝试侦听 ready 事件(仅发生一次)。

于 2010-07-07T16:01:51.830 回答
1

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,它会监听 dom 的变化。

于 2011-04-20T07:03:41.303 回答