2011-10-19 7 views
68

ठीक है, मैंने पहले जावास्क्रिप्ट में डब किया है, लेकिन सबसे उपयोगी बात मैंने सीएसएस शैली-स्विचर है। तो मैं इसके लिए कुछ नया हूँ। मान लें कि मेरे पास एचटीएमएल कोड है:कक्षा और आईडी द्वारा तत्व के अंदर तत्व प्राप्त करें - जावास्क्रिप्ट

<div id="foo"> 
    <div class="bar"> 
     Hello world! 
    </div> 
</div> 

मैं "हैलो वर्ल्ड" कैसे बदलूं! "अलविदा दुनिया" के लिए ? मुझे पता है कि document.getElementByClass और document.getElementById कैसे काम करता है, लेकिन मैं और अधिक विशिष्ट प्राप्त करना चाहता हूं। माफ करना, अगर यह पहले भी पूछा गया है।

उत्तर

126

ठीक है, पहले आप की जरूरत है getElementById जैसे फ़ंक्शन वाले तत्वों का चयन करें।

var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0]; 

getElementById केवल एक नोड दिखाए, लेकिन getElementsByClassName एक नोड सूची देता है। चूंकि उस वर्ग के नाम के साथ केवल एक तत्व है (जहां तक ​​मैं कह सकता हूं), आप केवल पहला प्राप्त कर सकते हैं (यही [0] है-यह एक सरणी की तरह है)।

फिर, आप .innerHTML के साथ एचटीएमएल बदल सकते हैं।

targetDiv.innerHTML = "Goodbye world!"; 

var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0]; 
 
targetDiv.innerHTML = "Goodbye world!";
<div id="foo"> 
 
    <div class="bar"> 
 
     Hello world! 
 
    </div> 
 
</div>

+1

इस मामले में आईडी द्वारा माता-पिता को प्राप्त करना आवश्यक नहीं है। 'document.getElementsByClassName' ठीक काम करेगा। – rvighne

+6

@rvighne ओपी की सटीक आवश्यकताओं यह था कि वह "अधिक विशिष्ट प्राप्त करना चाहते हैं"। सवाल पूछने वाला व्यक्ति पूछ रहा था कि वह अपने डोम पेड़ के ट्रैवर्सल में और अधिक विशिष्ट कैसे हो सकता है। GetElementByClassName का उपयोग भ्रम का मुद्दा नहीं था, लेकिन मैं देख सकता हूं कि कोई आसानी से कैसे सोच सकता है कि मैं आवश्यकतानुसार दोनों को इंगित कर रहा था। वो नहीं हैं। यदि आप एक निश्चित कक्षा के केवल तत्वों को लक्षित करना चाहते हैं जो किसी दिए गए आईडी के किसी विशेष नोड के तहत एक अलग नोड के तहत उसी वर्ग के तत्वों के विपरीत हैं, तो आप यही उपयोग करेंगे। –

+1

@ जोसेफमरिकल मैं देखता हूं। मुझे विश्वास है कि मैंने सवाल बहुत जल्दी पढ़ा है। – rvighne

10

आप इस तरह यह कर सकते हैं:

var list = document.getElementById("foo").getElementsByClassName("bar"); 
if (list && list.length > 0) { 
    list[0].innerHTML = "Goodbye world!"; 
} 

या, यदि आप के साथ यह करने के लिए कम त्रुटि जाँच और अधिक संक्षिप्तता के साथ चाहते हैं, तो वह ऐसा एक पंक्ति में किया जा सकता है:

document.getElementById("foo").getElementsByClassName("bar")[0].innerHTML = "Goodbye world!"; 

स्पष्टीकरण में:

  1. आप id="foo" साथ तत्व मिलता है।
  2. फिर आप उस ऑब्जेक्ट में मौजूद ऑब्जेक्ट्स पाते हैं जिसमें class="bar" है।
  3. एक सरणी की तरह nodeList रिटर्न यही कारण है, आपको लगता है कि nodeList
  4. में पहला आइटम संदर्भ तो तब आप उस आइटम के innerHTML सेट इसकी सामग्री को बदलने के लिए कर सकते हैं।

चेतावनी: कुछ पुराने ब्राउज़र getElementsByClassName (जैसे IE के पुराने संस्करण) का समर्थन नहीं करते हैं। गायब होने पर उस समारोह को जगह में बदल दिया जा सकता है।


