2012-03-22 20 views
8

Ecco il mio violino: http://jsfiddle.net/jamesbrighton/wxWgG/4/jQuery selezionare primo elemento che ha una certa classe dopo questo

HTML:

<div> 
    <p class="click">Click 1</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 1</p> 
</div> 
<div> 
    <p class="target">Target 2</p> 
</div> 


<div> 
    <p class="click">Click 2</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 3</p> 
</div> 
<div> 
    <p class="target">Target 4</p> 
</div> 

jQuery:

$('.click').click(function() { 
    $(this).nextAll('.target').css('color','red'); 
});​ 

ne ho bisogno in modo che quando si fa clic su a p.click, il prossimo p.target diventa rosso.

Quindi, se si fa clic su 'Click 1' allora 'Target 1' diventa rosso. Se fai clic su 'Click 2' allora 'Target 3' diventa rosso.

Così come .find ho provato .closest e dalla documentazione di jQuery mi sembra che dovrebbe funzionare. Come puoi vedere dal codice HTML, .target non è figlio di .click, nel caso in cui ciò faccia la differenza.

+0

nextAll funziona sui fratelli, non al di fuori dei suoi genitori. Quindi devi dirci come vuoi attraversare .. se vuoi che i genitori fratelli siano figli allora è possibile. –

+1

Il tuo esempio non è molto buono, contiene solo un elemento "Click". Come sono associati i "Click" e "Target"? Sono entrambi in ordine, ovvero se viene cliccato il secondo "Click", se il secondo "Target" è evidenziato, ecc.? * modifica: * apparentemente hai collegato il violino sbagliato. Ecco perché dovresti sempre includere anche il codice. –

+0

Non vedo un "clic 1" o un "clic 2". Il tuo codice è aggiornato? –

risposta

11

Ecco un altro approccio, anche se non so quanto sia performante .index() in questo caso. Ciò presuppone anche che ci sono mai due consecutivi .click elementi (o formulata diversamente: c'è sempre almeno un .target elemento tra due .click elementi):

var $elements = $('.click, .target'); 

$('.click').click(function() { 
    $elements.eq($elements.index(this) + 1).css('color','red'); 
});​ 

DEMO

Questo funziona perché gli elementi sono selezionati l'ordine in cui appaiono nel documento.

+1

Clever and nice. –

0

Il costrutto HTML non facilita l'accesso a un obiettivo specifico. Possiamo ottenere ciò che vuoi ma la sceneggiatura diventerà complicata quando attraverserai in questo modo. Invece, aggiungi un div di raggruppamento che ti renderà lo script piccolo e facile.

DEMO

HTML:

<div class="group"> <!-- added grouping wrapper --> 
<div> 
    <p class="click">Click 1</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 1</p> 
</div> 
<div> 
    <p class="target">Target 2</p> 
</div> 
</div> 
<div class="group"> 
<div> 
    <p class="click">Click 2</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 3</p> 
</div> 
<div> 
    <p class="target">Target 4</p> 
</div> 
</div> 

JS:

$('.click').click(function() { 
    $(this).closest('.group').find('.target').css('color','red'); 
}); 

.nextAll lavora sul fratello. Nel tuo caso, cercherà il fratello di tutti i clic con la classe .target.

Quello che ti serve è parents -> sibling -> child.

DEMO

$('#click').click(function() { 
    $(this).parent().siblings().find('.target').css('color','red'); 
}); 
+0

Solo il prossimo' .target' dovrebbe diventare rosso. Questo rende tutto '.target' diventa rosso – Ropstah

+0

Questo funziona, ma si interrompe se aggiungo un altro div attorno al div che cont entra in p.click. Penso di capire perché questo sta accadendo, ma c'è un modo per trovare il prossimo elemento con una certa classe, indipendentemente da come è nidificato? – Evans

0

Si può provare questo.

$('#click').click(function() { 
    var go = true; 

    var item = $(this).parent(); 

    while(go && item) { 
     var target = $('.target', item)[0]; 

     if(target != null) { 
      go = false; 
      $(target).css('color', 'red'); 
     } 

     item = $(item).next()[0]; 
    } 
});​ 
3

Questo seleziona gli elementi necessari nel codice HTML:

$('.click').click(function() { 
    $(this).parent("div").next('div').find('.target').css('color','red'); 
});​ 
6

Sei alla ricerca di questo?

$('.click').click(function() { 
    $(".target", $(this).parent().next()).css('color','red'); 
}); 

Updated Fiddle

+0

Funziona, ma si interrompe se aggiungo un altro div attorno al div che cont entra in p.click. Penso di capire perché questo sta accadendo, ma c'è un modo per trovare il prossimo elemento con una certa classe, indipendentemente da come è nidificato? – Evans

+2

Il tuo HTML dovrebbe avere una struttura fissa o devi definire in modo molto chiaro quali casi vuoi che siano coperti. jQuery non può leggere la mente :) Finché è possibile definire il layout, ci sarebbe un modo, ma la definizione deve essere coerente e precisa. –

1

Sulla base di codice HTML aggiornato, ho creato questo violino: http://jsfiddle.net/wxWgG/22/

... e usato questo jQuery

$('.click').click(function() { 
    $(this).parent().next().find('p.target').css('color','red'); 
});​ 

E 'questo quello che volevi?

+0

Funziona, ma si interrompe se aggiungo un altro div attorno al div che cont entra in p.click. Penso di capire perché questo sta accadendo, ma c'è un modo per trovare il prossimo elemento con una certa classe, indipendentemente da come è nidificato? – Evans

+0

Il tuo codice HTML nell'OP dovrebbe indicare l'HTML con cui vuoi lavorare! Vedi la risposta di Felix Kling - sembra che sarà indipendente dalla struttura. Altrimenti, aggiorna l'OP e attendi un'altra serie di risposte aggiornate .... – SpaceBison

Problemi correlati