如果你通过ID在jQuery中选择一个元素,那么通过给它一个上下文仍然可以提高速度吗?

时间:2010-03-15 12:38:03

标签: javascript jquery

想象一下这个简化的标记:

<div id="header">
   <!-- Other things.... -->
   <div id="detail">

   </div>
</div>

并假设您已经拥有此代码:

var $hdr = $("#header");

jQuery以这种方式查找“详细信息”是否有任何速度差异:

var $detail = $("#detail", $hdr);

VS

var $detail = $("#detail");

由于ID正在查找详细信息?

3 个答案:

答案 0 :(得分:7)

不,你不必这样做。由于id在文档中是唯一的,因此无需添加任何其他优化。

我会选择

var $detail = $("#detail");

答案 1 :(得分:6)

没有。传递上下文实际上会使速度变慢。来自jQuery的相关源代码在下面给出了解释。

这段代码基本上说:

  1. If(选择器是HTML字符串 或者是id,和(或者是 特别是HTML或没有上下文 给定)) 1.a然后做一些事情,比如调用document.getElementById()
  2. 否则评估上下文,然后运行选择器
  3. 这是剥离的来源..

    init: function( selector, context ) {
        ...
        if ( typeof selector === "string" ) {
            ...
            // This gets ignored because we passed a context
            // document.getElementById() isn't called directly
            if ( match && (match[1] || !context) ) {
                ...
                } else {
                    elem = document.getElementById( match[2] );
                    ...
                }
            ...
            // Either this gets executed if a jQuery wrapped context was passed
            } else if ( !context || context.jquery ) {
                return (context || rootjQuery).find( selector );
            }
            // Or this gets executed, if a simple selector was passed as context
            } else {
                return jQuery( context ).find( selector );
            }
        ...
    }
    
      

    match是常规的结果数组   表达式,以找出选择器   是 HTML字符串 id   表达。如果是HTML字符串,   然后将填充匹配[1]。   如果它是一个id(#someId),那么   将填充match[2]

答案 2 :(得分:2)

答案在于如何存储ID。分配的ID保存在类似哈希的数据结构中。如果搜索完全限定的ID(不是[id * =“foo”]),那么所需的定位时间应该是最快的,没有任何修饰符,因为它是直接散列查找。