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

如何用原生JavaScript实现点击div添加active类并延时移除?

问题:点击div添加/移除active类的原生JS实现问题

我需要实现点击div时为其添加active类,一段时间后移除该类,后续还要操作该div内的内容。目前用jQuery已经实现了功能,但原生JavaScript的尝试仅对第一个元素生效,求正确的实现方法。

现有代码

HTML

<div class="main-wrapper">
  <div class="content" onclick="showMessage()">
    Content div
  </div>
  <div class="content" onclick="showMessage()">
    Content div
  </div>
  <div class="content" onclick="showMessage()">
    Content div
  </div>
  <div class="content" onclick="showMessage()">
    Content div
  </div>
  <div class="content" onclick="showMessage()">
    Content div
  </div>
</div>

可用的jQuery代码

jQuery('.content').on("click", function() {
  jQuery(this).addClass("active");
  setTimeout(RemoveClass, 5000);
});

function RemoveClass() {
  jQuery(this).removeClass("active");
}

有问题的原生JavaScript代码

function showMessage(){
  document.querySelector(".content").classList.toggle("active");
  setTimeout(() => {
    document.querySelector(".content").classList.toggle("active");
  }, 600)
}

问题原因

你的原生JS代码中,document.querySelector(".content")只会返回匹配选择器的第一个DOM元素,所以无论点击哪个div,操作的都是第一个元素,导致只有第一个div生效。

解决方案

方案1:修改onclick事件,传递当前元素

修改HTML中的onclick属性,把当前点击的元素作为参数传入函数:

<div class="main-wrapper">
  <div class="content" onclick="showMessage(this)">
    Content div
  </div>
  <div class="content" onclick="showMessage(this)">
    Content div
  </div>
  <div class="content" onclick="showMessage(this)">
    Content div
  </div>
  <div class="content" onclick="showMessage(this)">
    Content div
  </div>
  <div class="content" onclick="showMessage(this)">
    Content div
  </div>
</div>

然后更新JS函数,直接操作传入的元素:

function showMessage(element) {
  element.classList.add("active");
  setTimeout(() => {
    element.classList.remove("active");
    // 这里可以操作当前div内的内容,示例:
    // element.querySelector('.child-element').textContent = '更新内容';
  }, 600);
}

方案2:事件委托(推荐,解耦HTML与JS)

去掉HTML中的onclick属性,通过父元素绑定事件,利用事件冒泡判断点击目标:

<div class="main-wrapper">
  <div class="content">
    Content div
  </div>
  <div class="content">
    Content div
  </div>
  <div class="content">
    Content div
  </div>
  <div class="content">
    Content div
  </div>
  <div class="content">
    Content div
  </div>
</div>

JS代码:

document.querySelector('.main-wrapper').addEventListener('click', function(e) {
  // 确认点击的是.content类的元素
  if (e.target.classList.contains('content')) {
    const target = e.target;
    target.classList.add('active');
    setTimeout(() => {
      target.classList.remove('active');
      // 操作div内内容的示例:
      // target.innerHTML += '<p>操作后的内容</p>';
    }, 600);
  }
});

这种方式的优势在于:即使后续动态添加新的.content元素,事件依然生效,同时HTML结构更简洁,避免了内联事件的耦合。

补充:修复你的jQuery代码小问题

原jQuery代码中,setTimeout(RemoveClass, 5000)会导致RemoveClass函数内的this指向window,无法正确移除类,修复后代码:

jQuery('.content').on("click", function() {
  const $current = jQuery(this);
  $current.addClass("active");
  setTimeout(() => {
    $current.removeClass("active");
  }, 5000);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:23:13