我正在用 JavaScript 构建一个程序,该程序应该允许用户使用向上、向下、向左、向右按钮在表格单元格之间导航。单击方向按钮后,相应的表格单元格会突出显示。
我的桌子看起来像这样:
我正在努力构建控制方向按钮的功能,但我对如何实现这一点非常迷失。我需要能够传递包含当前突出显示的单元格的参数,但我不知道如何做到这一点。
到目前为止,我的 JavaScript 并没有真正做太多事情:
function right() {
document.getElementById("one").nextElementSibling.style.border = '2px solid black';
}
Run Code Online (Sandbox Code Playgroud)
任何关于如何处理这个问题的帮助都会很棒,因为我真的不知道如何去做。
使用纯 JS 的动态解决方案
您基本上可以将表对象存储在二维矩阵中。执行此操作时,有两个全局坐标 X 和 Y 存储当前网格位置。您可以绑定跟踪当前焦点位置的单击事件和键盘事件。
看看小提琴:https://jsfiddle.net/cnkr7wqa/5/
请注意,如果每行长度相同且每列长度相同,则无论行大小或列大小如何,此解决方案都是动态的。
另请注意,这适用于:鼠标单击、定向键盘按下和按钮按下
超文本标记语言
<table>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>5</td>
<td>6</td>
</tr>
<tr>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
</table>
<button>Left</button>
<button>Up</button>
<button>Right</button>
<button>Down</button>
Run Code Online (Sandbox Code Playgroud)
JavaScript
var dat = document.getElementsByTagName('td');
var numOfColumns = document.getElementsByTagName('tr').length;
var numOfRows = document.getElementsByTagName('tr').length;
var currIndex = 0;
var rowObj = document.getElementsByTagName('tr');
var oneColLength = rowObj[0].children.length;
var colObj = document.getElementsByTagName('td');
var totalData = rowObj.length * colObj.length;
var dataCounter = 0;
var matrixObj = new Array(rowObj.length);
var currentX = 0;
var currentY = 0;
var buttons = document.getElementsByTagName('button');
for(var i = 0; i < matrixObj.length; i++){
matrixObj[i] = new Array(oneColLength);
}
for(var i = 0; i < numOfRows; i++){
for(var j = 0; j < oneColLength; j++){
matrixObj[i][j] = colObj[dataCounter++];
}
}
for(var i = 0; i < buttons.length; i++){
buttons[i].addEventListener("click",function(){
removeAllBorders();
compareBtnEntity(this);
});
}
for(var i = 0; i < dat.length; i++){
dat[i].addEventListener("click",function(){
removeAllBorders();
this.style.border = "1px solid red";
compareEntity(this);
});
}
window.addEventListener("keyup",function(e){
switch(e.keyCode){
case 37:
if(currentX > 0){
currentX--;
repaint();
}
break;
case 38:
if(currentY > 0){
currentY--;
repaint();
}
break;
case 39:
if(currentX < oneColLength-1){
currentX++;
repaint();
}
break;
case 40:
if(currentY < matrixObj.length-1){
currentY++;
repaint();
}
break;
}
})
function removeAllBorders(){
for(var i = 0; i < dat.length; i++){
dat[i].style.border = "1px solid grey";
}
}
function compareEntity(ele){
for(var i = 0; i < matrixObj.length; i++){
for(var j = 0; j < oneColLength; j++){
if(ele == matrixObj[i][j]){
currentX = j;
currentY = i;
}
}
}
}
function compareBtnEntity(ele){
for(var i = 0; i < buttons.length; i++){
if(buttons[i] == ele){
break;
}
}
switch(i){
case 0:
if(currentX > 0){
currentX--;
repaint();
}
break;
case 1:
if(currentY > 0){
currentY--;
repaint();
}
break;
case 2:
if(currentX < oneColLength-1){
currentX++;
repaint();
}
break;
case 3:
if(currentY < matrixObj.length-1){
currentY++;
repaint();
}
break;
}
repaint();
}
function repaint(){
removeAllBorders();
matrixObj[currentY][currentX].style.border = "1px solid red";
}
Run Code Online (Sandbox Code Playgroud)