2010-02-19 10 views
15

Napisałem system kart za pomocą bardzo prostego kodu JavaScript i działa jak mistrz w IE 8, ale w FireFox 3 podchodzę krótko . Pertitent HTML jest następujący:element.firstChild powraca "<TextNode ..." zamiast obiektu w FF

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

Następnie na stronie obciążenia, mam spadł do tej metody:

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

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

Reszta kodu nie ma znaczenia w tym momencie, ponieważ nigdy nie jest wywoływana . tabContainer jest ustawiony prawidłowo, aby odwoływać się do elementu div za pomocą zakładek ID. Teraz w Internet Explorerze, gdy wywołuję tabContainer.firstChild, zmienna "tabs" odwołuje się do mojego UL, a następnie wywołuje var tab = tabs.firstChild; odnosi się do mojego pierwszego LI. Problem polega na tym, że kiedy dzwonię do tabContainer.firstChild Venkman mówi mi, że powraca. Tak więc firefox czyta moje nowe linie jako rzeczywiste dzieci w div! Mój UL jest w rzeczywistości drugim dzieckiem w kolekcji childNodes!

Czy można to naprawić?

Dzięki!

Odpowiedz

24

Należy pominąć TextNodes, prosta funkcja może pomóc:

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

Zastosowanie:

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

Ładnie wykonane, zadziałało jak urok! – dparsons

+3

W funkcji 'getFirstChild' chciałbym sprawdzić' firstChild.nodeType! = 1' zamiast 'firstChild.nodeType == 3', aby pominąć także inne typy węzłów, takie jak komentarze. – Cito

+0

Ta odpowiedź powinna zostać zaktualizowana do sugerowanej zmiany @Cito, po prostu napotkałem programistę, który skopiował ten dokładny kod, i na pewno był komentarz HTML przed pierwszym szukanym elementem ...a zatem nie powiodło się. – scunliffe

11

Możesz użyć node.firstElementChild, aby zignorować wiodący tekst, lub użyć biblioteki takiej jak jQuery, która się tym zajmuje.

+2

node.firstElementChild jest obsługiwana tylko w FF 3.5, więc nadal skończyć z problem w starszych wersjach. jQuery nie jest opcją w moim przypadku. Post CMS powyżej rozwiązał problem. – dparsons

0

Polecam każdemu stara się pracować z DOM w javascript, aby korzystać z biblioteki jak jquery. To znacznie ułatwi ci życie.

Następnie można przepisać funkcji JS sposób następujący:

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

Podczas gdy frameworki są ładne, nie są one luksusem, z którego obecnie mogę korzystać. Dzięki za rozwiązanie! – dparsons

+1

Mimo że uwielbiam jQuery, trudno jest dopasować go do bookmarkletu! – scraimer

2

Z myślą również o efektywności, funkcja ta zwraca firstChild elementu węzła El

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

@yckart: dzięki za poprawkę, było całkowicie nie tak. –

5

Korzystanie element.querySelector("*") dostać pierwszy element dziecka.

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

Brak głosów w górę w tej sprawie, z jakiegokolwiek powodu nie jest to rozwiązanie? – Joel

+3

@Joel Dodałem odpowiedź 6 lat później, może to dlatego :) – CoderPi

0

Można spróbować

document.getElementById(TabContainer).firstElementChild; 

zamiast firstChild

Powiązane problemy