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

求助:ACF重复器环境下slideToggle()触发全部div的问题

解决ACF重复器中重复ID导致的批量显示问题

这是个非常典型的DOM选择器冲突问题——ACF重复器会循环渲染每一行内容,你写死的#button和#buy ID会被重复生成多次,当你点击按钮时,JS会选中所有匹配该ID的元素,自然就会把所有隐藏div同时展开了。下面是具体的修复方案:

1. 替换固定ID为动态唯一标识

在ACF重复器的循环里,利用get_row_index()获取当前行的索引(或者用你字段里的唯一值,比如自定义的ID字段),给每个按钮和对应的div绑定唯一的关联标识:

<?php if( have_rows('你的重复器字段名') ): ?>
  <?php while( have_rows('你的重复器字段名') ): the_row(); 
    $row_index = get_row_index(); // 获取当前行的索引,从1开始
  ?>
    <button class="toggle-buy-btn" data-target="buy-section-<?php echo $row_index; ?>">
      <img src="images/right-arrow.png" width="35" class="button__icon">
    </button>
    <div id="buy-section-<?php echo $row_index; ?>" class="tour-event__wrapper--hidden tour-event__wrapper--hidden-bottom">
      <div class="widget-containter">
        <?php // 你的重复器内容 ?>
      </div>
    </div>
  <?php endwhile; ?>
<?php endif; ?>

这里把固定ID改成了动态生成的buy-section-1、buy-section-2...,同时给按钮加了data-target属性,用来关联对应的div。

2. 编写关联的JS逻辑

通过按钮的data-target属性找到对应的目标div,实现单独切换:

// 给所有切换按钮绑定点击事件
document.querySelectorAll('.toggle-buy-btn').forEach(btn => {
  btn.addEventListener('click', function() {
    const targetId = this.getAttribute('data-target');
    const targetDiv = document.getElementById(targetId);
    
    // 切换显示/隐藏状态(用类控制更灵活)
    targetDiv.classList.toggle('active');
  });
});

3. 配合CSS优化显示控制

建议用CSS类来管理显示隐藏,比直接操作style.display更易维护:

.tour-event__wrapper--hidden {
  display: none;
}
.tour-event__wrapper--hidden.active {
  display: block;
}

这样后期要调整显示样式(比如用opacity过渡动画),只需要修改CSS即可,不用改动JS。

额外:jQuery版本(如果项目已引入)

如果你的项目里用了jQuery,可以用更简洁的写法:

$('.toggle-buy-btn').on('click', function() {
  $('#' + $(this).data('target')).toggleClass('active');
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:47:53