替代节点克隆的思路
本帖最后由 马黑黑 于 2023-12-26 23:55 编辑JavaScript的cloneNode能克隆一个节点,以及深克隆该节点——就是节点及其所有子节点。其实,我们也可以有其他的替代方法。我的思路非常简单:
(一)制作一个与被克隆元素 A 一模一样的元素 B;
(二)将 A 的 innerHTML 赋予 B;
(三)如果 A 有交互行为,需要做额外处理,令 B 也拥有相同功能。
这个方法,和 cloneNode 效果大体一致,innerHTML 也不能传递 JS交互行为,但它绝对兼容所有浏览器。
我在楼下试一下如下代码:
<style>
#mydiv, #cloneBox {
margin: 20px auto;
width: 300px;
height: 300px;
border: 1px solid gray;
cursor: pointer;
position: relative;
}
.leaf {
position: absolute;
left: 50px;
top: 50px;
width: 150px;
height: 150px;
border-radius: 50% 0%;
background: green;
}
</style>
<div id="mydiv" title="点我改变颜色">
<div class="leaf"></div>
</div>
<div id="cloneBox" title="点我改变颜色"></div>
<script>
let bgColors = ['green','lightgreen'];
let sColor = true;
mydiv.onclick = cloneBox.onclick = () => {
let leaves = document.querySelectorAll('.leaf');
leaves.forEach(elm => {
elm.style.background = bgColors;
});
sColor = !sColor;
};
cloneBox.innerHTML = mydiv.innerHTML;
</script>
<style>
#mydiv, #cloneBox {
margin: 20px auto;
width: 300px;
height: 300px;
border: 1px solid gray;
cursor: pointer;
position: relative;
}
.leaf {
position: absolute;
left: 50px;
top: 50px;
width: 150px;
height: 150px;
border-radius: 50% 0%;
background: green;
}
</style>
<div id="mydiv" title="点我改变颜色">
<div class="leaf"></div>
</div>
<div id="cloneBox" title="点我改变颜色"></div>
<script>
let bgColors = ['green','lightgreen'];
let sColor = true;
let leaves = document.querySelectorAll('.leaf');
mydiv.onclick = cloneBox.onclick = () => {
let leaves = document.querySelectorAll('.leaf');
leaves.forEach(elm => {
elm.style.background = bgColors;
});
sColor = !sColor;
};
cloneBox.innerHTML = mydiv.innerHTML;
</script>
哦,是要鼠标点击,我以为是划过呢。
点击后两个都同时变色了。{:4_187:} 第二篇叶子不用加上 <div class="leaf"></div>这句,也能实现同样的变化呢。
是cloneBox.innerHTML = mydiv.innerHTML;起作用的么? 哎呀,这么晚了,我得下了,明天要爬不起来了{:4_173:} 红影 发表于 2023-12-27 00:10
哎呀,这么晚了,我得下了,明天要爬不起来了
晚安 红影 发表于 2023-12-27 00:04
哦,是要鼠标点击,我以为是划过呢。
点击后两个都同时变色了。
onclick 事件是点击,onmouseover、onmouseenter、onmousemove分别是鼠标经过、进入、移动等事件 红影 发表于 2023-12-27 00:09
第二篇叶子不用加上 这句,也能实现同样的变化呢。
是cloneBox.innerHTML = mydiv.innerHTML;起作用的么?
第二片叶子是JS克隆的,原来没有。克隆后它也是一个HTML实体元素。 来看看,学不会吖{:6_228:} 马黑黑 发表于 2023-12-27 08:23
晚安
一个不小心{:4_173:} 马黑黑 发表于 2023-12-27 08:25
onclick 事件是点击,onmouseover、onmouseenter、onmousemove分别是鼠标经过、进入、移动等事件
这个onmouseenter好像很少用到呢。 马黑黑 发表于 2023-12-27 08:26
第二片叶子是JS克隆的,原来没有。克隆后它也是一个HTML实体元素。
看到黑黑已经把实例弄出来了,真速度啊{:4_199:} 红影 发表于 2023-12-27 09:38
看到黑黑已经把实例弄出来了,真速度啊
这简单的 红影 发表于 2023-12-27 09:37
这个onmouseenter好像很少用到呢。
它其实挺好。鼠标指针进入的恰那触发,move 鼠标指针进入后只要移动就处身,over介于enter和move之间。 红影 发表于 2023-12-27 09:36
一个不小心
放纵了 幸运草 发表于 2023-12-27 08:52
来看看,学不会吖
没关系 马黑黑 发表于 2023-12-27 13:25
这简单的
就算你想清楚了,代码变得简单,但是找到那么好看的图图(或偷拍的)和改造视频也不容易呢{:4_187:} 马黑黑 发表于 2023-12-27 13:26
它其实挺好。鼠标指针进入的恰那触发,move 鼠标指针进入后只要移动就处身,over介于enter和move之间。
这么个鼠标的操作,还分得这么细致,真想不到{:4_187:} 马黑黑 发表于 2023-12-27 13:27
放纵了
没事,一会办公室没人偷着眯一觉{:4_173:} 红影 发表于 2023-12-27 14:10
没事,一会办公室没人偷着眯一觉
也好