Los motores de selector de marco generalmente se evalúan con la mano derecha, por lo que esperaría un selector de ID contextual a document.getElementById
la ID y luego verificar si los resultados estaban en el nodo de contexto incrementando el parentNode
s. Esto es razonablemente rápido, pero no funcionará para árboles DOM fuera del documento como en este ejemplo. Los motores de selección tendrían que hacerlo de forma desesperadamente lenta, o no les importa (por ejemplo, Sizzle no funciona con DocumentFragment
).
Hay una forma mejor de obtener la ID dentro de un fragmento que he recordado desde entonces, para los navegadores que implementan Selectors-API (IE8, Firefox 3.5, Opera 10, Safari 3.1, Chrome 3). Puede utilizar querySelector
aplicar un selector CSS con el DocumentFragment
como un nodo de contexto, ya que la API requiere DocumentFragment
implementos NodeSelector
:
alert(frag.querySelector('#myId'))
Esto no es tan rápido como getElementById
, pero es muchísimo mejor que la versión DOM .
Desafortunadamente la mayoría de los marcos que tienen optimizaciones Selectores-API no las van a utilizar en este caso o cualquier otro con nodos de contexto, porque la forma en que funciona el nodo de contexto es diferente en querySelector
[All
] a cómo los marcos implementados tradicionalmente, haciéndolos incompatibles.
Selectors-API Level 2 propone métodos de 'ámbito' que se comportan como los selectores de marcos tradicionales ... pasará un tiempo antes de que se pueda usar, pero probablemente no veremos selectores contextuales optimizados en los marcos existentes hasta entonces. Creo que es una lástima, ya que aunque el método querySelector
de usar el nodo de contexto para el filtrado pero no el alcance no es tan bueno, todavía es bastante útil para todos los casos comunes.
No debería sorprenderlo. Inmediatamente después del código, explícitamente sugiere no usarlo: "Seguramente sería mejor seguir las referencias a medida que avanzas que confiar en una función ingenua y de bajo rendimiento como la anterior". –
la sorpresa fue que el orden o magnitud: 1000. Esperaba algo entre 2 y 100. – Olivvv