JS魔法堂:元素克隆、剪切技术研究

简介:
                       

  当需要新元素时我们可以通过 document.createElement 接口来创建一个全新的元素,也可以通过克隆已有元素的方式来获取一个新元素。而在部分浏览器中,通过复制来获取新元素的效率比通过 document.createElement 方式的要高一些,具体的性能比较如下:

2% in IE8, but no change in IE6 and IE7

Up to 5.5% in Firefox 3.5 and Safari 4

6% in Opera (but no savings in Opera 10)

10% in Chrome 2 and 3% in Chrome 3

  本篇将记录元素克隆、和剪切的相关技术,以便日后查阅。

  目录一坨

  二、拷贝

  1. Node.cloneNode

  2. document.importNode

  三、剪切

  1. document.adoptNode

  2. appendChild、insertBefore和replaceChild

  四、总结

  五、题外话——IE独有的replaceNode和swapNode方法

 

二、拷贝                                 

1、Node.cloneNode                      

浏览器支持:所有浏览器均支持。

作用:拷贝元素自身。

API规范: {Node} Node.clone({boolean} [isDeep=false]) ,默认情况下仅拷贝元素本身,若入参为true时拷贝子孙元素也将被一同拷贝。

实际测试效果

浏览器 复制子元素 标准属性(property) 标准特性(attribute) 自定义特性(customize attribute) 自定义属性(expando) DOM0事件处理函数 DOM2事件处理函数

parentNode和

parentElement的值

ownerDocument

IE5.5~8 √(浅复制) Χ Χ null 不变
 IE9+  √  Χ  Χ   Χ  null 不变
Chrome   √  √   Χ  Χ   Χ  null 不变
 FF  √   √  √    Χ  Χ  Χ  null 不变

 注意:

    1. 使用cloneNode会将id特性也复制,因此需要手动修改副本的id特性。

    2. {Document} document和{HTMLDocument} document.documentElement也可以调用cloneNode方法拷贝自身,并且支持深拷贝。

    3. 当从其他文档中拷贝元素,元素副本的ownerDocument依然为其他文档的document对象,直到我们将元素副本添加到当前文档下,ownerDocument属性才会变化。

 

2、document.importNode                       

浏览器支持:IE9+和其他现代浏览器均支持。

作用:拷贝其他文档中的元素到当前文档中。(https://developer.mozilla.org/en-US/docs/Web/API/document.importNode

API规范: {Node} document.importNode({HTMLElement|HTMLDocument|HTMLDocumentFragment} externalNode [, {boolean} isDeep=true]) 

实际测试效果

浏览器 复制子元素 标准属性(property) 标准特性(attribute) 自定义特性(customize attribute) 自定义属性(expando) DOM0事件处理函数 DOM2事件处理函数

parentNode和

parentElement的值

ownerDocument

 IE9+  √  Χ  Χ   Χ   null 当前文档的document对象
Chrome   √  √   Χ  Χ   Χ  null  当前文档的document对象
 FF  √   √  √    Χ  Χ  Χ 
 null 当前文档的document对象

注意:

    1. 使用importNode会将id特性也复制,因此需要手动修改副本的id特性;

  2. 不接受{Document} document的拷贝;

    3. 虽然规范中描述其作用为拷贝其他文档中的元素,但实际上是可以对当前文档的元素进行拷贝的;

    4. 当从其他文档中拷贝元素,元素副本的ownerDocument自动设置为当前文档的document对象。

 

三、剪切                                 

1、document.adoptNode                       

浏览器支持:IE9+和其他现代浏览器均支持。

作用:剪切其他文档中的元素到当前文档中。(https://developer.mozilla.org/en-US/docs/Web/API/document.adoptNode

API规范: {Node} document.adoptNode({HTMLElement|HTMLDocument|HTMLDocumentFragment} externalNode) 

实际测试效果

浏览器 复制子元素 标准属性(property) 标准特性(attribute) 自定义特性(customize attribute) 自定义属性(expando) DOM0事件处理函数 DOM2事件处理函数

parentNode和

parentElement的值

ownerDocument

 IE9+  √    null 当前文档的document对象
Chrome   √  √        null  当前文档的document对象
 FF  √   √  √      null 当前文档的document对象

注意:

  1. 不接受{Document} document的剪切,但可以对{HTMLDocument} document.documentElement进行剪切;

    2. 虽然规范中描述其作用为拷贝其他文档中的元素,但实际上是可以对当前文档的元素进行拷贝的;

    3. 当从其他文档中拷贝元素,元素副本的ownerDocument自动设置为当前文档的document对象。

 

2. appendChild、insertBefore和replaceChild

  我们知道appendChild、insertBefore和replaceChild操作元素时会切断元素原来的位置关系,然后将其添加到新的树层级结构中。这不就是元素的剪切操作吗!于是我们可以通过appendChild、insertBefore和replaceChild方法将目标元素剪切到一个未加入DOM树的元素中,即可模拟document.adoptNode的功能了。

复制代码
;(function(doc){
  var clipboard
  doc.adoptNode = doc.adoptNode || (clipboard = document.createElement('div'), function(node){
    clipboard.appendChild(node)
      return clipboard.lastChild
  })
}(document))
复制代码

 实际测试效果

浏览器 复制子元素 标准属性(property) 标准特性(attribute) 自定义特性(customize attribute) 自定义属性(expando) DOM0事件处理函数 DOM2事件处理函数

parentNode和

parentElement的值

ownerDocument

 IE9+  √    充当
clipboard
的div元素
当前文档的document对象
Chrome   √  √         充当
clipboard
的div元素
当前文档的document对象
 FF  √   √  √       充当
clipboard
的div元素
当前文档的document对象

注意:

  1. 不接受{Document} document和{HTMLDocument} document.documentElement的剪切,但可以对{HTMLBodyElement} document.body进行剪切;

    2. 当从其他文档中拷贝元素,元素副本的ownerDocument自动设置为当前文档的document对象。

 

四、总结                                

   上述的元素拷贝操作均无法拷贝自定义属性和事件处理绑定,而jQuery的clone函数可实现这一点。

    尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4176612.html  ^_^肥子John

 

五、题外话——IE独有的replaceNode和swapNode方法         

   IE5.5~11还提供了 el.replaceNode({HTMLElement} otherEl) 和 el.swapNode(HTMLElement} otherEl) 两个方法, el.replaceNode({HTMLElement} otherEl) 作用是将el替换为otherEl并将el作为函数返回值, 此时el已经脱离了DOM树; el.swapNode(HTMLElement} otherEl) 作用是交换el和otherEl在树层级结构中的位置,两者均在DOM树中。  注意:这两个方法均为IE独有的。

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!

