2010-03-15 6 views
7

imaginar esto de marcado simplificado:Si selecciona un elemento en jQuery por ID, ¿hay todavía una mejora de velocidad al darle un contexto?

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

    </div> 
</div> 

y asumir que ya tiene este código:

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

¿Hay alguna diferencia de velocidad de jQuery para las operaciones de búsqueda "detalle" de esta manera:

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

vs

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

Dado que los detalles se buscan por ID?

Respuesta

7

No, usted no tiene que hacer eso. Como id es único en un documento, no es necesario agregar ninguna otra optimización.

Me gustaría ir con

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

y he visto una documentación fiable con las pruebas para demostrar que es más lento con el contexto cuando se incluye el ámbito de aplicación, simplemente no puede encontrar el enlace en el momento. –

6

Nº Pasando un contexto en realidad hacer que sea más lenta. El código fuente relevante de jQuery se proporciona a continuación con una explicación.

Este código básicamente dice:

  1. Si (el selector es una cadena HTML o un ID y (ya sea que es específicamente HTML o ningún contexto está dado )) 1.a entonces algunos cosas como llamar document.getElementById()
  2. evaluar lo contrario, el contexto y ejecute el selector

y aquí está la quitó fuente ..

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 es la matriz resultante de un expresión regular para averiguar si el selector es o bien una cadena HTML, o un Identificación expresión. Si se trata de una cadena HTML, , se completará la coincidencia [1]. Si se trata de un identificador (#someId), entonces match[2] se llenará.

+0

+1, incluso sin siquiera mirar la fuente es lógico pensar que será más lento si los selectores de ID están bien optimizados remotamente, ya que agregar un contexto agrega una segunda condición para verificar. – eyelidlessness

+0

No estoy seguro de si agregar una condición simple para ignorar el contexto en el caso de los selectores de ID tendrá algún efecto notable. Una razón para tenerlo así, me imagino, es proporcionar acceso a los elementos que tienen una identificación duplicada. Sé que no es bueno e ilegal, depende del navegador y eso, pero 'document.getElementById' siempre devuelve la primera coincidencia. Sin embargo, el uso de '$ ('# id', someContext)' le permitirá acceder a un segundo, tercer, cuarto ... elemento con la misma identificación exacta. – Anurag

2

La respuesta está en cómo se almacenan los documentos de identidad. Las ID asignadas se mantienen en una estructura de datos tipo hash. Si busca una ID completamente calificada (no [id * = "foo"]), entonces el tiempo de localización requerido debe ser más rápido sin ningún modificador porque es una búsqueda directa de hash.

Cuestiones relacionadas