使用上、下、左、右按钮导航表格单元格

123*_*123 4 html javascript

我正在用 JavaScript 构建一个程序,该程序应该允许用户使用向上、向下、向左、向右按钮在表格单元格之间导航。单击方向按钮后,相应的表格单元格会突出显示。

我的桌子看起来像这样:

我正在努力构建控制方向按钮的功能,但我对如何实现这一点非常迷失。我需要能够传递包含当前突出显示的单元格的参数,但我不知道如何做到这一点。

到目前为止,我的 JavaScript 并没有真正做太多事情:

function right() {
    document.getElementById("one").nextElementSibling.style.border = '2px solid black';
}
Run Code Online (Sandbox Code Playgroud)

任何关于如何处理这个问题的帮助都会很棒,因为我真的不知道如何去做。

A.S*_*rma 5

使用纯 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)