通过表单调用generateReport函数时startdate/enddate未定义问题
问题:通过表单调用报表函数时出现
startdate/enddate未定义错误 问题重现
- 直接通过HTML按钮调用
generateReport函数时功能完全正常 - 通过自定义表单参数调用时,控制台抛出
startdate和enddate未定义的错误
原因分析
表单元素(单选框、输入框等)的value属性默认返回字符串类型,而generateReport的switch语句是基于数值类型的reportmode进行分支匹配的。当你传入字符串类型的"1"、"2"时,switch里的case 1(数值1)不会匹配,导致startdate和enddate从未被赋值,后续调用.toString()时就会触发未定义错误。
比如grmode = document.querySelector('input[name="grmode"]:checked').value拿到的是字符串"1",而非数字1,因此switch的case 1分支不会执行,startdate和enddate始终处于未定义状态。
解决方法
1. 转换表单参数为数字类型
在advancedReport函数中,将获取到的数值类参数转换成数字类型后再传入generateReport:
function advancedReport() { let grtype = document.getElementById("grtype").value; // 转换单选框值为数字 let grmode = Number(document.querySelector('input[name="grmode"]:checked').value); // 转换日期范围值为数字 let grrange = Number(document.getElementById("grrange").value); // 转换注册码值为数字,默认0 let grregister = Number(document.getElementById("grregister").value) || 0; generateReport(grtype, grmode, grrange, grregister); }
2. 给generateReport添加参数类型校验(可选)
在generateReport开头添加类型转换逻辑,避免后续因参数类型不匹配引发问题:
function generateReport(reporttype, reportmode = 1, reportrange = 0, reportregister = 0) { // 强制转换参数为数字类型,确保分支匹配正常 reportmode = Number(reportmode) || 1; reportrange = Number(reportrange) || 0; reportregister = Number(reportregister) || 0; var startdate; var enddate; var currentdate = new Date().setHours(0,0,0,0); var dayofweek = new Date().getDay(); // ... 原switch逻辑 }
3. 给switch添加default分支(可选)
添加默认分支处理未匹配的reportmode,防止变量未赋值:
switch(reportmode) { case 1: // Range mode reportrange = reportrange * 86400000; startdate = currentdate - reportrange; enddate = currentdate + 86399999; break; case 2: // Yesterday mode startdate = currentdate - 86400000; enddate = currentdate - 1; break; case 3: // WTD mode startdate = dayofweek * 86400000; startdate = currentdate - startdate; enddate = currentdate + 86399999; break; // 默认分支,兜底处理未匹配的情况 default: startdate = currentdate; enddate = currentdate + 86399999; break; }
内容的提问来源于stack exchange,提问作者Laraso
相关产品推荐
相关产品推荐

