javascript - 在 JS 中创建动态表,“Cannot read property 'addEventListener' of null”
问题描述
我应该使用 JS 在网页上动态创建一个表格。我不能使用 .appendChild 我通过 JSLint 运行 JS 脚本,我得到“未使用的'createTable'。函数 createTable() {”(除了它不喜欢我的 r++ 和 c++ 表达式)。我测试我的代码的 Chrome 调试器说:“未捕获的 TypeError:无法读取属性 'addEventListener' of null”。非常感谢您指出错误所在的任何帮助。
我的简单代码:
function createTable() {
var table = '';
var r, c;
var rowN = document.getElementById("rows").value;
var colN = document.getElementById("columns").value;
for (r = 1; r <= rowN; r++) {
table += '<tr>';
for (c = 1; c <= colN; c++) {
table += '<td>' + c + '</td>';
}
table += '</tr>';
}
document.getElementByID('table').innerHTML = '<table border=1>' + table + '</table>';
}
document.getElementById("submit").addEventListener("onclick", createTable, false);
<!DOCTYPE html>
<html>
<form>
<fieldset>
<label for="nRows">
Select number of rows:
</label>
<select id="rows" name="rows" tabindex="1">
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
<label for="nColumns">
Select number of columns:
</label>
<select id="columns" name="columns" tabindex="3">
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
</fieldset>
<input name="Submit1" tabindex="5" type="submit" value="Create Table" onclick="createTable()">
<input name="Reset1" tabindex="7" type="reset" value="Clear values">
</html>
解决方案
document.getElementById()
当它找不到您要查找的元素时返回 null。我没有看到带有提交 ID 的元素。您可以将您的 html 更改为此
还删除了 onClick 属性,因为您正在使用 js 添加事件侦听器。
<!DOCTYPE html>
<html>
<form>
<fieldset>
<label for="nRows">
Select number of rows:
</label>
<select id="rows" name="rows" tabindex="1">
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
<label for="nColumns">
Select number of columns:
</label>
<select id="columns" name="columns" tabindex="3">
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
</fieldset>
<input id="submit" name="Submit1" tabindex="5" type="submit" value="Create Table" >
<input name="Reset1" tabindex="7" type="reset" value="Clear values">
</html>
其次,您的 for 循环不会运行,因为<s>rowN and colN variables are objects. It seems like you want the amount of children within those elements so this should work. </s>
抱歉,您的值以字符串形式返回,您想将它们解析为数字。
function createTable() {
var table = '';
var r, c;
var rowN = parseInt(document.getElementById("rows").value);
var colN = parseInt(document.getElementById("columns").value);
for (r = 1; r <= rowN; r++)
{
table += '<tr>';
for (c = 1; c <= colN; c++)
{
table += '<td>' + c + '</td>';
}
table += '</tr>';
}
document.getElementByID('table').innerHTML = '<table border=1>' + table + '</table>';
}
document.getElementById("submit").addEventListener("onclick", createTable, false);
如果您仍然遇到相同的错误,请确保您的加载顺序是正确的。将您的脚本标签移动到正文的底部。
推荐阅读
- android - AnimatedList 中小部件的颤振状态未保留
- reactjs - webpack/babel 没有复制我的 onClick 方法
- python - 计算字符串中出现的次数
- ethereum - 为私有以太坊部署设置生产和登台环境
- forms - 我应该如何在不禁用帐户的情况下制作带有密码并确认密码字段的表单?
- regex - html中标签之间的搜索模式
- c# - foreach 中的异步调用不执行以下开关
- android - 为 stateFlow 编写单元测试
- flutter - toJson 无法正常工作 json 序列化程序未处理的异常:无效参数:“DietModel”的实例
- php - 将 IF 语句添加到 PHP