如何创建元素的浅层副本?

时间:2016-09-02 19:40:10

标签: javascript jquery dom

最近在this question我询问了如何找出课程中是否存在样式。我被告知(通过skobaljic)我需要克隆元素。在调用元素(jQuery方法)的.clone()期间,生成的对象包含默认样式(例如,从样式表),因此插入的样式不包含在克隆中。这就是我理解它的方式。但是,当我需要检测是否存在6种风格时,克隆完整元素(包括所有可能是数字或数千的儿童元素)似乎很奇怪。我为jQuery的克隆方法编写了代码。有这个:

destElements = getAll( clone );
srcElements = getAll( elem );

因此函数getAll被调用两次。

然后我检查了包含getAll的内容:

var ret = typeof context.getElementsByTagName !== "undefined" ?
    context.getElementsByTagName( tag || "*" ) :
    typeof context.querySelectorAll !== "undefined" ?
    context.querySelectorAll( tag || "*" ) :
    [];

来自Mozilla手册:

  

Element.getElementsByTagName()方法返回实时   HTMLCollection具有给定标记名称的元素。子树   搜索指定元素下面的元素   本身。

     

Document.querySelectorAll() - 返回其中元素的列表   文档(使用文档的深度优先预订遍历   节点)匹配指定的选择器组。物体   返回的是NodeList。

因此很明显,创建元素的深层副本毫无意义,而且需要性能。当我需要进行深度搜索/比较而导致过度浪费资源时,这个问题仍然会加剧。我想克隆没有它的子元素的元素。这可能吗?克隆应包含默认样式,就像使用.clone()一样。怎么做?

1 个答案:

答案 0 :(得分:1)

我相信这可以帮到你:

来源:http://www.w3schools.com/jsref/met_node_clonenode.asp

  // Copy the element and its child nodes
  var clone_with_child = yourElement.cloneNode(true);
  // Copy only the element
  var clone_without_child = yourElement.cloneNode(false);