vxe表格实现键盘上下左右方向键移动聚焦

news/2024/11/24 3:04:05/

vxe表格分为vxe-table一般表格和vxe-grid高级表格,两者之间的区别我就不说啦,我们来实现这两种表格用键盘按动上下左右方向键达到移动聚焦的效果。话不多说,上正文!!!

首先在标签放入这两个事件:

  <vxe-grid @cell-click="cellClickEvent" @keyup="keyDown($event)"></vxe-grid>

主要是利用vxe表格内置的@cell-click事件,来监听点击单元格的行号和列号,相当于坐标轴的x轴和y轴。然后再利用@keyup键盘监听函数来监听方向键。思路有了,来肝!!!

 大家可以根据这DOM图来参考代码--------------------------------------------------------------------------------

let currCell = {} // 初始化当前选中的单元格行列号
let _currCell = {} // 拷贝初始化当前选中的单元格行列号// 单元格点击事件
function cellClickEvent ({ row, column }) {const currRow = Number(row._X_ROW_KEY.split('_')[1])  // 当前行号const currCol = Number(column.id.split('_')[1]) // 当前列号currCell = { 'row': currRow, 'column': currCol }  // 当前行列号
}// 方向键事件
function keyDown (e) {if (!(e.keyCode === 37 || e.keyCode === 38 || e.keyCode === 39 || e.keyCode === 40 || e.keyCode === 9)) return
// 如果不是上下左右方向键或Tab键直接返回(Tab键不放进来的话,会出现点击Tab键,聚焦到右边,但行列号还是原来位置)_currCell = JSON.parse(JSON.stringify(currCell)) // 深拷贝初始值const trs = document.querySelectorAll('.vxe-body--row') //所有的tr行const cols = trs[0].querySelectorAll('td') // 所有的td列(每一行的列号都一致)const maxTd = cols[cols.length - 1].getAttribute('colid').split('_')[1] // 最大列号const minTd = cols[0].getAttribute('colid').split('_')[1] //最小列号const maxTr = trs[trs.length - 1].getAttribute('rowid').split('_')[1] // 最大行号const minTr = trs[0].getAttribute('rowid').split('_')[1] // 最小行号// 方向左键 37if (e.keyCode === 37) {if (currCell.column <= minTd) return  // 如果当前单元格行号小于或等于最小列号,则直接返回for (let index = 0; index < 520; index++) { // 防止中间列出现缺失情况,行亦如此currCell.column--let targetCell = document.querySelector(`tr[rowid=row_${currCell.row}]`).querySelector(`.col_${currCell.column}`)if (targetCell) {if (targetCell.querySelector('input')) {targetCell.querySelector('input').focus(); return}if (targetCell.querySelector('.vxe-cell--label')) { // 只有点击后才会有输入框的单元格targetCell.querySelector('.vxe-cell--label').click(); return}}}}// 方向右键 39if (e.keyCode === 39 || e.keyCode === 9) {  // tab键在表格上与右键效果基本相似,可等同if (currCell.column >= maxTd) returnfor (let index = 0; index < 521; index++) {currCell.column++let targetCell = document.querySelector(`tr[rowid=row_${currCell.row}]`).querySelector(`.col_${currCell.column}`)if (targetCell) {if (targetCell.querySelector('input')) {targetCell.querySelector('input').focus(); return}if (targetCell.querySelector('.vxe-cell--label')) {targetCell.querySelector('.vxe-cell--label').click(); return}}}}// 方向上键 38if (e.keyCode === 38) {if (currCell.row <= minTr) returnfor (let index = 0; index < 1314; index++) {currCell.row--let targetRow = document.querySelector(`tr[rowid=row_${currCell.row}]`)if (targetRow) {  // 如果当前行都不存在,再查列会直接报错let targetCell = document.querySelector(`tr[rowid=row_${currCell.row}]`).querySelector(`.col_${currCell.column}`)if (targetCell) {if (targetCell.querySelector('input')) {targetCell.querySelector('input').focus(); return}if (targetCell.querySelector('.vxe-cell--label')) {targetCell.querySelector('.vxe-cell--label').click(); return}}}}}// 方向下键 40if (e.keyCode === 40) {if (currCell.row >= maxTr) returnfor (let index = 0; index < 9999; index++) {currCell.row++let targetRow = document.querySelector(`tr[rowid=row_${currCell.row}]`)if (targetRow) {let targetCell = document.querySelector(`tr[rowid=row_${currCell.row}]`).querySelector(`.col_${currCell.column}`)if (targetCell) {if (targetCell.querySelector('input')) {targetCell.querySelector('input').focus(); return}if (targetCell.querySelector('.vxe-cell--label')) {targetCell.querySelector('.vxe-cell--label').click(); return}}}}}currCell = _currCell; return  // 如果跳转的不是输入框,就赋回给初始值
}
export { cellClickEvent, keyDown }

