如何获取用户输入的间隔值用于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
相关产品推荐
相关产品推荐

