我用javascript创建了一个表格,表格的行和列是基于矩阵的单元格数的,我试着使用一个函数,但是它不能识别创建的ID。
<!DOCTYPE html>
<html lang="en">
<head >
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="src/style.css">
</head>
<body onload="tableCreate()">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="src/script.js"></script>
</body>
</html>
第一部分创建表,第二部分在释放Enter键时增加光标,第三部分是如果表不包含其他行,并且在最后一个单元格中按Enter键,则创建新行
var c = [
['casa', 'casa1', 'casa2'],
['casa3', 'casa4', 'casa5'],
['casa6', 'casa7', 'casa8'],
['casa9', 'casa10', 'casa11'],
];
function tableCreate() {
const body = document.body,
tbl = document.createElement('table');
tbl.setAttribute('id', 'tab_1');
tbl.style.width = '100px';
tbl.style.border = '1px solid red';
for (let i = 0; i < c.length; i++) {
const tr = tbl.insertRow();
for (let j = 0; j < 3; j++) {
const td = tr.insertCell();
var x = document.createElement('INPUT');
x.setAttribute('type', 'number');
x.setAttribute('class', 'username');
td.appendChild(x);
td.style.border = '2px solid yellow';
}
}
document.body.appendChild(tbl);
}
$('.username').focus(function (event) {
console.log('gd');
});
var currentBoxNumber = 0;
$('.username').keyup(function (event) {
if (event.keyCode == 13) {
textboxes = $('input.username');
console.log('o');
currentBoxNumber = textboxes.index(this);
if (textboxes[currentBoxNumber + 1] != null) {
nextBox = textboxes[currentBoxNumber + 1];
nextBox.focus();
nextBox.select();
event.preventDefault();
} else {
const bd = document.body,
tbl = document.getElementById('tab_1');
const tr = tbl.insertRow();
for (let j = 0; j < 3; j++) {
const td = tr.insertCell();
var x = document.createElement('INPUT');
x.setAttribute('type', 'number');
x.setAttribute('class', 'username');
td.style.border = '2px solid green';
td.appendChild(x);
}
bd.appendChild(tbl);
}
return false;
}
});
有人能帮我吗?谢谢
我尝试使用带有一些键的函数,但无法识别ID
1条答案
按热度按时间v9tzhpje1#
这里的问题不是
getElementById
没有通过ID找到元素,而是事件绑定发生在它绑定的元素存在之前。脚本中的事件顺序为:
1.创建
tableCreate
函数。1.将
focus
事件绑定到.username
元素。1.将
keyup
事件绑定到.username
元素。1.在文档
onload
上执行tableCreate()
.username
元素在tableCreate
函数中创建,该函数在绑定事件 * 之后 * 执行。在绑定事件时,您基本上是在(对jQuery)说:* 获取所有
.username
元素,并将此事件绑定到它们 *。但是因为这些元素还不存在,所以没有绑定任何内容。有两种方法可以在脚本中修复此问题:
tableCreate()
。document
,并使用jQuery's context将事件过滤为.username
元素(首选)第2点在绑定 * 单个 * 事件监听器时使用起来更简单,它将在监听器绑定后处理添加到DOM的元素的事件(因为
document
始终存在)。示例:
更新日期:2023年1月15日
与最初的答案一样,当您绑定
keyup
处理程序时,您绑定到了绑定发生时可用的.username
元素。在该语句之后添加的任何新的
.username
元素将不具有绑定。根据我上面的第二个建议,您可以将事件侦听器绑定到
document
,并为jQuery提供一个上下文过滤器,以便为其执行侦听器。为了完整起见,我已经使用这个上下文过滤器更新了您的代码,并且还简化了侦听器,以便允许它将焦点转移到下一行,即使在添加该行之后也是如此。