四个 if 里面都有一些公共代码,本来想在for循环里面加方向键的判断,但一想想性能可能会不好,就算了。

for 循环的循环次数看自己表格中缺失(删除或隐藏)的行列多少了,一般设置10以内就够了(别告诉我你喜欢中间隐藏 1 千条 (°ˊДˋ°) )

关于点击后才会生成 input 框的单元格,大家可以看下这图:

如果大家发现明明跳转的是可生成 input 框的单元格,但就是没有跳转,那可能是这行渲染代码没有加上:        editRender: { name: "input" }

温馨提示:我这个代码没有实现在最左边单元格向左移动,自动跳转到上一行最右边那个单元格的效果,因为我感觉这样太飘了(反正我是不会觉得我菜)


http://www.ppmy.cn/news/305462.html

相关文章

计算机方向键是哪个键,你可能从来没碰过的键,电脑键盘方向键上面的3个按键有什么用?...

Hello大家好&#xff0c;我是兼容机之家的小牛。 我们在使用标准108键键盘的时候&#xff0c;经常只使用左边的英文字符区域和右边的小键盘区域&#xff0c;而方向键上方的3个按键大家可能从来没碰过&#xff0c;这些按键你知道它有哪些用处吗&#xff1f; 1、prt sc/sys rq键 …

被诺基亚冷落 英特尔MeeGo主攻平板电脑

在日前举行的2011年英特尔信息技术峰会&#xff08;简称IDF&#xff09;上&#xff0c;英特尔公司高级副总裁、软件与服务事业部总经理詹睿妮透露年内会有多款基于MeeGo操作系统的平板电脑上市。 今年2月&#xff0c;在诺基亚与英特尔合作的MeeGo操作系统即将迎来自己一岁生日时…

计算机上的win键是什么意思,win是电脑上哪个键

我们很多操作都会使用快捷键来完成&#xff0c;比如运行可以使用winr来快速打开&#xff0c;通过win键可以跟其他键组合来实现更多操作&#xff0c;可是因为键盘上没有win键字样&#xff0c;所以导致有一部分用户还不知道win是电脑上哪个键&#xff0c;其实这个win键就是键盘上…

电脑键盘上计算机是哪个键,普通计算机键盘上的哪个键是选项键?

Oo&#xff0c;城市管理团队的负责人 已安装硬件数字产品的手机数字 普通计算机键盘没有此键&#xff0c;某些特定型号不知道. 1. 该选项键是专门为Apple笔记本或台式计算机的键盘设计的. 2. 通常&#xff0c;其他品牌的键盘没有选项键&#xff0c;也没有此功能. 3. 它是Apple计…

电脑开机是哪个键 电脑常用快捷键盘点

电脑开机是哪个键&#xff1f; 普通键盘没有开关机键&#xff0c;只有特殊键盘上才有关机键&#xff0c;也没用开机键。 电脑常用快捷键&#xff1a; F1 显示当前程序或者windows的帮助内容。 F2 当你选中一个文件的话&#xff0c;这意味着“重命名” F3 当你在桌面上的时候…

计算机主机按键名称,space是哪个键 各种电脑键位名称及功用详解【图文】

space&#xff0c;这个词不知道大家有没有听过或是见过。反正小编是知道的。嘿嘿……好吧言归正传&#xff0c;space就是一种我们电脑命令的一种。它属于某个键位的名字&#xff0c;其实我们有很多朋友都是只认识我们键盘上的26个英文字母和小键盘上的数字以及符号。其余的基本…

NJ68 键盘说明书

文章目录 1、蓝牙操作2、灯光操作3、Backspace4、电气参数5、基本参数 1、蓝牙操作 长按 Fn Q/W/E 3秒&#xff0c;蓝牙键盘进入配对状态&#xff0c;指示灯快闪&#xff1b;打开移动设备&#xff08;如手机&#xff09;蓝牙&#xff0c;选中 keydous&#xff1b;在 NJ68键盘…

idea插件开发-PSI

程序结构接口&#xff08;Program Structure Interface&#xff09;简称PSI&#xff0c;PSI是IDEA插件开发最复杂的一块内容&#xff0c;后续会有大量实战来强化理解此处的知识。PSI是IntelliJ 平台中的一个层&#xff0c;负责解析文件并创建语法和语义代码模型&#xff0c;为平…