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

如何获取用户输入的间隔值用于setInterval调用fibo函数?

解决你的定时器与表单提交问题

首先咱们拆解下你遇到的核心问题:

  • 点击提交按钮后,getinfo里的setInterval没生效,是因为你用了<input type="submit">,点击它会触发表单提交、刷新整个页面,刚创建的定时器还没运行就失效了;而页面加载时的外部setInterval是初始化阶段创建的,所以能正常工作。
  • 你还没把用户输入的间隔值(秒单位)转换成setInterval需要的毫秒单位,也没处理旧定时器,多次点击会导致多个定时器同时运行,数列输出会混乱。

下面是修改后的完整代码,我加了详细注释帮你理解:

<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
    <meta charset="utf-8">
    <title>Fibonacci Series</title>
    <b id="series">hi</b>
</head>
<body>
    <!-- 把submit改成button,避免表单提交刷新页面 -->
    <form>
        <label for="Range"> Range(N): </label>
        <input id="Range" type="text" placeholder="Range" name="Range">
        <label for="Interval"> Interval in seconds </label>
        <input id="Interval" type="text" placeholder="Interval" name="Interval">
        <input id="button" type="button" onclick="getinfo()" value="Start Series" />
    </form>

    <script type="text/javascript">
        var fis = [];
        // 声明变量存储定时器ID,方便后续清除旧定时器
        let timerId = null;
        var printS = document.getElementById('series');

        function getinfo(){
            // 先清除之前的定时器,避免多个定时器同时执行
            if(timerId){
                clearInterval(timerId);
            }
            
            // 获取用户输入的间隔值,转成数字后乘以1000转为毫秒
            let interv = parseInt(document.getElementById('Interval').value);
            if(isNaN(interv) || interv <= 0){
                alert('请输入有效的间隔秒数(大于0的数字)');
                return;
            }
            interv = interv * 1000;

            // 获取用户输入的数列长度限制,可选功能
            let range = parseInt(document.getElementById('Range').value);
            // 重置数组和显示内容,方便重新生成数列
            fis = [];
            printS.textContent = '';

            // 创建新定时器,使用用户输入的间隔值
            timerId = setInterval(fibo, interv);
        }

        function fibo(){
            // 若用户设置了数列长度,达到长度后自动停止定时器
            let range = parseInt(document.getElementById('Range').value);
            if(!isNaN(range) && fis.length >= range){
                clearInterval(timerId);
                return;
            }

            if(fis.length === 0){
                printS.textContent = '0 ';
                fis.push(0);
            }else if(fis.length === 1){
                printS.textContent += '1 ';
                fis.push(1);
            }else{
                let next = fis[fis.length-1] + fis[fis.length-2];
                printS.textContent += next.toString() + ' ';
                fis.push(next);
            }
        }
    </script>
</body>
</html>

关键修改点说明:

  • 将<input type="submit">改为<input type="button">,避免表单提交导致页面刷新,保证getinfo里的定时器能正常运行。
  • 新增timerId变量存储定时器ID,每次点击按钮先清除旧定时器,防止多个定时器叠加导致数列混乱。
  • 对用户输入的间隔值做了有效性校验,并转换为setInterval要求的毫秒单位。
  • 增加了数列长度限制功能,若用户输入了Range值,达到长度后自动停止定时器。
  • 每次点击按钮重置斐波那契数组和显示内容,支持重新生成数列。

内容的提问来源于stack exchange,提问作者Marco Mercado Espinoza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:59:32