यह वह जगह है जहां मैं एक पुस्तकालय है कि बजाय ब्राउज़र संगतता के बारे में चिंता करना अपने आप से निर्मित CSS3 चयनकर्ता समर्थन का उपयोग करना चाहिये (किसी और सब काम करते हैं)। यदि आप ऐसा करने के लिए सिर्फ एक लाइब्रेरी चाहते हैं, तो Sizzle बहुत अच्छा काम करेगा। कड़ाके की धूप में, यह इस तरह से किया जाएगा जा:

Sizzle("#foo .bar")[0].innerHTML = "Goodbye world!"; 

jQuery कड़ाके की धूप पुस्तकालय में निर्मित है और jQuery में, इस होगा:

$("#foo .bar").html("Goodbye world!"); 
+0

धन्यवाद, मैं हो रही थी document.getElementBy * के साथ परेशानी। jQuery चीजों को इतना आसान बनाता है। –

4

इस IE 7 में काम करते हैं या आप को याद है कि getElementsByClassName सभी ब्राउज़रों में मौजूद नहीं है की जरूरत को कम करने की आवश्यकता है। इस वजह से आप अपना खुद का getElementsByClassName बना सकते हैं या आप इसे आजमा सकते हैं।

var fooDiv = document.getElementById("foo"); 

for (var i = 0, childNode; i <= fooDiv.childNodes.length; i ++) { 
    childNode = fooDiv.childNodes[i]; 
    if (/bar/.test(childNode.className)) { 
     childNode.innerHTML = "Goodbye world!"; 
    } 
} 
+0

'getElementsByClassName' IE8 में काम नहीं करता है, लेकिन आप इसके स्थान पर 'querySelectorAll' का उपयोग कर सकते हैं (वैसे भी बहुत कुछ)। – user113716

+0

@ Ӫ _._ Ӫ ... lol ... आपका सही है लेकिन आप बस मेरा जवाब और भी साबित करते हैं। यदि आपके पृष्ठ को एकाधिक ब्राउज़रों में कार्य करने की आवश्यकता है, तो आप getElementsByClassName पर भरोसा नहीं कर सकते हैं। jQuery निश्चित रूप से एक विकल्प होगा लेकिन इसलिए उपरोक्त कोड हो सकता है। –

+0

हां, मेरा मतलब है कि आपके उत्तर के समर्थन में टिप्पणी, लेकिन फिर यह भी इंगित करें कि एक शिम में 'qSA' का उपयोग करना संभव है ताकि आप अभी भी IE8 में देशी कोड का उपयोग कर सकें। यद्यपि आपके समाधान पर नज़र डालने के बाद, आपको कुछ चीजें मिलती हैं जिन्हें फिक्सिंग की आवश्यकता होती है। – user113716

-3

आप document.getElementById इस्तेमाल नहीं किया जाना चाहिए, क्योंकि केवल ग्राहक के पक्ष नियंत्रण जो आईडी ठीक के लिए अपने काम करते हैं। उदाहरण के लिए आपको jquery का उपयोग करना चाहिए।

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>                            
<div id="foo"> 
    <div class="bar"> 
      Hello world! 
    </div> 
</div> 

उपयोग करें: "।"

$("[id^='foo']").find("[class^='bar']") 

// do not forget to add script tags as above 

अगर आप किसी भी निकालने संपादित किसी भी आपरेशन तो बस जोड़ना चाहते हैं पीछे और क्या संचालन

+7

एक हिरण को मारने के लिए थर्मोन्यूक्लियर हथियार का उपयोग करना काम करेगा, लेकिन मामूली ओवरकिल है। एक तत्व का चयन करने के लिए एक बहु-केबी jQuery लाइब्रेरी का उपयोग करना जब जावास्क्रिप्ट उस बेस कोड में उस कार्यक्षमता को प्रदान करता है तो थोड़ा अधिक ओवरकिल होता है। – Danejir

3

पुनरावर्ती क्रिया:

function getElementInsideElement(baseElement, wantedElementID) { 
    var elementToReturn; 
    for (var i = 0; i < baseElement.childNodes.length; i++) { 
     elementToReturn = baseElement.childNodes[i]; 
     if (elementToReturn.id == wantedElementID) { 
      return elementToReturn; 
     } else { 
      return getElementInsideElement(elementToReturn, wantedElementID); 
     } 
    } 
} 
0

ऐसा करने के लिए सबसे आसान तरीका है:

function findChild(idOfElement, idOfChild){ 
    let element = document.getElementById(idOfElement); 
    return element.querySelector('[id=' + idOfChild + ']'); 
} 

या बेहतर पठनीय:

findChild = (idOfElement, idOfChild) => { 
    let element = document.getElementById(idOfElement); 
    return element.querySelector(`[id=${idOfChild}]`); 
}