javascript - 有效地覆盖特定元素的本机 appendChild
问题描述
我正在尝试为本机 appendChild 方法插入一些特殊的方法,但我想覆盖特定元素的 appendChild 而不是覆盖Element.prototype.appendChild
所有元素。我可以创建一个方法,将我的 appendChild 添加到每个元素,但它会为大量元素产生不必要的开销。我目前正在从 dom 中克隆一些元素(可以有很多子元素),element.clone(true)
并且我想将克隆元素上对 appendChild 的所有调用“代理”到原始元素。可以在不一次覆盖每个元素的情况下更有效地完成吗?
解决方案
一种选择是创建一个递归函数,为appendChild
每个孩子创建一个自定义属性:
function customAppendChild(elm) {
elm.appendChild = function() {
console.log('insert custom logic here');
};
[...elm.children].forEach(customAppendChild);
return elm;
}
const clone = elm => customAppendChild(elm.cloneNode(true));
const cloned = clone(document.getElementById("test1"));
console.log(Element.prototype.appendChild);
console.log(cloned.appendChild);
console.log(cloned.children[0].appendChild)
<div id="test1">
<span id="test2">
<section id="test3">
<div id="test4">
</div>
</section>
</span>
</div>
当然,不是通过创建的元素不会clone
受到影响。(还要注意div
s 和section
s 不应该是span
s 的孩子)
推荐阅读
- c# - 注册用户无法登录asp.net身份
- sql - SQL 中的字符串到日期
- git - Git子模块:如何知道子模块的提交/标签
- python - ubuntu环境下使用python将ppt转换为视频
- python - 如何写入文件然后在 Python 中读取文件
- xml - XSLT - 如何在 XML 的同一行中使用多个键求和
- postgresql - 如何聚合postgresql中一列的所有数字?
- c# - C# Lambda - EF Core,Col A+ Col B
- javascript - 如何制作带有下一个/上一个按钮的猫头鹰旋转木马
- flutter - 使用 Scaffold.of(context) 尝试使用 openDrawer() 时,位置参数过多错误,发现 2 而不是 0