在需要多次使用 innerHTML 的地方,一般是推荐用 DocumentFragment 来缓存,最后一次性插入 body,从而减少浏览器的渲染,提高性能,不过最近也发现一个 bug:
DocumentFragment 不支持 innerHTML
这是个什么意思呢?考虑下面代码:
let fragment=document.createDocumentFragment(); fragment.innerHTML='<p>test</p>'; console.log(fragment.childElementCount);//0
你会发现设置 innerHTML 并不能获取到子元素,如果换成 div:
let div=document.createElement('div'); div.innerHTML='<p>test</p>'; console.log(div.childElementCount);//1
相比之下,感觉很不合理,而且明显不合理,但实际上就是这个样子;
但是实际上说合理也是合理的,因为 DocumentFragment 永远不会被添加到文档里,所以没有原生的 innerHTML 属性,看起来也很正常,不是么?你可以修改 div 的innerHTML 而改变里面的内容,生成 DOM 对象,改变浏览器的渲染结果,但是 DocumentFragment 自身永远不会被添加进文档,浏览器里也永远看不到它,,,
参考文档: