2009-02-16 17 views
10

Ho una serie di miniature di immagini in una pagina. Sono creati usando gli sprite css.Ricerca nome classe corrispondente in jQuery

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

Mi è stato originariamente usando id="galleryImg1" ma cambiato di utilizzare class="galleryImg1" perché le immagini possono apparire in più posti sulla stessa pagina e ho voluto evitare di ID duplicati.

Ho un selettore jQuery per allegare eventi di clic a tutte queste classi.

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

Quello che mi chiedo è se c'è un modo semplice per scoprire il className inizia con 'GALLERYIMG' che è stato cliccato. Dovrò usare un'espressione regolare o c'è un modo 'più intelligente'?

(sì se stavo usando un selettore #ID quindi ho potuto solo dire 'this.id' ma come già detto io non voglio usare gli ID perché voglio visualizzare più copie della stessa immagine.)

risposta

19

Per quanto ne so, si sta andando ad avere bisogno di un'espressione regolare piuttosto semplice, in questo modo:

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

Se sei particolarmente contrario a questo, però, puoi usare qualcosa di simile, che non verrà convalidato ma otterrà il lavoro fatto.

<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> 

Dato che io parto dal presupposto che si ha il pieno controllo sul codice HTML e si sa che la classe GALLERYIMG sarà sempre seguito dal ID non credo un'espressione regolare qui è il male a tutti. Vai e basta!

+0

lavoro finito :-) grazie. Inoltre non ricordo mai la sintassi delle espressioni regolari in javascript nonostante sia abbastanza abile con loro in .NET :-) –

+0

Se hai più classi all'interno dell'attributo class di un tag, allora questo potrebbe non funzionare come previsto. Questo non è la ricerca di ogni singola classe, ma piuttosto l'attributo di classe nel suo complesso. Il carattere jolly contiene '* =' è utile in questo scenario. –

1

È possibile utilizzare un Regex, ma l'uso di split e indexof sarà compreso da più programmatori. Anche per qualcosa di così semplice, forse meglio evitare Regex.

Nel gestore eventi utilizzare il normalizzata oggetto Event jQuery:

$("[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

Lui vuole venire con l'ID di questo, però. –

+0

@ash il problema con questo è ci possono essere più classi. Ho dimenticato di * esplicitamente * menzionarlo, ma questo è il motivo per cui ho inserito un nome di classe con 'galleryImg2 in primo piano' –

+0

Sapevo che avevi nomi di classe multipl, ma ti stavo solo chiedendo di ottenere effettivamente la classe per l'elemento cliccato. Ho anche aggiornato la mia risposta, Regex è più lento quindi usando solo la divisione Javascript e poi, indexOf() == 0. – Ash

2

Quello che faccio è qualcosa di simile:

<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

Non c'è modo di garantire che il numero sia la seconda classe nell'elenco, specialmente se si manipola il dom in alcun modo. Questo potrebbe essere modificato da jQuery o eventualmente interpretato in modo diverso tra i browser. – redbmk

+0

Inoltre, per la cronaca, non è possibile (validamente) avviare un nome di classe con un numero. – James

Problemi correlati