我对这段代码有疑问:
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'
有没有办法解决这个问题?
答案 0 :(得分:10)
使用它:
var parent=document.getElementById(parentID);
否则parent将是全局的,但总是有一个全局父对象,parent窗口(并且它是只读的)。
<强>此外:强> IE要求第二个参数为有效节点或null,因此请确保父节点具有childNodes以避免错误:
parent.insertBefore(child,(parent.hasChildNodes())
? parent.childNodes[0]
: null);
答案 1 :(得分:4)
insertBefore
就可以在IE
中正常工作,或者null
(typeof null
是Object
,因此是typeof
Array
DOM元素。)
对于0
,任何越界索引(在这种情况下children[]
为undefined
为空)将返回undefined
。当第二个参数变为parent.insertBefore(child, parent.childNodes[0])
//parent.childNodes[INDEX]
//where `INDEX` is greater than parent.childNodes.length
-
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