分类: JavaScript
0
0
« 上一篇: HTML语义化:HTML5新标签——template
» 下一篇: CSS魔法堂:Reset CSS
posted @ 2014-12-21 20:14 ^_^肥仔John 阅读( 2213) 评论( 0) 编辑 收藏
 
相关文章
|
11月前
|
JavaScript 算法 开发者
如何用JS实现在网页上通过鼠标移动批量选择元素的效果?
本文介绍了类似电脑桌面通过鼠标选择多个图标的实现原理。主要通过监听mousedown、mousemove和mouseup事件,动态调整选择框大小并计算与元素的重叠情况。提供了角重叠和相交重叠的检测方法,并附有示例代码和在线演示链接,方便开发者参考与测试。
360 56
|
7月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
267 0
|
6月前
|
JavaScript 前端开发 IDE
TypeScript vs. JavaScript:技术对比与核心差异解析
TypeScript 作为 JavaScript 的超集,通过静态类型系统、编译时错误检测和强大的工具链支持,显著提升代码质量与可维护性,尤其适用于中大型项目和团队协作。相较之下,JavaScript 更灵活,适合快速原型开发。本文从类型系统、错误检测、工具支持等多维度对比两者差异,并提供技术选型建议,助力开发者合理选择。
1124 1
|
6月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
353 3
|
6月前
|
监控 JavaScript 前端开发
JavaScript加密与解密技术:Hook技术应用案例分析
以上案例展示了如何利用JavaScript Hook技术结合强大且广泛采纳标准化算法(如AES),无缝地集成进Web应用程序以增强通信安全性。此种方法不仅能够确保敏感信息得到有效保护,并且由于它们操作适度透明、无需重构已存在代码基础架构而具备较高实际可行性及易操作性。
275 11
|
10月前
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
240 4
|
10月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
246 3
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
564 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
12月前
|
存储 算法 JavaScript
基于 Node.js 深度优先搜索算法的上网监管软件研究
在数字化时代,网络环境呈现出高度的复杂性与动态性,上网监管软件在维护网络秩序与安全方面的重要性与日俱增。此类软件依托各类数据结构与算法,实现对网络活动的精准监测与高效管理。本文将深度聚焦于深度优先搜索(DFS)算法,并结合 Node.js 编程语言,深入剖析其在上网监管软件中的应用机制与效能。
164 6
|
JavaScript 前端开发 容器
this、self、window、top 在 JavaScript 中的区别深入研究
在 JavaScript 开发中,`this`、`self`、`window` 和 `top` 是四个常用的概念。`this` 指向当前执行上下文的对象,其值取决于函数调用方式;`self` 在全局作用域中等同于 `window`,常用于 Web Workers;`window` 代表浏览器窗口,是全局变量的容器;`top` 指向最顶层窗口,用于判断是否在框架中。理解这些概念有助于编写健壮的代码。
433 1
this、self、window、top 在 JavaScript 中的区别深入研究