js创建dom节点之最容易被忽略的createDocumentFragment()方法

js常见的创建dom节点的方法有

  • createElement() 创建一个元素节点 => 接收参数为string类型的nodename
  • createTextNode() 创建一个文本节点 => 接收参数为string类型的text内容
  • createAttribute() 创建一个属性节点 => 接收参数为string类型的属性名称
  • createComment() 创建一个注释节点 => 接收参数为string类型的注释文本

本文要说的createDocumentFragment()方法,则是用了创建一个虚拟的节点对象,或者说,是用来创建文档碎片节点。它可以包含各种类型的节点,在创建之初是空的。


DocumentFragment节点不属于文档树,继承的parentNode属性总是null。它有一个很实用的特点,当请求把一个DocumentFragment节点插入文档树时,插入的不是DocumentFragment自身,而是它的所有子孙节点。这个特性使得DocumentFragment成了占位符,暂时存放那些一次插入文档的节点。它还有利于实现文档的剪切、复制和粘贴操作。
另外,当需要添加多个dom元素时,如果先将这些元素添加到DocumentFragment中,再统一将DocumentFragment添加到页面,会减少页面渲染dom的次数,效率会明显提升。


还有一个很重要的特性是,如果使用appendChid方法将原dom树中的节点添加到DocumentFragment中时,会删除原来的节点。
为了证明这一点我做了以下测试:

<body>
    <ul>
        <li>Alice</li>
        <li>Bob</li>
    </ul>
    <button onclick="test()">测试</button>
</body>

js代码中test()方法如下:

function test(){
    var li = document.getElementByTaName('li')[0];  //ul中的第一个li节点
    alert(document.getElementByTaName('li')[0].innerText) // 显示Alice

    var newFrag = document.createDocumentFragment();
    newFrag.appendChild(li);

    alert(document.getElementByTaName('li')[0].innerText) // 显示Bod
    alert(document.getElementByTaName('ul')[0].innerHTML)} //显示<li>Bob</li>,由此可见,第一个节点确实被删除了

    //现在fragment中的修改节点
    newFrag.childNode[0].childNodes[0].nodeValue='Candy';
    //更改一个孩子节点的文本内容
    // .childNodes[0].nodeValue等同于:.innerText  或.textContent

     document.getElementByTaName('ul')[0].appendChild(newFrag);
     alert(document.getElementByTaName('ul')[0].innerHTML)} //显示<li>Bob</li><li>Candy</li>  ,由此可见仅仅是添加了newFrag的子孙节点。
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值