You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为动态生成的div添加mouseover事件实现悬停上色?

动态生成网格悬停上色解决方案

问题描述

需要实现鼠标悬停在动态生成的div上时为其上色的功能,这些div是用户调整range输入框的值后在container容器内创建的,无法通过外部函数直接访问它们。之前尝试在createGrid函数的循环中为每个gridSquare添加mouseover事件监听器直接设置背景色,但希望改用专门的外部上色函数实现,而非在创建div时绑定事件。

现有HTML代码

<body>
    <div>   
        <div id="outer_container">
        <div id="container"> </div>
    </div>
    
    <div id="user_input_container">
        <input type="color" class="user_input" name="" id="colour_picker" value="#000000">

        <button class="user_input" id="rainbow">Rainbow</button>
    <div>

        <div>
            <input class="user_input" type="range" min="2" max="100" value="16" name="options"
                id="grid_range">
        </div>

</body>

现有JavaScript代码

let container = document.getElementById(`container`);
function createGrid(number) {
  totalNumber = number * number;
  while (container.hasChildNodes()) {
    container.removeChild(container.firstChild);
  }

  for (let i = 0; i < totalNumber; i++) {
    let gridSquare = document.createElement("div");
    gridSquare.classList.add("grid_square");

    let cellwidth = container.clientWidth / number + `px`;
    let cellheight = container.clientHeight / number + `px`;

    gridSquare.style.width = `${cellwidth}`;
    gridSquare.style.height = `${cellheight}`;
    container.appendChild(gridSquare);
  }
}

document.addEventListener("DOMContentLoaded", () => {
  createGrid(range.value);
});

let range = document.getElementById(`grid_range`);

range.addEventListener(`change`, () => {
  createGrid(range.value);
});

let color = document.getElementById(`colour_picker`);

之前的尝试(需替换)

gridSquare.addEventListener("mouseover", (event) => {
  event.target.style.backgroundColor = color.value;
});

解决方案

采用事件委托机制,直接在容器上绑定一次事件,搭配独立的外部上色函数实现需求,无需为每个动态生成的元素单独绑定事件。

1. 编写独立的外部上色函数

定义专门的上色函数,负责处理背景色设置逻辑,同时判断触发元素是否为目标网格方块:

function colorGridSquare(event) {
  // 仅对带有grid_square类的元素生效
  if (event.target.classList.contains('grid_square')) {
    event.target.style.backgroundColor = color.value;
  }
}

2. 为容器绑定事件委托

在DOM初始化完成后,给container绑定mouseover事件,调用上述上色函数:

document.addEventListener("DOMContentLoaded", () => {
  createGrid(range.value);
  // 绑定事件委托到容器
  container.addEventListener('mouseover', colorGridSquare);
});

完整修改后的JavaScript代码

let container = document.getElementById(`container`);
let range = document.getElementById(`grid_range`);
let color = document.getElementById(`colour_picker`);

// 独立外部上色函数
function colorGridSquare(event) {
  if (event.target.classList.contains('grid_square')) {
    event.target.style.backgroundColor = color.value;
  }
}

function createGrid(number) {
  totalNumber = number * number;
  while (container.hasChildNodes()) {
    container.removeChild(container.firstChild);
  }

  for (let i = 0; i < totalNumber; i++) {
    let gridSquare = document.createElement("div");
    gridSquare.classList.add("grid_square");

    let cellwidth = container.clientWidth / number + `px`;
    let cellheight = container.clientHeight / number + `px`;

    gridSquare.style.width = `${cellwidth}`;
    gridSquare.style.height = `${cellheight}`;
    container.appendChild(gridSquare);
  }
}

document.addEventListener("DOMContentLoaded", () => {
  createGrid(range.value);
  // 事件委托绑定
  container.addEventListener('mouseover', colorGridSquare);
});

range.addEventListener(`change`, () => {
  createGrid(range.value);
});

方案优势

  • 性能更优:仅绑定一次事件,避免循环中重复绑定的冗余操作
  • 扩展性强:上色逻辑集中在独立函数中,后续修改(如添加彩虹模式、渐变效果)只需调整该函数
  • 适配动态元素:无论网格如何重新生成,事件都会自动对新元素生效

内容的提问来源于stack exchange,提问作者Muzzu153

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:34:53