javascript - Angular:我想将 div 的焦点从箭头键按钮移到另一个

标签 javascript angular typescript

我正在从事 Angular 项目,遇到这样一种情况,我有一系列连续的 div,当用户点击任何 div 时,他应该能够使用箭头键从一个 div 移动到另一个 div。

请帮忙。

我尝试使用按键事件,但它对我没有帮助。尝试在 stackoverflow 上找到类似的问题,但所有答案都在 jquery 中,我需要在 typescript 中找到它。

moveCell(e){
  console.log(e);
}
.container{
width: 100%;
}

.cell{
width: 100px;
float:left;
}

.cell:hover,
.cell:focus{
background: red;
}
<div class="container">
<div class="cell" (keypress)="moveCell($event)">cell 1</div>
  <div class="cell" (keypress)="moveCell($event)">cell 2</div>
  <div class="cell" (keypress)="moveCell($event)">cell 3</div>
  <div class="cell" (keypress)="moveCell($event)">cell 4</div>
  <div class="cell" (keypress)="moveCell($event)">cell 5</div>
  <div class="cell" (keypress)="moveCell($event)">cell 6</div>
  <div class="cell" (keypress)="moveCell($event)">cell 7</div>
  <div class="cell" (keypress)="moveCell($event)">cell 8</div>
  <div class="cell" (keypress)="moveCell($event)">cell 9</div>
</div>

在我的代码中如果用户点击单元格 2,焦点应该自动转到单元格 2。之后如果用户使用键盘并按箭头键,它应该将焦点移动到下一个/上一个单元格。

最佳答案

keypress 不检测箭头键,而是使用keydown。为了接收焦点并监听按键事件,将属性 tabindex 添加到 div。

对于右箭头键,您需要检查当前事件元素是否不是最后一个元素,并将焦点转移到下一个元素。

对于左箭头键,检查当前事件元素是否不是第一个元素,然后将焦点切换到上一个元素。

--HTML--

<div class="container">
  <div tabindex="0" class="cell" (keydown)="moveCell($event)">cell 2</div>
  <div tabindex="1" class="cell" (keydown)="moveCell($event)">cell 3</div>
  <div tabindex="2" class="cell" (keydown)="moveCell($event)">cell 4</div>
  <div tabindex="3" class="cell" (keydown)="moveCell($event)">cell 5</div>
  <div tabindex="4" class="cell" (keydown)="moveCell($event)">cell 6</div>
  <div tabindex="5" class="cell" (keydown)="moveCell($event)">cell 7</div>
  <div tabindex="6" class="cell" (keydown)="moveCell($event)">cell 8</div>
</div>

--组件代码--

  length: 0;
  domEles;
  moveCell(e){
    const activeEle = document.activeElement;
    const activeEleIndex = Array.prototype.indexOf.call(this.domEles, activeEle);
    if(e.key == "ArrowRight" && activeEleIndex < this.length - 1 ) {
        activeEle.nextElementSibling.focus();
    } 

    if(e.key == "ArrowLeft" && activeEleIndex > 0) {
       activeEle.previousElementSibling.focus();
    }
  }

  ngOnInit() {
    this.domEles = document.querySelectorAll('.container > *');
    this.length = this.domEles.length;
  }

工作代码 - https://stackblitz.com/edit/angular-5qxicw .

关于javascript - Angular:我想将 div 的焦点从箭头键按钮移到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56608536/

相关文章:

javascript - 在 chart.js 折线图上使 x 轴上的月份可点击

javascript - Twitter 小部件并不总是加载

angular - angular2中的应用程序常数?

javascript - mat-spinner 是如何在 mat-table 中渲染的?

javascript - 使用选择选项更改多个跨度值

javascript - 如何在JSDOC中像TS一样输入keyof实例?

javascript - 无法读取未定义的 Angular 5 的属性 'toLowerCase'

angular - 如何在 Angular 7 中为 formControl 设置动态值

ios - 从react-native-fcm迁移到react-native-firebase时出错

sql - 如何在 TypeORM 迁移中指定列名大小写