2011-08-26 11 views
38

Supponiamo ho questo markupControllare se elemento è prima o dopo un altro elemento in jQuery

<h3 id="first">First</h3> 
<p>Hi</p> 
<p>Hello</p> 
<h3 id="second">Second</h3> 
<p>Bye</p> 
<p>Goodbye</p> 

Come posso programmazione verificare se un elemento, come ad esempio uno dei p s, è dopo la prima h3 e prima del secondo h3, con jQuery?

sto cercando di fare qualcosa di simile:

$(p).each(function(){ 
    if($(this).isAfter("#first") && $(this).isBefore("#second")) { 
    // do stuff 
    } 
}); 
+2

Stai chiedendo che sia direttamente dopo e prima o solo da qualche parte lungo la linea fratello? –

+0

@Amin da qualche parte lungo la linea fratello –

risposta

43

per vedere se un elemento è dietro l'altro, è possibile utilizzare prev() o prevAll() per ottenere l'elemento precedente (s), e vedere se corrisponde.

E per vedere se un elemento è prima di un altro, è possibile utilizzare next() o nextAll() per ottenere gli elementi successivi, e vedere se corrisponde.

$.fn.isAfter = function(sel){ 
    return this.prevAll(sel).length !== 0; 
} 
$.fn.isBefore= function(sel){ 
    return this.nextAll(sel).length !== 0; 
} 

DEMO: http://jsfiddle.net/bk4k7/

+4

Boo, risposta sbagliata! Risultati in falsi positivi/non supporta array di risultati jQuery. Vedi http://jsfiddle.net/qw7s8bgn/ Si prega di utilizzare la risposta di Marco invece. – nothingisnecessary

+1

Dai un'occhiata anche ai tipi di approccio .index() di elementi per confrontare la loro posizione. Sembra per me più leggibile :) –

2

Ecco un fiddle

$('p').each(function() { 
    previousH3 = $(this).prevAll('h3'); 
    nextH3 = $(this).nextAll('h3'); 

    if (previousH3.length > 0 && nextH3.length > 0) { 
     $(this).css('color', 'red') 
    } 

}); 
21

È possibile utilizzare la funzione index():

$('p').each(function(){ 
    var index = $(this).index(); 
    if(index > $("#first").index() && index < $("#second").index()) { 
    // do stuff 
    } 
}); 
1

La risposta:

$.fn.isAfter = function(sel){ 
    return this.prevAll(sel).length !== 0; 
} 
$.fn.isBefore= function(sel){ 
    return this.nextAll(sel).length !== 0; 
} 

sceglieva tutti gli elementi precedenti o successivi elementi indipendentemente dal selettore (SEL) quindi apportate le seguenti modifiche che selezionano elementi in base alla classe: soluzione

$.fn.isAfter = function(sel){ 
    sel = "." + sel.attr("class").replace(/ /g, "."); 

    return this.prevAll(sel).length !== 0; 
} 
$.fn.isBefore= function(sel){ 
    sel = "." + sel.attr("class").replace(/ /g, "."); 

    return this.nextAll(sel).length !== 0; 
} 
43

Rocket funziona bene se sel è una vera selettore , se passi un oggetto jquery, non funzionerà.

Se si desidera un plugin che funziona con entrambi i selettori e gli oggetti jQuery, basta usare la mia versione leggermente modificata, invece:

(function($) { 
    $.fn.isAfter = function(sel){ 
     return this.prevAll().filter(sel).length !== 0; 
    }; 

    $.fn.isBefore= function(sel){ 
     return this.nextAll().filter(sel).length !== 0; 
    }; 
})(jQuery); 

Complimenti a razzo per la soluzione originale.

+0

Yay! Risposta esatta. Supera i test, incluso il confronto del selettore su se stesso: http://jsfiddle.net/k4g0339m/ – nothingisnecessary

+1

Questo è l'approccio migliore +1 – jherax

+4

funzionante solo se elementi allo stesso livello http://jsfiddle.net/k4g0339m/19/ – forX

0

Tenendo risposta mente di Rocket Io preferisco usare .index() approccio come segue:

$.fn.isAfter = function(sel){ 
    return $(this).index() > $(sel).index(); 
}; 
$.fn.isBefore= function(sel){ 
    return $(this).index() < $(sel).index(); 
}; 

sembra più chiaro per la lettura/comprensione e funziona perfettamente in selezione righe.

Problemi correlati