IE不支持'insertBefore'

时间:2012-02-21 12:47:18

标签: javascript internet-explorer

我对这段代码有疑问:

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

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

在IE中我有一个错误:

  

SCRIPT438:Object不支持属性或方法'insertBefore'

有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:10)

使用它:

var parent=document.getElementById(parentID);

否则parent将是全局的,但总是有一个全局父对象,parent窗口(并且它是只读的)。

<强>此外: IE要求第二个参数为有效节点或null,因此请确保父节点具有childNodes以避免错误:

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

答案 1 :(得分:4)

只要第二个参数是有效的DOM元素,

insertBefore就可以在IE中正常工作,或者nulltypeof nullObject,因此是typeof Array DOM元素。)

对于0,任何越界索引(在这种情况下children[]undefined为空)将返回undefined。当第二个参数变为parent.insertBefore(child, parent.childNodes[0]) //parent.childNodes[INDEX] //where `INDEX` is greater than parent.childNodes.length -

时,I​​E在以下情况下停止工作
var refEl  = parent.childNodes[INDEX] || null;
parent.insertBefore(newRowHolderNode.childNodes[0], refEl);

因此,针对此案例的更好方法将是

{{1}}

答案 2 :(得分:0)

如上所述,.insertBefore仅适用于有效节点(显式ID或全局文档引用)。局部变量引用将失败:

parent.insertBefore(child, localref); //error

在IE中,我们可以使用.sourceIndex属性来获取“ marker”元素的当前全局索引,然后再插入新的子元素。这是IE的修补程序:

parent.insertBefore(child, document.all[localref.sourceIndex]);

如果您确切知道要在父树中的哪个位置插入元素,则不必使用.sourceIndex属性。以下属性可以正常工作:

parent.insertBefore(child, parent.all[1]); //must be a child
parent.insertBefore(child, parent.children[2]); //any sane index
parent.insertBefore(child, parent.firstChild); //if at least one child exists
parent.insertBefore(child, parent.lastChild); //if at least one child exists
parent.insertBefore(child, localref.nextSibling]); //if not last child
parent.insertBefore(child, localref.previousSibling]); //if not first child