이제 Enter 및 화살표 키 누름을 처리해 보겠습니다. 여기서 주요 작업은 엔터를 눌렀을 때 오른쪽에 있는 다음 셀을 선택하는 것입니다.
function handleEvent(event) {
// handles events for "enter"/ "up"/ "down"/ "left"/ "right" arrow keys
if (event.which == 13) {
//prevents the default action of the event from happening
event.preventDefault();
if (event.target.nextSibling != null) {
// go to next cell
event.target.nextSibling.focus()
}
else {
// go to next row's first cell
event.target.parentElement.nextSibling.firstChild.focus()
}
}
}
Enter 키를 누른 상태를 처리하고 오른쪽 셀을 선택합니다. 하지만 좋은 사용자 경험을 제공하기 위해 화살표 키도 처리하고 싶었습니다.
if (event.which == 39) {
// go to next cell
event.target.nextSibling.focus()
}
if (event.which == 37) {
// go to previous cell
event.target.previousSibling.focus()
}
if (event.which == 38) {
// go to previous row's same cell
event.target.parentElement.previousSibling.childNodes[event.target.cellIndex].focus()
}
if (event.which == 40) {
// go to next row's same cell
event.target.parentElement.nextSibling.childNodes[event.target.cellIndex].focus()
}
function createTable(rows, columns) {
for (let i=0; i<rows; i++) {
let row = document.createElement('tr');
for (let j=0; j<columns; j++) {
let cell = document.createElement('td');
cell.setAttribute('contenteditable', 'true') //makes cell editable
cell.setAttribute('onkeyup','handleEvent(event)') // calls postAnswer() function on keyup
cell.innerHTML = `${i}${j}`;
row.appendChild(cell);
}
document.getElementById('tableBody').appendChild(row);
}
}
events.js
function handleEvent(event) {
// handles events for "enter"/ "up"/ "down"/ "left"/ "right" arrow keys
if (event.which == 13) {
//prevents the default action of the event from happening
event.preventDefault();
if (event.target.nextSibling != null) {
// go to next cell
event.target.nextSibling.focus()
}
else {
// go to next row's first cell
event.target.parentElement.nextSibling.firstChild.focus()
}
}
if (event.which == 39) {
// go to next cell
event.target.nextSibling.focus()
}
if (event.which == 37) {
// go to previous cell
event.target.previousSibling.focus()
}
if (event.which == 38) {
// go to previous row's same cell
event.target.parentElement.previousSibling.childNodes[event.target.cellIndex].focus()
}
if (event.which == 40) {
// go to next row's same cell
event.target.parentElement.nextSibling.childNodes[event.target.cellIndex].focus()
}
}
그리고 이것은 코드의 최종 결과입니다.
이 작업을 해결하는 것이 즐거웠고 이벤트에 대해서도 거의 알지 못했습니다. 다른 사람들에게도 도움이 되기를 바랍니다.