2009-05-20 36 views
21

¿Cuál es la forma más fácil de encontrar elementos Dom con un selector css, sin usar una biblioteca?La mejor manera de encontrar elementos DOM con selectores css

function select(selector) { 
return [ /* some magic here please :) */ ] 
}; 

select('body')[0] // body; 

select('.foo') // [div,td,div,a] 

select('a[rel=ajax]') // [a,a,a,a] 

Esta pregunta es puramente académica. Estoy interesado en aprender cómo se implementa esto y cuáles son los "inconvenientes". ¿Cuál sería el comportamiento esperado de esta función? (return array, o return first Dom element, etc).

Respuesta

4

En estos días, hacer este tipo de cosas sin una biblioteca es una locura. Sin embargo, supongo que quieres aprender cómo funciona esto. Sugiero que busque en la fuente de jQuery o en alguna de las otras bibliotecas de JavaScript.

Teniendo esto en cuenta, la función de selector debe incluir una gran cantidad de if/else/else if o cambiar las instrucciones de la caja para manejar todos los diferentes selectores. Ejemplo:

function select(selector) { 
if(selector.indexOf('.') > 0) //this might be a css class 
    return document.getElementsByClassName(selector); 
else if(selector.indexOf('#') > 0) // this might be an id 
    return document.getElementById(selector); 
else //this might be a tag name 
    return document.getElementsByTagName(selector); 
//this is not taking all the different cases into account, but you get the idea. 
}; 
+2

No necesariamente: mira Sizzle (el motor de jQuery) y no verás nada de esto. – James

+5

Esto no es necesario en los navegadores modernos. querySelectedAll() es una mejor solución. – freeone3000

0

No, no hay un camino incorporado. Esencialmente, si decides ir sin jQuery, estarás replicando una versión defectuosa de él en tu código.

+2

Para ser justos, JQuery no es la única biblioteca que ofrece funcionalidad de selector de estilo, solo la más destacada. –

+1

Sí, por supuesto. Por "sin jQuery", quiero decir sin una biblioteca externa de elección. –

3

Crear un motor de selección no es tarea fácil. Yo sugeriría aprender de lo que ya existe:

  • Sizzle (Creado por Resig, utilizado en jQuery)
  • Peppy (Creado por James Donaghue)
  • Sly (Creado por Harald Kirschner)
+0

¡Grandes enlaces! Muy interesante. Especialmente ese corredor de prueba de rendimiento. –

68

Además de los cortes personalizados, en los navegadores recientes se pueden utilizar los métodos nativos definidos en el W3C Selectors API Level 1, a saber document.querySelector() y document.querySelectorAll ():

var cells = document.querySelectorAll("#score > tbody > tr > td:nth-of-type(2)"); 
+6

+1 para una solución simple que no requiere una biblioteca. – starbeamrainbowlabs

+3

Los documentos y el navegador son compatibles con https://developer.mozilla.org/en-US/docs/Web/API/Document.querySelectorAll – Michael

+4

Esta debería ser ahora la respuesta seleccionada. ¿Se admiten todos los navegadores modernos, excepto IE7? ¡En agosto de 2013, eso es suficiente para mí! – cronoklee

Cuestiones relacionadas