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

JavaScript切换Div代码在iOS设备失效问题求助

iOS设备上点击Div切换显示/隐藏功能失效的解决建议

我编写了一段JavaScript代码,用于通过点击指定Div来显示或隐藏其他Div。该代码在PC浏览器及macOS设备(iMac/MacBook)上运行完全正常,但在iOS设备(iPad/iPhone)上无法生效。使用了Elementor和WordPress,但认为这与问题无关。相关代码如下:

// Check if the body doesn't have the CSS class 'elementor-editor-active'
if (!document.body.classList.contains('elementor-editor-active')) {
    const catButtons = document.querySelectorAll('.packages-btn, .programs-btn, .workshops-btn, .courses-btn, .tools-btn');
    const catContainers = document.querySelectorAll('.packages-container, .programs-container, .workshops-container, .courses-container, .tools-container');
  
    // If packages-btn clicked
    function packagesBtnClick() {
      for (let i = 0; i < catContainers.length; i++) {
        if (!catContainers[i].classList.contains('packages-container')) {
          catContainers[i].style.display = 'none';
        }
      }
      document.querySelector('.packages-container').style.display = 'block';
      document.querySelector('.btns-container').style.setProperty('--color-overlay-feria-container', '#009BB7');
    }
  
    catButtons.forEach((elemento) => {
      if (elemento.classList.contains('packages-btn')) {
        elemento.addEventListener('click', packagesBtnClick);
      }
    });
  
    // If programs-btn clicked
    function programsBtnClick() {
      for (let i = 0; i < catContainers.length; i++) {
        if (!catContainers[i].classList.contains('programs-container')) {
          catContainers[i].style.display = 'none';
        }
      }
      document.querySelector('.programs-container').style.display = 'block';
      document.querySelector('.btns-container').style.setProperty('--color-overlay-feria-container', '#E27727');
    }
  
    catButtons.forEach((elemento) => {
      if (elemento.classList.contains('programs-btn')) {
        elemento.addEventListener('click', programsBtnClick);
      }
    });
  
    // If workshops-btn clicked
    function workshopsBtnClick() {
      for (let i = 0; i < catContainers.length; i++) {
        if (!catContainers[i].classList.contains('workshops-container')) {
          catContainers[i].style.display = 'none';
        }
      }
      document.querySelector('.workshops-container').style.display = 'block';
      document.querySelector('.btns-container').style.setProperty('--color-overlay-feria-container', '#A9C45C');
    }
  
    catButtons.forEach((elemento) => {
      if (elemento.classList.contains('workshops-btn')) {
        elemento.addEventListener('click', workshopsBtnClick);
      }
    });
  
    // If courses-btn clicked
    function coursesBtnClick() {
      for (let i = 0; i < catContainers.length; i++) {
        if (!catContainers[i].classList.contains('courses-container')) {
          catContainers[i].style.display = 'none';
        }
      }
      document.querySelector('.courses-container').style.display = 'block';
      document.querySelector('.btns-container').style.setProperty('--color-overlay-feria-container', '#FFC23F');
    }
  
    catButtons.forEach((elemento) => {
      if (elemento.classList.contains('courses-btn')) {
        elemento.addEventListener('click', coursesBtnClick);
      }
    });
  
    // If tools-btn clicked
    function toolsBtnClick() {
      for (let i = 0; i < catContainers.length; i++) {
        if (!catContainers[i].classList.contains('tools-container')) {
          catContainers[i].style.display = 'none';
        }
      }
      document.querySelector('.tools-container').style.display = 'block';
      document.querySelector('.btns-container').style.setProperty('--color-overlay-feria-container', '#AD2A27');
    }
  
    catButtons.forEach((elemento) => {
      if (elemento.classList.contains('tools-btn')) {
        elemento.addEventListener('click', toolsBtnClick);
      }
    });
  }

以下是针对iOS设备问题的解决建议:

  • 给可点击Div添加CSS交互属性
    iOS Safari对非原生可点击元素(如div)的触摸响应支持有限,添加以下CSS可以让系统识别其为可交互元素:

    .packages-btn, .programs-btn, .workshops-btn, .courses-btn, .tools-btn {
      cursor: pointer;
      touch-action: manipulation; /* 禁用双击缩放,提升触摸响应速度 */
      user-select: none; /* 防止触摸时意外选中文本 */
    }
    
  • 补充触摸事件监听
    仅监听click事件在iOS上可能存在延迟或失效,同时绑定touchstart事件可以提升触摸设备的响应性:
    修改事件绑定部分,例如:

    elemento.addEventListener('click', packagesBtnClick);
    elemento.addEventListener('touchstart', packagesBtnClick);
    

    为避免click和touchstart重复触发,可以在事件处理函数中添加判断:

    function packagesBtnClick(event) {
      if (event.type === 'touchstart') event.preventDefault();
      // 原有逻辑...
    }
    
  • 重构代码减少重复逻辑
    原代码存在大量重复,不仅维护麻烦,也可能增加潜在错误概率。可以通过统一逻辑+数据映射优化代码,同时提升兼容性:

    if (!document.body.classList.contains('elementor-editor-active')) {
      const catButtons = document.querySelectorAll('.packages-btn, .programs-btn, .workshops-btn, .courses-btn, .tools-btn');
      const catContainers = document.querySelectorAll('.packages-container, .programs-container, .workshops-container, .courses-container, .tools-container');
      // 分类与对应颜色的映射表
      const categoryColors = {
        packages: '#009BB7',
        programs: '#E27727',
        workshops: '#A9C45C',
        courses: '#FFC23F',
        tools: '#AD2A27'
      };
    
      function handleCategoryClick(event) {
        // 防止触摸与点击事件重复触发
        if (event.type === 'touchstart') event.preventDefault();
        
        // 从按钮类名中提取分类标识
        const category = event.currentTarget.classList.value.match(/(\w+)-btn/)[1];
        
        // 隐藏所有容器
        catContainers.forEach(container => {
          container.style.display = 'none';
        });
        // 显示目标容器
        document.querySelector(`.${category}-container`).style.display = 'block';
        // 设置颜色变量
        document.querySelector('.btns-container').style.setProperty('--color-overlay-feria-container', categoryColors[category]);
      }
    
      // 为所有按钮绑定事件
      catButtons.forEach(btn => {
        btn.addEventListener('click', handleCategoryClick);
        btn.addEventListener('touchstart', handleCategoryClick);
      });
    }
    
  • 确保DOM加载完成后执行代码
    如果代码在DOM未完全渲染时执行,可能导致无法找到目标元素。将代码包裹在DOMContentLoaded事件中,确保元素已存在:

    document.addEventListener('DOMContentLoaded', function() {
      // 原代码或优化后的代码放在这里
    });
    

内容的提问来源于stack exchange,提问作者Santiago Cuartas Rmrz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:25:55