2009-02-16 18 views
10

Tengo una serie de miniaturas de imágenes en una página. Se crean usando sprites css.Encontrar nombre de clase coincidente en jQuery

<div class="galleryImg1"></div> 
<div class="galleryImg2 featured"></div> 
<div class="galleryImg3"></div> 

que estaba originalmente usando id="galleryImg1" pero cambió a la utilización de class="galleryImg1" porque las imágenes pueden aparecer en varios lugares en la misma página y que quería evitar identificadores duplicados.

Tengo un selector jQuery para adjuntar eventos de clic a todas estas clases.

$("[class^=galleryImg]").click(function() { 
    // how do i get 'galleryImg2' and '2' here? 
} 

Lo que me pregunto es si hay una manera fácil de averiguar la className comenzando con 'GALLERYIMG' que se hizo clic en. ¿Tendré que usar una expresión regular o hay una manera 'más inteligente'?

(sí, si yo estaba usando un selector #ID entonces yo sólo pude decir 'this.id' pero como se mencionó que no quiero utilizar identificaciones porque quiero mostrar varias copias de la misma imagen.)

Respuesta

19

Por lo que yo sé, vas a necesitar una expresión regular bastante básico, así:

$("[class^=galleryImg]").click(function(Event) { 
    var id = this.className.match(/galleryImg(\d+)/)[1]; 
    console.log(id); 
}); 

Sin embargo, si eres particularmente reacio a esto, puedes usar algo como esto, que no validará, pero que lo hará.

<div class="galleryImg1" image_id="1"></div> 
<div class="galleryImg2 featured" image_id="2"></div> 
<div class="galleryImg3" image_id="3"></div> 

<script> 
$("[class^=galleryImg]").click(function(Event) { 
    var id = $(this).attr('image_id'); 
    console.log(id); 
}); 
</script> 

Desde que estoy asumiendo que tienen un control total sobre su HTML y usted sabe que la clase GALLERYIMG siempre será seguido por el ID No creo que una expresión regular aquí es malo en absoluto. ¡Sígueme el rollo!

+0

trabajo hecho :-) gracias. Además, nunca recuerdo la sintaxis de las expresiones regulares en javascript a pesar de ser bastante hábil con ellos en .NET :-) –

+0

Si tiene varias clases dentro del atributo de clase de una etiqueta, es posible que esto no funcione como se esperaba. Esto no busca cada clase individual sino el atributo de clase como un todo. El comodín contiene '* =' es útil en ese escenario. –

1

Puede usar un Regex, pero el uso de split e indexof será entendido por más programadores. También por algo tan simple, quizás sea mejor evitar Regex.

En el controlador de eventos utilizar el jQuery normalizado objeto de evento:

$("[class^=galleryImg]").click(function(Event) { 
    var classAttribute=Event.target.className 

    var classes=classAttribute.split(" "); 

    for (var i=0;i<classes.length;i++) 
    { 
     if (classes[i].indexOf('targetClassNamePrefix')==0) 
     { 
      // This element has the required class, do whatever you need to. 

     } 
    } 
} 
+0

El quiere llegar con el ID de eso, sin embargo. –

+0

@ash el problema con esto es que puede haber varias clases. me olvidé de * explícitamente * mencionar eso, pero es por eso que puse un nombre de clase con 'galleryImg2 featured' –

+0

. Sabía que tienes nombres de clases múltiples, aunque pensé que estabas pidiendo que realmente obtuvieras la clase para el elemento cliqueado. También actualicé mi respuesta, Regex es más lenta que usar Javascript split y luego, indexOf() == 0. – Ash

2

Lo que hago es algo como esto:

<div class="galleryImg 1"></div> 
<div class="galleryImg 2 featured"></div> 
<div class="galleryImg 3"></div> 

<script> 
$(".galleryImg").click(function(Event) { 
    var Class = $(this).attr('class').split(" "); 
    var id = Class[1] 
}); 
</script> 
+0

No hay forma de garantizar que el número sea la segunda clase de la lista, especialmente si manipulas el dom de alguna manera. Esto podría ser modificado por jQuery o posiblemente incluso interpretado de manera diferente entre los navegadores. – redbmk

+0

Además, para el registro, no puede (válidamente) comenzar un nombre de clase con un número. – James

Cuestiones relacionadas