DOM元素同时存在于两个地方吗? (通过同步)

时间:2019-03-26 01:30:06

标签: javascript dom

我知道一个奇怪的问题,但是在Javascript或任何其他基于Web的语言中是否存在使同一DOM元素同时存在于两个地方的问题?

3 个答案:

答案 0 :(得分:3)

基于壁虎的渲染器使您可以使用element() CSS函数在多个位置渲染同一元素。 请注意,这只会将元素呈现为图像,不会将事件传播回源元素。

答案 1 :(得分:1)

  

DOM是DOM,与语言无关。

每个DOM元素要么根本不连接到DOM,要么连接到一个特定的父级。您不能在两个不同的位置显示相同的元素。附加到新的父对象只会将元素从旧的父元素移出。

您可以创建或克隆元素,该元素通过Node相同。

function clone() {
  var itm = document.getElementById("items-one").lastChild;
  var cln = itm.cloneNode(true);
  document.getElementById("items-two").appendChild(cln);
}
<ul id="items-one"><li>Element One</li></ul>
<ul id="items-two"><li>Element Two</li></ul>

<button onclick="clone()">Clone Element</button>

答案 2 :(得分:0)

这取决于您所说的“ 存在”。

在SVG中,有一个<use>元素,它允许在主机<use>元素的ShadowTree中创建参考节点的深层克隆。您可能会说,是克隆,但是,此克隆具有与源紧密相连的特殊性。在源上进行的DOM修改将影响克隆,在源上应用的CSS规则也将至少在SVG2 中影响克隆

onclick = e => // we only modify the source #rect
  document.getElementById('rect').setAttribute("height", 20);
:hover #rect{
  fill: red;  /*Firefox is buggy here*/
}
click to execute DOM modification
<svg>
  <rect id="rect" x="0" y="0" width="50" height="50" fill="green"/>
  <use x="60" xlink:href="#rect"/>
</svg>

因此从技术上讲,源片段仅存在于DOM中的一个位置,并且每次都被简单地克隆。但是,鉴于深层链接,对于消费者而言,它非常接近同时存在于两个地方。

其他SVG元素在DOM中的单个位置时也可以多次渲染<marker><pattern>就是这样的元素:

<svg>
  <defs>
    <!-- defined only once -->
    <marker id="dot" viewBox="0 0 10 10" refX="5" refY="5"
        markerWidth="5" markerHeight="5">
      <circle cx="5" cy="5" r="5" fill="red" />
    </marker>
  </defs>
  <!-- our marker will get painted twice -->
  <polyline points="10,10 10,90 90,90" fill="none" stroke="black"
   marker-start="url(#dot)" marker-end="url(#dot)"  />
</svg>

因此,可以再次说它们确实多次存在,但在DOM中,它们只是一次。 (非常像FF的element() 他们的答案中提到了 the8472


现在,如果您只是像node1 !== node2 && node1.childNodes[0] === node2.childNodes[0]中那样表示存在,则不会。