2011-09-14 11 views
6

Walcząc z tym od jakiegoś czasu. Mój znaczników uproszczone:Włóż nowy DIV między dwa DIV, które mają tę samą klasę i są natychmiastowymi rodzeństwami

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

muszę znaleźć sposób, aby wybrać wszystkie DIV na dokument gotowy że: 1. ma klasę: Elem 2. Kolejnym DIV ma także nazwę klasy: Elem. Potem trzeba wstawić nowy DIV między nimi:

<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 { 
    }); 
}); 

Odpowiedz

13

Spróbuj tego:

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

To użyciu sąsiadujący selektora CSS za rodzeństwo (+). Znajduje element o klasie .elem z innym elementem o klasie .elem bezpośrednio przed nim, a następnie dodaje nowy div przed nim.

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

+0

porządku - Lubię swoją odpowiedź lepiej niż ja! http://jsfiddle.net/mrtsherman/kvg8N/1/ – mrtsherman

+0

Dzięki za skrzypce. Zapomniałem wspomnieć (przepraszam), że html jest generowany przez javascript. Twoje kody działają i są po prostu zrozumiałe na zwykłej stronie, ale myślę, że z powodu wygenerowanej treści to nie działa dla mnie. Kiedy używam zdarzenia click, po prostu dodaję live() do funkcji, jak zrobić coś podobnego w tym przypadku? – elbatron

+0

Działa, jeśli dołączę go do zdarzenia kliknięcia we wspomnianym środowisku. – elbatron

2

Twój kod wygląda całkiem dobrze dla mnie. Czy po prostu nie trzeba go owijać w each, aby uruchamiał się na każdym z nich?

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

Non-jQuery rozwiązanie:

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> '); 
    } 
}); 

żywo demo:http://jsfiddle.net/2MfgB/2/

"Ale Šime, to nie działa w IE8 ...":P


Aktualizacja:
rozwiązanie Alternatywa:

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

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

żywo demo:http://jsfiddle.net/2MfgB/3/

+0

Dzięki za wersję JS. – elbatron

Powiązane problemy