2011-01-24 5 views
5

Nel mio JSP/HTML ho questo:Come inizializzare firstChild in modo da non ottenere "x.firstChild è nullo o non un oggetto"?

<div id="exampleLabel"> </div> 

Poi nella mia sezione javascript ho una funzione chiamata da un onclick come questo;

function changeLabel(){ 
    exampleLabel.firstChild.nodeValue = 'LABEL HAS CHANGED'; 
} 

Questo funziona bene in Chrome, non fa nulla in Firefox e IE in un errore nella pagina appare dicendo

exampleLabel.firstChild è nullo o non un oggetto.

Ok posso prendere che non c'era firstChild così cercando di fare firstChild.ANYTHING sarebbe un NPE, posso anche prendere che gli altri browser non si limitano a inizializzare loro stessi come Chrome fa, ovviamente.

La domanda è, come posso inizializzarlo da solo in modo che possa quindi passare a .nodeValue = "blahblah"?

+0

Sebbene meno compatibile con DOM, perché non restare con 'exampleLabel.innerHTML = 'L'ETICHETTA È CAMBIATA';'? –

risposta

7

Il motivo per cui non funziona in IE è che a differenza di tutti gli altri principali browser, non crea nodi di testo per gli spazi nel codice HTML, quindi il vostro <div> che contiene solo uno spazio non ha nodi figlio in IE. Suggerirei di aggiungere manualmente un nodo di testo o di modificarne uno esistente.

Inoltre, se non hai dichiarato exampleLabel altrove, ti stai affidando a una funzionalità non standard e piuttosto icky di IE e Chrome che associa ID di elementi DOM a proprietà dell'oggetto globale (ad esempio, puoi fare riferimento a un elemento come variabile dal suo ID). Questo non funziona con altri browser. Quello che dovresti fare invece è usare document.getElementById().

function changeLabel(labelText) { 
    var exampleLabel = document.getElementById('exampleLabel'); 
    var child = exampleLabel.firstChild; 
    if (!child) { 
     child = document.createTextNode(''); 
     exampleLabel.appendChild(child); 
    } 
    child.nodeValue = labelText; 
} 

changeLabel('LABEL HAS CHANGED'); 
+0

Ah, capisco, ho pensato che il problema di Firefox fosse lo stesso, ma non mi ha fatto saltare in aria l'errore come IE. Saluti per averlo indicato. Due problemi in uno! –

3

Creare un textNode e quindi aggiungerlo.

function changeLabel(){ 
    var textNode = exampleLabel.firstChild; 
    if (!textNode) { 
     textNode = document.createTextNode('foo'); 
     exampleLabel.appendChild(textNode); 
    } 
    textNode.nodeValue = 'LABEL HAS CHANGED'; 
} 
+0

Boom, acclamazione amico. –

+2

@Nick: probabilmente non risolve il problema di Firefox. –

+0

Chi è downvoted, non è davvero garantito. –

Problemi correlati