2011-09-14 4 views
6

Lottando con questo per un po 'di tempo. Il mio markup semplificato:Inserisci nuovo DIV tra due DIV che hanno la stessa classe e sono fratelli immediati

<div class=row> 
    <div class="somediv"></div> 
    <div class="somediv2"></div> 
    <div class="elem"></div> 
    <div class="elem"></div> 
    <div class="somediv3"></div> 
    <div class="somediv4"></div> 
<div class=row> 
.... 

Ho bisogno di trovare un modo per selezionare tutti i div documento pronto che: 1. ha una classe: elem 2. loro prossimo DIV ha anche il nome della classe: elem. poi ho bisogno di inserire un nuovo DIV tra di loro:

<div class=row> 
    <div class="somediv2"></div> 
    <div class="elem"></div> 
    <div class="new"></div> 
    <div class="elem"></div> 
    <div class="somediv3"></div> 
    <div class="somediv4"></div> 
<div class=row> // and it goes... 


$(document).ready(function() { 
    if($('.elem').next().hasClass('.elem')) { 
     $('<div class="new"></div>').appendTo().prev('.elem'); 
    } else { 
    }); 
}); 

risposta

13

Prova questa:

$(document).ready(function() { 
    $('.elem + .elem').before($('<div class="new"></div>')); 
}); 

E 'con il selettore fratello adiacente di CSS (+). Trova un elemento con classe .elem con un altro elemento con classe .elem immediatamente precedente, quindi aggiunge un nuovo div prima di esso.

Fiddle: http://jsfiddle.net/4r2k4/

+0

bene - Mi piace la tua risposta migliore del mio! http://jsfiddle.net/mrtsherman/kvg8N/1/ – mrtsherman

+0

Grazie per i violini. Ho dimenticato di menzionare (mi dispiace) che l'html sia generato da javascript. I tuoi codici funzionano e sono semplici da capire su una pagina normale, ma suppongo che a causa del contenuto generato questo non funzioni per me. Quando utilizzo l'evento click, aggiungo semplicemente live() alla funzione, come posso fare qualcosa di simile in questo caso? – elbatron

+0

Funziona se lo allego ad un evento click nell'ambiente sopra citato. – elbatron

2

il codice sia abbastanza buono per me. Non hai solo bisogno di avvolgerlo in un each in modo che si accenda su ciascuno di essi?

$(document).ready(function() { 
    $('.elem').each(function() { 
    if($(this).next().hasClass('.elem')) { 
     $('<div class="new"></div>').appendTo().prev('.places'); 
    } else {} 
    }); 
}); 
3

La soluzione non jQuery:

var divs, str; 

divs = document.getElementsByClassName('elem'); 

[].slice.call(divs).forEach(function (div) { 
    str = ' ' + div.nextElementSibling.className + ' '; 
    if (str.indexOf(' elem ') !== -1) { 
     div.insertAdjacentHTML('afterend', ' <div class="new">X</div> '); 
    } 
}); 

demo dal vivo:http://jsfiddle.net/2MfgB/2/

"Ma Šime, questo non funziona in IE8 ...":P


Aggiornamento:
Soluzione alternativa:

var divs = document.querySelectorAll('.elem + .elem'); 

[].slice.call(divs).forEach(function (div) { 
    div.insertAdjacentHTML('beforebegin', ' <div class="new">X</div> '); 
}); 

demo dal vivo:http://jsfiddle.net/2MfgB/3/

+0

Grazie per la versione JS. – elbatron