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

引文生成器Tab标签页功能异常问题修复咨询

标签页功能修复方案

问题概述

  • 点击同组子标签页时,未仅移除当前主标签组下的子标签active-sub-tab类,导致所有子标签都被添加该类
  • 切换主标签页时,默认激活第一个子标签,但未显示对应的输入框

原HTML结构

<div id="main-tabs">
    <button class="tab active" onclick="showTab('book')" data-tab="1">
        Book
    </button>
    <button class="tab" onclick="showTab('book-section')" data-tab="2">
        Book Section
    </button>
    <button class="tab" onclick="showTab('journal')" data-tab="3">
        Journal
    </button>
    <button class="tab" onclick="showTab('periodical')" data-tab="4">
        Periodical
    </button>
    <button class="tab" onclick="showTab('website')" data-tab="5">
        Website
    </button>
</div>
<div id="book" class="sub-tabs">
    <div class="sub-tabs-wrapper">
        <button class="sub-tab" onclick="showCitationStyle('apa-book')" data-tab="1"><span>APA</span><span>(Sixth Edition)</span></button>
        <button class="sub-tab" onclick="showCitationStyle('chicago-book')" data-tab="1"><span>Chicago</span><span>(Sixteenth Edition)</span></button>
        <button class="sub-tab" onclick="showCitationStyle('harvard-book')" data-tab="1"><span>Harvard</span><span>Anglia (2008)</span></button>
        <button class="sub-tab" onclick="showCitationStyle('ieee-book')" data-tab="1"><span>IEEE</span><span>(2006)</span></button>
        <button class="sub-tab" onclick="showCitationStyle('mla-book')" data-tab="1"><span>MLA</span><span>(Seventh Edition)</span></button>
        <button class="sub-tab" onclick="showCitationStyle('turabian-book')" data-tab="1"><span>Turabian</span><span>(Sixth Edition)</span></button>
    </div>
</div>
<div id="book-section" class="sub-tabs">
    <div class="sub-tabs-wrapper">
        <!-- 6 buttons with class sub-tab, same onclickCitationStyle() by replacing book with bookSection data-tab="2" -->
    </div>
</div>
<div id="journal" class="sub-tabs">
    <div class="sub-tabs-wrapper">
        <!-- 6 buttons with class sub-tab, same onclickCitationStyle() by replacing book with journal data-tab="3" -->
    </div>
</div>
<div id="periodical" class="sub-tabs">
    <div class="sub-tabs-wrapper">
        <!-- 6 buttons with class sub-tab, same onclickCitationStyle() by replacing book with periodical data-tab="4" -->
    </div>
</div>
<div id="website" class="sub-tabs">
    <!-- 6 buttons with class sub-tab, same onclickCitationStyle() by replacing book with website data-tab="5" -->
</div>
<!-- Inputs for Book Main tab -> sub-tabs -->
<div class="book-input-wrapper">
    <div id="apa-book" class="citation-style">
        <div class="cite-wrapper">
            <div class="input-wrapper">
                <!-- all the inputs for Book main tab sub-tab APA its generate button and output div -->
            </div>
        </div>
    </div>
    <div id="chicago-book" class="citation-style">
        <div class="cite-wrapper">
            <div class="input-wrapper">
                <!-- all the inputs for Book main tab sub-tab chicago its generate button and output div -->
            </div>
        </div>
    </div>
    <div id="harvard-book" class="citation-style">
        <div class="cite-wrapper">
            <div class="input-wrapper">
                <!-- all the inputs for Book main tab sub-tab harvard its generate button and output div -->
            </div>
        </div>
    </div>
    <div id="ieee-book" class="citation-style">
        <div class="cite-wrapper">
            <div class="input-wrapper">
                <!-- all the inputs for Book main tab sub-tab ieee its generate button and output div -->
            </div>
        </div>
    </div>
    <div id="mla-book" class="citation-style">
        <div class="cite-wrapper">
            <div class="input-wrapper">
                <!-- all the inputs for Book main tab sub-tab mla its generate button and output div -->
            </div>
        </div>
    </div>
    <div id="turabian-book" class="citation-style">
        <div class="cite-wrapper">
            <div class="input-wrapper">
                <!-- all the inputs for Book main tab sub-tab turabian its generate button and output div -->
            </div>
        </div>
    </div>
</div>
<!-- Inputs for Book Section Main tab -> sub-tabs -->
<div class="bookSection-input-wrapper">
    <!-- follow same structure as Inputs for Book Main tab -> sub-tabs just changed the ids by replacing -book from id to -bookSection -->
</div>
<!-- Inputs for Journal Main tab -> sub-tabs -->
<div class="journal-input-wrapper">
    <!-- follow same structure as Inputs for Book Main tab -> sub-tabs just changed the ids by replacing -book from id to -jouranl -->
</div>
<!-- Inputs for Journal Main tab -> sub-tabs -->
<div class="periodical-input-wrapper">
    <!-- follow same structure as Inputs for Book Main tab -> sub-tabs just changed the ids by replacing -book from id to -periodical -->
</div>
<!-- Inputs for Website Main tab -> sub-tabs -->
<div class="website-input-wrapper">
    <!-- follow same structure as Inputs for Book Main tab -> sub-tabs just changed the ids by replacing -book from id to -website -->
