JS脚本放body末尾仍报无法访问null的innerHTML属性错误
错误根源
报错和script标签位置无关,核心是循环索引和DOM id不匹配:
- 你的for循环初始
step值为0,第一次循环拼接出的查找id是crit0,但页面中p标签的id范围是crit1~crit5,不存在id为crit0的元素,document.getElementById('crit0')返回null,访问null的innerHTML属性就会触发类型错误。 - 代码还有两个隐藏问题:
- 计数变量
answ未提前初始化,执行var answ = answ +1时右侧answ为undefined,计算结果会是NaN Math.round(Math.random())生成0和1的概率不均等,Math.random()返回[0,1)区间值,round取0的区间是[0,0.5)、取1的区间是[0.5,1),边界值会导致概率偏差
- 计数变量
修复后可运行代码
<p id="crit1"></p> <p id="crit2"></p> <p id="crit3"></p> <p id="crit4"></p> <p id="crit5"></p> <script> var criteria = [ ['opt1', 'opt2'], ['opt3', 'opt4'], ['opt5', 'opt6'], ['opt7', 'opt8'], ['opt9', 'opt10'] ]; // 提前初始化计数变量 var answ = 0; // 循环从1开始,匹配crit1~crit5的id序号 for (var step = 1; step <= 5; step++){ // 修正随机数逻辑,保证两个选项选中概率严格50% var rand = Math.floor(Math.random() * 2); // 数组索引从0开始,取对应行时用step-1匹配索引 if (rand === 1) { document.getElementById('crit' + step).innerHTML = criteria[step - 1][1]; answ += 1; } else { document.getElementById('crit' + step).innerHTML = criteria[step - 1][0]; } } </script>
修复逻辑说明
- 调整循环起止值为1~5,和DOM元素id的序号完全对应,不会再出现找不到元素的问题
- 数组索引用
step-1对齐循环序号,保证二维数组每一行和对应p标签一一匹配 - 循环外提前初始化
answ为0,避免计算得到NaN - 用
Math.floor(Math.random() * 2)替换原有随机数逻辑,保证0、1两个取值概率均等
内容的提问来源于stack exchange,提问作者raskolnikov
相关产品推荐
相关产品推荐

