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

使用fetch与点击监听器的迷你问答游戏递归跳转异常问题

问答游戏监听器叠加导致自动跳题的解决方案

问题根源

每次调用theGame函数时都会给optionBox添加新的点击监听器,导致监听器叠加,触发一次点击就会执行多次回调,进而让level自动递增、跳过题目。

解决方法

  • 提前移除旧监听器,再添加新的
    把点击回调抽成独立函数,每次调用theGame时先移除旧监听器,再绑定新的,避免叠加:

    // 独立的点击处理函数
    function handleOptionSelect(e) {
      // 这里写你的答题逻辑:判断答案、计算得分等
      // ...
      // 处理完后进入下一题
      theGame(currentLevel + 1);
    }
    
    function theGame(level) {
      // 先移除之前的监听器
      optionBox.removeEventListener('click', handleOptionSelect);
      // 再绑定新的监听器
      optionBox.addEventListener('click', handleOptionSelect);
      // 加载当前level的题目、选项等渲染逻辑
      // ...
    }
    
  • 用事件委托,只绑定一次监听器
    直接在选项的父容器上绑定一次事件委托,后续只更新题目内容,不用重复绑定监听器:

    // 页面初始化时只绑定一次
    document.querySelector('.options-wrapper').addEventListener('click', function(e) {
      // 确认点击的是选项元素
      if (e.target.matches('.option-item')) {
        // 执行答题逻辑,获取当前level、判断答案
        // ...
        // 更新level后渲染新题目
        theGame(nextLevel);
      }
    });
    
    function theGame(level) {
      // 只负责渲染当前level的题目和选项,不用管监听器绑定
      // ...
    }
    
  • 使用once参数让监听器自动失效
    添加监听器时设置once: true,这样监听器触发一次后会自动移除,不会叠加:

    function theGame(level) {
      optionBox.addEventListener('click', function(e) {
        // 答题逻辑代码
        // ...
        // 进入下一题
        theGame(level + 1);
      }, { once: true }); // 触发一次后自动移除监听器
      // 渲染当前题目逻辑
      // ...
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:45:01