</div>

原问题JavaScript代码

//Function to show the sub-tabs for a given main tab
function showTab(tabId) {
  // Hide all sub-tabs
  var subTabs = document.getElementsByClassName("sub-tabs");
  for (var i = 0; i < subTabs.length; i++) {
    subTabs[i].style.display = "none";
  }
  // Show the sub-tabs for the selected main tab
  document.getElementById(tabId).style.display = "block";
}
// Function to show the citation style inputs for a given citation style
function showCitationStyle(citationStyle) {
  // Hide all citation style inputs
  var citationStyles = document.getElementsByClassName("citation-style");
  for (var i = 0; i < citationStyles.length; i++) {
    citationStyles[i].style.display = "none";
  }
  // Show the citation style inputs for the selected citation style
  document.getElementById(citationStyle).style.display = "block";
}
// Get all the main tabs
var tabs = document.querySelectorAll('.tab');
// Add the active class to the first tab
tabs[0].classList.add('active-tab');
for (var i = 0; i < tabs.length; i++) {
  tabs[i].addEventListener("click", function() {
      // Remove the active class from all tabs
      for (var j = 0; j < tabs.length; j++) {
          tabs[j].classList.remove("active-tab");
      }
      // Add the active class to the clicked tab
      this.classList.add("active-tab");
  });
}  
// Get all the sub-tabs
var subTabs = document.querySelectorAll('.sub-tab');
// Add the active class to the first sub-tab
subTabs[0].classList.add('active-sub-tab');
for (var i = 0; i < subTabs.length; i++) {
subTabs[i].addEventListener("click", function() {
    // Remove the active class from all sub-tabs
    for (var j = 0; j < subTabs.length; j++) {
        subTabs[j].classList.remove("active-sub-tab");
    }
    // Add the active class to the clicked sub-tab
    this.classList.add("active-sub-tab");
});
}

修复后的JavaScript代码

// 初始化:显示第一个主标签对应的子标签和输入框
document.addEventListener('DOMContentLoaded', function() {
    // 激活第一个主标签
    const firstMainTab = document.querySelector('.tab[data-tab="1"]');
    firstMainTab.classList.add('active-tab');
    // 激活第一个主标签下的第一个子标签
    const firstSubTab = document.querySelector('.sub-tab[data-tab="1"]');
    firstSubTab.classList.add('active-sub-tab');
    // 显示第一个子标签对应的输入框
    const firstCitationStyle = firstSubTab.getAttribute('onclick').match(/'([^']+)'/)[1];
    showCitationStyle(firstCitationStyle);
});

// 切换主标签页
function showTab(tabId) {
    // 隐藏所有子标签容器
    document.querySelectorAll('.sub-tabs').forEach(tab => {
        tab.style.display = 'none';
    });
    // 显示当前主标签对应的子标签容器
    document.getElementById(tabId).style.display = 'block';
    
    // 获取当前主标签的data-tab值
    const mainTabData = document.querySelector(`.tab[onclick="showTab('${tabId}')"]`).getAttribute('data-tab');
    // 移除所有子标签的激活状态
    document.querySelectorAll('.sub-tab').forEach(subTab => {
        subTab.classList.remove('active-sub-tab');
    });
    // 激活当前主标签组的第一个子标签
    const firstSubTab = document.querySelector(`.sub-tab[data-tab="${mainTabData}"]`);
    firstSubTab.classList.add('active-sub-tab');
    
    // 显示第一个子标签对应的输入框
    const citationStyleId = firstSubTab.getAttribute('onclick').match(/'([^']+)'/)[1];
    showCitationStyle(citationStyleId);
}

// 切换子标签页,显示对应输入框
function showCitationStyle(citationStyle) {
    // 隐藏所有输入容器
    document.querySelectorAll('.citation-style').forEach(style => {
        style.style.display = 'none';
    });
    // 显示当前子标签对应的输入容器
    document.getElementById(citationStyle).style.display = 'block';
}

// 主标签点击事件:管理激活状态
document.querySelectorAll('.tab').forEach(tab => {
    tab.addEventListener('click', function() {
        document.querySelectorAll('.tab').forEach(t => t.classList.remove('active-tab'));
        this.classList.add('active-tab');
    });
});

// 子标签点击事件:仅管理同组子标签的激活状态
document.querySelectorAll('.sub-tab').forEach(subTab => {
    subTab.addEventListener('click', function() {
        const currentTabData = this.getAttribute('data-tab');
        // 仅移除当前data-tab组下的子标签激活状态
        document.querySelectorAll(`.sub-tab[data-tab="${currentTabData}"]`).forEach(t => {
            t.classList.remove('active-sub-tab');
        });
        this.classList.add('active-sub-tab');
    });
});

修复要点说明

  • 子标签激活状态管理:点击子标签时,通过data-tab属性筛选同组子标签,仅移除当前组内的active-sub-tab类,避免影响其他组
  • 主标签切换联动:切换主标签时,自动激活对应组的第一个子标签,并调用showCitationStyle显示其输入框
  • 初始化逻辑:页面加载完成后,自动激活第一个主标签、子标签并显示对应输入框,确保初始状态正确
  • 简化DOM操作:使用querySelectorAll和forEach替代传统for循环,代码更简洁易维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:35:30