Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在使用'insertBefore()'时需要引用元素的父元素?_Javascript_Dom - Fatal编程技术网

Javascript 为什么在使用'insertBefore()'时需要引用元素的父元素?

Javascript 为什么在使用'insertBefore()'时需要引用元素的父元素?,javascript,dom,Javascript,Dom,如果我想在refEl之前插入newEl,我必须使用 refEl.parentNode.insertBefore(newEl, refEl); 为什么w3c决定这样做 对我来说,下面的两个选项更有意义 insertBefore只需要一个参数: refEl.insertBefore(newEl); /* or */ newEl.insertBefore(refEl); 只有文档在前面插入了 document.insertBefore(newEl, refEl); 为什么w3c要我们

如果我想在
refEl
之前插入
newEl
,我必须使用

refEl.parentNode.insertBefore(newEl, refEl);
为什么w3c决定这样做

对我来说,下面的两个选项更有意义

  • insertBefore
    只需要一个参数:

    refEl.insertBefore(newEl);  /* or */  newEl.insertBefore(refEl);
    
  • 只有
    文档
    在前面插入了

    document.insertBefore(newEl, refEl);
    
为什么w3c要我们指定冗余的父元素


可能有什么我看不到的优势吗?

如果它是一个链接列表,它需要家长更改“下一个”链接。仅使用单个节点,它没有足够的信息来完成操作。

是的,因为使用
refNode.parentElement
可以获得父元素,因此它是冗余的。但是你能澄清一下,或者举个例子吗?我不确定我是否理解你的答案。他们似乎不希望insert命令在内部找到parentNode。这样做可能会遇到一些问题(比如,如果它没有父母怎么办?),但即使它没有父母,我也不觉得这太难处理。该方法可能返回
false
null
而不是
newEl
,或者可能引发错误。由于插入操作无效,会引发许多异常。如果没有父节点,那么这只是另一个例外..insertBefore的意思似乎是“在我指向的这个节点之前插入”。如果这是真的,那么我可以理解为什么他们也需要parentNode。他们为什么决定这样做?我想你得问问设计师。DOM级别4确实定义了
.before()
.after()
,这允许直接相对于目标插入。帮自己一个忙:不要问“他们为什么做X?”这只是一种猜测:众所周知,DOM是已经拥有文档操作API的制造商之间的妥协,因此DOM有许多独特的特性。众所周知,在IE10之前,IE可以在给定某些形式的无效HTML标记时构建一个内部对象模型,该模型不是一个完美的树结构,因此无法精确映射到DOM API。在这种情况下,refEl可以是多个元素的子元素,获取refEl.parent将抛出错误。明确指定父级可以避免该问题。