javascript - 有没有办法覆盖单元格之间导航的默认行为?
问题描述
我有一个相当大且复杂的 AngularJS 应用程序。有一次,我会显示一个带有一列数据字段的对话框。我追求的是一种快速输入数据的方法。这是一个例子:
我希望它工作的方式是能够输入数据,按 Enter 键并转到下一个结果。当它到达列的末尾时,转到下一个角色(与点击蓝色箭头按钮相同),当它到达那里时,将第一个元素作为焦点,这样数据输入就可以继续,而无需做任何额外的事情点击鼠标。
信不信由你,但我得到了一个似乎没有伤害任何东西的错误。
VM985:5 未捕获的类型错误:Array.prototype.indexOf 在 HTMLDocument.eval 的 indexOf () 处调用 null 或未定义(在 globalEval 处的 eval (VM501 jquery.min.js:2),:5:40)
列表本身是一个简单的对象数组,当您从一个角色转到另一个角色时,这些对象会被刷新,因为每个角色的项目数可能不同。我正在使用一个 Focus 方法,只要您到达列表中的最后一项,就会触发该方法:
element = document.getElementById("input" + $scope.piece[0].result.id);
if(element != null) {
element.focus();
}
如果每当我尝试将注意力集中在下一个角色的第一项上时,我就无法捕获此错误。就像我说的,它工作正常,只是这个错误在日志中,我讨厌这样的错误。
有任何想法吗?这是来自VM的错误,有没有好的方法来捕获这些错误?
一些进一步的信息。该错误是在 VM 内引起的。虽然代码将文档发送到下一组值,但在将底部单元格留给下一个角色的顶部单元格时,默认行为似乎仍在发生。虚拟机显示此错误:
> //Placed this eventListener here to avoid potential conflicts with other components. If sets focus to next editable cell when enter key
document.addEventListener('keydown', function (event) {
if ((event.keyCode === 13 || event.keyCode === 9) && event.target.nodeName === 'INPUT') {
var form = event.target.form;
var index = Array.prototype.indexOf.call(form, event.target);
if(index+1 >= form.elements.length){
form.elements[0].focus();
}else{
form.elements[index + 1].focus();
}
event.preventDefault();
}
})
错误出现在 var index = Array.prototype.indexOf.call(form, event.target); 并且错误是“TypeError:Array.prototype.indexOf 调用 null 或 undefined”
该命令试图引用的值是列表底部单元格的值,该值现在已消失,因为 lst 已被新列表覆盖。因此,VM 试图引用的 dom 元素不再存在。我怎样才能防止这种情况发生?
解决方案
我不确定这是最好的答案,甚至是正确的答案,但它确实有效,现在这是主要问题。我使用与单击蓝色箭头时相同的调用来移动到下一个角色。我没有使用该调用,而是创建了一个执行相同操作的新方法,只是它在导致 VM 生成错误的调用之前有十分之一秒的暂停。由于此时 DOM 已更新,因此不会触发错误。感觉更像是一种解决方法而不是答案,但我还没有想出更好的方法。仍然要求任何其他答案,因为我讨厌这种混乱。
推荐阅读
- javascript - 如何阻止用户在某个点滚动?
- reactjs - 设置用户后组件不会重新渲染
- java - 在 BouncyCastle BCFKS 密钥库中存储 X25519 密钥对
- android - 拖动时如何更新 SeekBarPreference 值?
- redis - 下划线作为redis中的键
- html - 角度材料步进器无法与角度形式的 mat-grid-list 一起正常工作
- ios - 我有一个表格视图单元格,我从视图控制器调用一个函数,该函数位于表格视图单元格中,如图所示,但它显示错误
- events - Linux:使用 entr 和 mutt 创建新文件时发送电子邮件
- opengl - GLUT 叠加层有什么用?
- makefile - Makefile % match-anything 规则选择“Makefile”目标