2010-02-19 15 views
15

में किसी ऑब्जेक्ट के बजाय ' element.firstChild एफएफ

function processTabs(TabContainer, PageContainer, Index) { 
var tabContainer = document.getElementById(TabContainer); 
var tabs = tabContainer.firstChild; 

var tab = tabs.firstChild; 
var i = 0; 
.... more code } 

कोड इस बिंदु पर कोई फर्क नहीं पड़ता के बाकी क्योंकि यह कहा जाता हो जाता है कभी नहीं:

  <div id="tabs"> 
       <ul class="tabs"> 
        <li class="current"><a><span>News</span></a></li> 
        <li><a><span>Videos</span></a></li> 
        <li><a><span>Photos</span></a></li> 
        <li><a><span>Twitter</span></a></li> 
       </ul> 
      </div> 

फिर, पृष्ठ लोड पर, मैं इस विधि में गिरा दिया हो: pertitent एचटीएमएल इस प्रकार है । आईडी टैब के साथ div को संदर्भित करने के लिए टैबकंटनर ठीक से सेट किया गया है। अब, इंटरनेट एक्सप्लोरर में जब मैं tabContainer को कॉल करता हूं। फर्स्ट चाइल्ड वेरिएबल 'टैब' मेरे यूएल का संदर्भ दे रहा है और फिर कॉल var टैब = tabs.firstChild; संदर्भ मेरी पहली LI। समस्या यह है कि जब मैं tabContainer को कॉल करता हूं। फर्स्ट चाइल्ड वेंकमैन मुझे बता रहा है कि यह वापस आ रहा है। तो फ़ायरफ़ॉक्स div के अंदर वास्तविक बच्चों के रूप में मेरी न्यूलाइन पढ़ रहा है! मेरा यूएल वास्तव में बच्चे नोड संग्रह में दूसरा बच्चा है!

क्या इसे ठीक करने का कोई तरीका है?

धन्यवाद!

उत्तर

24

आप TextNodes को छोड़ देना चाहिए, एक साधारण समारोह आप मदद कर सकते हैं:

function getFirstChild(el){ 
    var firstChild = el.firstChild; 
    while(firstChild != null && firstChild.nodeType == 3){ // skip TextNodes 
    firstChild = firstChild.nextSibling; 
    } 
    return firstChild; 
} 

उपयोग:

var tabContainer = document.getElementById(TabContainer); 
var tabs = getFirstChild(tabContainer); 
+1

अच्छी तरह से किया, एक आकर्षण की तरह काम किया! – dparsons

+3

फ़ंक्शन 'getFirstChild' में मैं 'firstChild.nodeType == 3' के बजाय' firstChild.nodeType == 3' 'की बजाय' firstChild.nodeType == 3' 'की जांच करता हूं ताकि टिप्पणियों जैसे अन्य नोड प्रकारों को छोड़ सकें। – Cito

+0

यह उत्तर @Cito परिवर्तन के लिए अपडेट किया जाना चाहिए, मुझे बस एक डेवलपर का सामना करना पड़ा जिसने इस सटीक कोड की प्रतिलिपि बनाई, और सुनिश्चित किया कि पहले तत्व नोड से पहले एक HTML टिप्पणी थी जिसे खोजा जा रहा था ...और इस प्रकार असफल रहा। – scunliffe

11

आप अग्रणी टेक्स्ट को अनदेखा करने के लिए node.firstElementChild का उपयोग कर सकते हैं या jQuery की तरह लाइब्रेरी का उपयोग कर सकते हैं जो इसका ख्याल रखता है।

+2

node.firstElementChild कोशिश कर सकते हैं केवल एफएफ 3.5 में समर्थित है तो मैं अभी भी साथ हवा पुराने संस्करणों में मुद्दा। jQuery मेरे मामले में एक विकल्प नहीं है। सीएमएस की पोस्ट ने समस्या को हल किया। – dparsons

0

मैं की तरह एक पुस्तकालय का उपयोग करने के जावास्क्रिप्ट में डोम के साथ काम करने की कोशिश कर किसी को भी सिफारिश करेंगे jquery। यह आपके जीवन को अधिक आसान बना देगा।

फिर आप fallows के रूप में जे एस समारोह को फिर से लिखने सकता है:

function processTabs(TabContainer, PageContainer, Index) { 
    var tabContainer = document.getElementById(TabContainer); 

    // jquery used to find all the <li> elements 
    var tabs = $(tabContainer).filter('li'); 

    // use the jquery get(index) function to retrieve the first tab 
    var tab = tabs.get(0); 
    var i = 0; 
    .... more code 
} 
+3

ढांचे के अच्छे होने पर, वे एक लक्जरी नहीं हैं जिन्हें मैं वर्तमान में उपयोग करने के लिए उपयोग कर रहा हूं। हालांकि समाधान के लिए धन्यवाद! – dparsons

+1

हालांकि मुझे jQuery पसंद है, लेकिन इसे एक बुकमार्कलेट में फिट करना मुश्किल है! – scraimer

2
भी दक्षता पर एक एक आँख के साथ

, इस फ़ंक्शन एल

function firstChildElement(el) 
{ 
    el = el.firstChild; 
    while (el && el.nodeType !== 1) 
     el = el.nextSibling; 
    return el; 
} 
+0

@yckart: फिक्स के लिए धन्यवाद, यह पूरी तरह से गलत था। –

5

उपयोग element.querySelector("*") पहले प्राप्त करने के लिए की firstChild तत्व नोड बाल तत्व

डेमो:

var container = document.getElementById("container") 
 

 
console.log(container.querySelector("*")) // <div>This is a test</div> 
 
console.log(container.firstChild) // #text 
 
console.log(container.childNodes[0]) // #text
<div id="container"> 
 
    <div>This is a test</div> 
 
</div>

+0

इस पर कोई वोट नहीं, किसी भी कारण से यह समाधान नहीं है? – Joel

+3

@ जोएल मैंने 6 साल बाद जवाब जोड़ा, शायद यही कारण है :) – CoderPi

0

आप

document.getElementById(TabContainer).firstElementChild; 
बजाय

firstChild

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