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

将jQuery的siblings功能转为原生JavaScript,解决指示点激活态切换异常问题

问题原因

  • document.getElementsByClassName('bullets') 返回的是匹配所有类名为bullets的DOM元素集合(HTMLCollection类数组对象),集合本身没有parentElement属性,调用bullets.parentElement会返回undefined,后续获取兄弟元素的逻辑直接失效。
  • 执行顺序颠倒:你先给目标元素添加active类,再遍历所有元素移除active类,会把刚添加的类也同步删掉,等于添加逻辑被覆盖。

修正方案

方案1(基于父级兄弟节点处理)

调整属性调用逻辑和执行顺序即可,完整代码如下:

const right = document.querySelector('.right');
const bullets = document.getElementsByClassName('bullets');
right.addEventListener('click', function(){
  const has = document.querySelector('.swiper-pagination-bullet-active').getAttribute('aria-label');
  const idx = Number(has.substr(12,1)) - 1;
  // 先取当前单个bullet元素的父级
  const parent = bullets[idx].parentElement;
  // 先遍历移除所有子元素的active类
  for(let sib of parent.children) {
    sib.classList.remove('active');
  }
  // 最后给目标元素添加active类
  bullets[idx].classList.add('active');
});

方案2(不依赖父级结构,更通用)

如果你的bullets元素可能分布在不同父容器下,直接遍历所有bullets元素过滤处理即可:

const right = document.querySelector('.right');
const bullets = document.getElementsByClassName('bullets');
right.addEventListener('click', function(){
  const has = document.querySelector('.swiper-pagination-bullet-active').getAttribute('aria-label');
  const idx = Number(has.substr(12,1)) - 1;
  // 遍历所有bullets,排除当前目标元素后移除active
  for (let i = 0; i < bullets.length; i++) {
    if (i !== idx) {
      bullets[i].classList.remove('active');
    }
  }
  bullets[idx].classList.add('active');
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:09:03