2012-02-21 18 views
7

tengo un problema con este pedazo de código:IE no soporta 'insertBefore'

var logo = document.getElementById("move_this"); 
    prependElement('container', logo); 

    function prependElement(parentID, child) { 
     parent = document.getElementById(parentID); 
     parent.insertBefore(child, parent.childNodes[0]); 
    } 

En IE Tengo un error:

SCRIPT438: Object doesn't support property or method 'insertBefore'

¿Hay una manera de resolver este problema ?

+1

búsqueda, me encontré este http://stackoverflow.com/ preguntas/5172202/does-ie7-not-fully-support-javascripts-insertbefore-method – Alfabravo

+2

¿Qué versión de IE? – kapa

Respuesta

10

usarlo como que:

var parent=document.getElementById(parentID); 

de lo contrario los padres será global, pero siempre es un padre-objeto global, la ventana parent (y que es de sólo lectura).

Además: IE requiere como segundo argumento un nodo o nula válida, así que asegúrese de que los padres tiene childNodes para evitar errores:

parent.insertBefore(child,(parent.hasChildNodes()) 
          ? parent.childNodes[0] 
          : null); 
+4

'(parent.hasChildNodes())? Parent.childNodes [0]: null' se puede acortar a' parent.childNodes [0] || null' – KooiInc

+0

Eso está bien para mí :) Muchas gracias :) – Teq1

4

insertBefore funciona correctamente en IE siempre y cuando el segundo parámetro es un elemento DOM válido, o null (typeof null es Object y también es un elemento DOM typeof).

Para una Array, cualquier de índice unida (que en este caso es 0 como el children[] está vacía) devolverá undefined. IE deja de funcionar en el siguiente caso como el segundo parámetro se convierte en undefined -

parent.insertBefore(child, parent.childNodes[0]) 
//parent.childNodes[INDEX] 
//where `INDEX` is greater than parent.childNodes.length 

Por lo tanto, un mejor enfoque para este caso será

var refEl = parent.childNodes[INDEX] || null; 
parent.insertBefore(newRowHolderNode.childNodes[0], refEl);