2010-01-07 38 views
12

Estoy intentando seleccionar un elemento HTML en mi página que tenga una clase e ID específicas. Aquí está la etiqueta:Selectores de JQuery: cómo seleccionar un elemento con una clase específica * y * id

<div class="statusLight" id="green"></div> 

He intentado esto sin suerte:

$statusLight = $('.statusLight#green'); 

Sé que yo podría simplemente decir

$statusLight = $('#green'); 

Pero yo estaba tratando de encontrar una forma para seleccionarla basado en su clase también. Cualquier ayuda sería apreciada.

+5

¿Por qué le gustaría seleccionar por clase si conoce la identificación? Por diseño, los ID son únicos, por lo tanto, esta sería la forma más rápida de seleccionar un elemento. – cfbarbero

+1

No entiendo. La identificación debe ser ÚNICA y finalizar todo el filtrado. Aplicar cualquier cosa + identificación debe ser exactamente lo mismo que seleccionar solo por ID. ¿Por qué querrías hacer esto alguna vez? –

+0

En cualquier caso, estoy bastante seguro de que jQuery se detiene cuando encuentra la primera instancia de un selector con una ID, lo que imposibilita la diferenciación de clases de ID duplicados. –

Respuesta

17

Ambos #green.statusLight y .statusLight#green son selectores válidos y deben seleccionar el elemento que está buscando. El primero será más rápido sin embargo.

¿Está usando $(...) después de cargar el documento, es decir, desde $(document).ready(function() { ... }) o colocando el script después de su elemento?

+0

Gracias Peter por el Respuesta rápida. En realidad, terminó siendo un error tipográfico con "Luz" en lugar de "luz". Ambos métodos que diste terminaron trabajando. – BAHDev

11

No estoy del todo seguro de por qué querría hacer esto.

Una ID debe ser única, y por lo tanto cuando la seleccione, no hay necesidad de más especialización. Si no, entonces necesita modificar su HTML para hacerlo.

Este escenario solo tendría sentido si estuviera combinando un selector de clase con un selector de elementos, p.

$("div.statuslight") 

Pero en su ejemplo, no tiene sentido, ¡ya que tiene una identificación de todos modos!

+0

James, estoy de acuerdo contigo. Realmente es más legible en mi código, pero tiene razón ... todas las identificaciones son únicas de todos modos, entonces ¿por qué hay que filtrarlas más? Mi problema terminó siendo un error tipográfico por cierto ... – BAHDev

+8

Existe el caso en el que desea hacer delegación de eventos en un elemento solo cuando tiene una clase. Supongamos que tiene un elemento arrastrar y soltar y solo desea que se pueda hacer clic en él cuando se le ha asignado una determinada clase (mediante algún tipo de interacción). –

3

¿Por qué debería seleccionar también en la clase? Los ID deben ser únicos, por lo que agregar la clase a eso no le compraría nada. Si solo usa ID, es más eficiente porque entonces jQuery solo puede usar el getElementByID nativo, que siempre es el más rápido. Mantenga sus consultas simples cuando pueda.

+0

@Parrots, estoy de acuerdo. Esto es más una cuestión de legibilidad en mi código que una necesidad funcional. Gracias por el consejo. – BAHDev

+6

Una razón para hacer esto puede ser que la clase del elemento cambie y él quiera seleccionar el elemento solo cuando haya dado la clase. (Ok, solo adivinando, pero el punto es que puede haber una razón para esto). [repitiendo el mismo comentario que el anterior] –

0

Otra razón por la que probablemente haría esto es si tiene un código genérico almacenado en caché buscando un Id específico, pero solo desea activarlo cuando tenga asignado un estilo específico. Especialmente cuando renderiza elementos MVC escamados donde los ID pueden estar en ciertas vistas, pero no desea que se tomen medidas, digamos ... campos de id "ocultos", pero en otras vistas estos pueden ser valores de búsqueda en un combo y tienen un complemento Seleccionar2 asignado ...

0

la forma más sencilla es:

$('.statusLight[id=green]');

a medida que el id es un atributo puede utilizar el selector de atributos

2

$(".class#id") o $("#id.class") será tanto trabajo.

Todos los comentarios en esta pregunta es que no hay ninguna razón para hacer esto ... puede que no exista un motivo de "mejores prácticas" para hacer esto con un programa bien diseñado, pero en el mundo real la mayoría de nosotros trabajamos en empresas que tienen bases de código que no están muy bien organizadas y si está trabajando en un gran programa de archivos de 10.000+, es posible que no desee reemplazar una identificación no descriptiva y al agregar una clase al selector puede ayudar a sus compañeros codificadores a entender de dónde vino el ID.

El caso en cuestión, yo trabajo en un proyecto en el que tenemos DIV contenedor que crean "widgets" en la página ... estos "widgets" se les da una identificación numérica de la base de datos, por lo que terminan con <div id="12345" class="widget"> de

Alguien más ha codificado la id ambigua mucho antes de trabajar aquí ... pero sigue siendo así. Cuando escribo JQuery, preferiría no confundir más el código ... así que en lugar de $("#12345") podría preferir $(".widget#12345") para que alguien no tenga que pasar media hora tratando de descubrir que el 12345 id en este escenario es para un widget.

Si bien $("#12345") y $(".widget#12345") selecciono lo mismo ... hace que el código sea mucho más legible para mis compañeros de trabajo y eso es más importante que una fracción de segundo en la mejora de velocidad para el javascript.

+0

¡De hecho! Otro caso de uso, estoy usando comodines en mi selector ID [id^= lightbox_flex_field_flex_field_] y también necesito obtener clases en algunos casos para diferenciarlos, ya que los usuarios pueden definir tipos de campo ellos mismos ... – rept

0

Sólo un seguimiento de su información:

Si usted está buscando para hacer referencia a un ID y una sub-clase (por ejemplo, el statusLight verde pero no el azul):

<div id="green"> 
    <div class="statusLight"></div> 
</div> 

<div id="blue"> 
    <div class="statusLight"></div> 
</div> 

Luego hay que añadir un espacio $("#green .statusLight")

Cuestiones relacionadas