克隆后元素失去 javascript 功能

Posted

技术标签:

【中文标题】克隆后元素失去 javascript 功能【英文标题】:Elements lose javascript functionality after cloning 【发布时间】:2021-08-16 07:11:53 【问题描述】:

以下是代码。我所做的是制作一个项目(第一个),当我将鼠标悬停在它的按钮上时,它的背景颜色变为红色等等。

我接下来所做的是克隆元素并将其附加到新的 div 中。 html(具有相同类的元素)是相同的,但鼠标悬停事件不再起作用。

我的问题是为什么它不起作用,我该如何解决?我也尝试通过将内部 HTML 复制到新元素来做同样的事情,但每次都是一样的。

const colorDiv = document.querySelector(".color-div");
const button = document.querySelector("button");
const mainContainer = document.querySelector(".main-container");

button.addEventListener("mouseover", function() 
  colorDiv.style.backgroundColor = "red";
);

button.addEventListener("mouseout", function() 
  colorDiv.style.backgroundColor = "seagreen";
);

const newItem = mainContainer.cloneNode(true);
document.querySelector(".new-container").appendChild(newItem);
.color-div 
  height: 300px;
  width: 300px;
  background-color: seagreen;
  margin: 10px;
  padding: 10px;
  transition: all .3s;
<!-- I will copy the div with main container class -->
<div class="main-container">
  <div class="color-div">Hello</div>
  <button>Change</button>
</div>

<!-- and append copied item to the following item -->
<div class="new-container"></div>

【问题讨论】:

是的,这是预期的行为,没有克隆事件。您必须将事件附加到克隆元素或利用事件委托。见developer.mozilla.org/en-US/docs/Web/API/Node/cloneNode 和***.com/questions/1687296/… s您还必须在新项目上创建所有侦听器。见*** answer 还有一个问题:改变背景颜色只是一个例子吗?或者到底为什么有人会通过 JS 而不是 CSS 来改变悬停时的颜色? 那么我如何才能在我正在开发的其他人的网站上实现该功能。我不知道按钮中添加了哪些事件侦听器? @ArunBohra,检查代码,看看按钮添加了什么事件监听器? 【参考方案1】:

没有克隆事件,这里有一个快速修复:

const colorDiv = document.querySelector(".color-div");
const button = document.querySelector("button");
const mainContainer = document.querySelector(".main-container");

// If someone clicks on anywhere on the website THAT IS A BUTTON, then change the color.
document.addEventListener("mouseover", function(e) 
  if (e.target.matches("button")) 
    colorDiv.style.backgroundColor = "red";
  
);

document.addEventListener("mouseout", function(e) 
  if (e.target.matches("button")) 
    colorDiv.style.backgroundColor = "seagreen";
  
); 

const newItem = mainContainer.cloneNode(true);
document.querySelector(".new-container").appendChild(newItem);

这应该适用于每个克隆。

【讨论】:

以上是关于克隆后元素失去 javascript 功能的主要内容,如果未能解决你的问题,请参考以下文章

java 克隆对象问题(克隆后int[]的元素还是随动)

js克隆一段html元素,javascript克隆元素样式的实现代码

Javascript:对象设置器和获取器在克隆/复制/扩展后丢失

JavaScript DOM实战:创建和克隆元素

JavaScript中blur方法是啥意思?

Javascript事件