2011-09-14 13 views
6

कुछ समय से इस के साथ संघर्ष कर रहे हैं। मेरे मार्कअप सरलीकृत: ELEM 2. अपने अगले DIV भी वर्ग के नाम है: ELEM 1. एक वर्ग है:दो डीवी के बीच नई डीआईवी डालें जिसमें एक ही कक्षा है और तत्काल भाई बहन

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

मैं दस्तावेज़ तैयार है कि पर सभी DIVs का चयन करने के लिए एक रास्ता खोजने की जरूरत है। तो मैं उन दोनों के बीच एक नया DIV डालने की आवश्यकता:

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

उत्तर

13

इस प्रयास करें:

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

यह सीएसएस के आसन्न भाई चयनकर्ता (+) का उपयोग कर रहा है। यह कक्षा .elem के साथ एक तत्व को पाता है जिसमें कक्षा .elem के साथ तुरंत दूसरे तत्व के साथ तत्व होता है, फिर इससे पहले एक नया div जोड़ता है।

फिडल: http://jsfiddle.net/4r2k4/

+0

ठीक - मैं आपका जवाब मेरा की तुलना में बेहतर पसंद है! http://jsfiddle.net/mrtsherman/kvg8N/1/ – mrtsherman

+0

फिडल्स के लिए धन्यवाद। मैं उल्लेख करना भूल गया (क्षमा करें) कि HTML जावास्क्रिप्ट द्वारा उत्पन्न होता है। आपके कोड काम कर रहे हैं और नियमित पृष्ठ पर समझने के लिए बस हैं, लेकिन मुझे लगता है कि जेनरेट की गई सामग्री के कारण यह मेरे लिए काम नहीं कर रहा है। जब मैं क्लिक इवेंट का उपयोग कर रहा हूं, तो मैं बस फ़ंक्शन में लाइव() जोड़ता हूं, इस मामले में कुछ ऐसा कैसे कर सकता है? – elbatron

+0

यह काम कर रहा है अगर मैं उपरोक्त पर्यावरण में एक क्लिक घटना से संलग्न करता हूं। – elbatron

2

आपका कोड मेरे लिए काफी अच्छा लग रहा है। क्या आपको इसे each में लपेटने की आवश्यकता नहीं है ताकि यह प्रत्येक पर आग लग सके?

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

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

लाइव डेमो:http://jsfiddle.net/2MfgB/2/

"लेकिन Šime, इस IE8 में काम नहीं करता है ...":P


अद्यतन:
वैकल्पिक समाधान:

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

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

लाइव डेमो:http://jsfiddle.net/2MfgB/3/

+0

जेएस संस्करण के लिए धन्यवाद। – elbatron

संबंधित मुद्दे