【问题标题】:jQuery - What are differences between $(document) and $()?jQuery - $(document) 和 $() 有什么区别?
【发布时间】:2015-07-28 13:12:34
【问题描述】:

我目前正在学习这门课程:jQuery Events

我知道以下所有语句都是等价的:

$(document).ready( /*handler*/ );
$().ready( /*handler*/ );
$( /*handler*/ );

我认为$()$(document) 相同。
但是当我需要处理整个文档的按键时,我注意到

$(document).keydown( /*handler*/ );

正在工作并且

$().keydown( /*handler*/ );

不是。

jQuery$()选择器匹配的对象是什么?和document有什么区别?

【问题讨论】:

标签: jquery jquery-selectors


【解决方案1】:

我认为 $()​​ != $(document) ,你可以通过下面的代码来测试这个主题:

alert($(document).length); // 1
alert($().length); // 0

$(..) 代码导致在 jquery 库中调用下面的构造函数:

    function( selector, context ) {
    var match, elem;

    // HANDLE: $(""), $(null), $(undefined), $(false)
    if ( !selector ) {
        return this;
    }

    // Handle HTML strings
    if ( typeof selector === "string" ) {
        some code to find element
        // HANDLE: $(DOMElement)
    } else if ( selector.nodeType ) {
        this.context = this[0] = selector;
        this.length = 1;
        return this;

        // HANDLE: $(function)
        // Shortcut for document ready
    } else if ( jQuery.isFunction( selector ) ) {
        return typeof rootjQuery.ready !== "undefined" ?
            rootjQuery.ready( selector ) :
            // Execute immediately if ready is not present
            selector( jQuery );
    }

    if ( selector.selector !== undefined ) {
        this.selector = selector.selector;
        this.context = selector.context;
    }

    return jQuery.makeArray( selector, this );
}

上面代码中的“return this”导致返回没有任何项目的jquery对象数组。

所以下面的代码没有将事件处理程序分配给任何元素:

$().keydown( /*handler*/ );

【讨论】:

    【解决方案2】:

    keydown():在键盘上按下某个键时触发的事件。

    $(document).ready() 让您的事件在窗口加载之前加载您希望它们执行的任何操作,其括号内的所有内容都已准备好尽早执行。 DOM 被浏览器注册后。

    【讨论】:

    • 这不能回答我的问题。
    【解决方案3】:

    区别在于

    .ready() 方法只能在匹配的 jQuery 对象上调用 当前文档,所以选择器可以省略。

    引自 https://api.jquery.com/ready/)而 keydown 方法 (docs here) 可在 jQuery 对象上调用以附加句柄,以便检测何时按下键。
    因此,它与 ready 方法不同,后者仅在 DOM 加载准备就绪后调用。

    【讨论】:

      【解决方案4】:

      $() 不等同于 jQuery 1.4+ 中的 $(document)$() 是一个空的 jQuery 对象。

      一位 jQuery 开发人员的官方回答:

      $().ready(fn) 之所以有效,是因为 $() 曾经是 $(document) 的快捷方式 (jQuery
      所以$().ready(fn) 是一个可读的代码。

      但人们过去常常做$().mouseover() 和其他各种疯狂的事情。人们必须通过$([]) 来获得一个空的 jQuery 对象

      所以在 1.4 中我们对其进行了更改,因此 $() 给出了一个空的 jQuery,我们只是让 $().ready(fn) 工作,以免破坏大量代码。

      $().ready(fn) 现在实际上只是在核心中进行了修补,以使其在旧案例中正常工作。

      来源:Q: Why “$().ready(handler)” is not recommended?

      $().ready( /*handler*/ ) 是一种特殊情况,这就是它起作用的原因。

      【讨论】:

        猜你喜欢
        • 2022-01-25
        • 1970-01-01
        • 2012-01-13
        • 1970-01-01
        • 2013-01-08
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多