2010-02-19 6 views
15

'daki bir Nesne yerine ' function processTabs(TabContainer, PageContainer, Index) { var tabContainer = document.getElementById(TabContainer); var tabs = tabContainer.firstChild; var tab = tabs.firstChild; var i = 0; .... more code } element.firstChild, FF

bu noktada önemli değil kodun kalan o

çağrılan çünkü hiçbir zaman:

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

Sonra sayfa yüklemesinde, bu yöntemin içine düştü olsun şu şekildedir: pertitent HTML'dir . tabContainer, div sekmesiyle div başvurusu yapmak için uygun şekilde ayarlanmıştır. Şimdi, Internet Explorer'da tabContainer.firstChild'i çağırdığımda, 'sekmeler' değişkeni UL'm ve daha sonra arama var sekmesi = tabs.firstChild; ilk LI referanslarım Sorun şu ki tabContainer.firstChild Venkman dediğimde bana geri dönüyor. Bu yüzden firefox benim yeni satırlarımı div içindeki gerçek çocuklar olarak okuyor! UL'm aslında childNodes koleksiyonundaki ikinci çocuk!

Bunu düzeltmenin bir yolu var mı?

Teşekkürler!

cevap

24

Sen TextNodes atlaması gereken, basit bir fonksiyon size yardımcı olabilir:

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

Kullanımı:

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

Güzel bitti, bir çekicilik gibi çalıştı! – dparsons

+3

'getFirstChild' işlevinde, yorumlar gibi diğer düğüm türlerini atlamak için' firstChild.nodeType == 3' yerine 'firstChild.nodeType! = 1' seçeneğini işaretlerdim. – Cito

+0

Bu cevap, önerilen @Cito değişikliğine güncellenmiş olmalı, bu kodu tam olarak kopyalayan bir geliştiriciyle karşılaştım ve yeterince aranan ilk eleman düğümünden önce bir HTML yorumu var ...ve böylece başarısız oldu. – scunliffe

11

Önde gelen metni yok saymak için node.firstElementChild'u kullanabilir veya bununla ilgilenen jQuery gibi bir kitaplık kullanabilirsiniz.

+2

node.firstElementChild deneyebilirsiniz sadece FF 3.5 desteklenir yüzden hala kadar rüzgar eski sürümlerde sorun. jQuery benim durumumda bir seçenek değil. CMS'nin sonrası sorunu sorunu çözdü. – dparsons

0

ben gibi bir kütüphane kullanma javascript DOM ile çalışmak isteyenlere tavsiye ederim jquery. Hayatını daha kolaylaştıracak.

Ardından Taksonların JS işlevini yeniden olabilir: Ayrıca verimliliği üzerinde bir göz ile

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

Çerçeveler güzel olsa da, şu anda kullanmak için uygun bir lüks değiller. Çözüm için teşekkürler! – dparsons

+1

jQuery'yi sevmeme rağmen, onu bir bookmarklet içine sığdırmak zor! – scraimer

2

, bu fonksiyon el

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

@yckart: Düzeltme için teşekkürler, tamamen yanlıştı. –

5

Kullanım element.querySelector("*") ilk olsun ve firstChild eleman düğümü döndürür çocuk öğesi.

Demo:

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

Bu konuda hiç oy yok, herhangi bir sebep bu çözüm değil mi? – Joel

+3

@Joel 6 yıl sonra cevabı ekledim, belki de bu yüzden :) – CoderPi

0

Sen

document.getElementById(TabContainer).firstElementChild; 

yerine firstChild