首页 > 解决方案 > 有没有办法覆盖单元格之间导航的默认行为?

问题描述

我有一个相当大且复杂的 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 元素不再存在。我怎样才能防止这种情况发生?

标签: javascriptarraysangularvirtual-machine

解决方案


我不确定这是最好的答案,甚至是正确的答案,但它确实有效,现在这是主要问题。我使用与单击蓝色箭头时相同的调用来移动到下一个角色。我没有使用该调用,而是创建了一个执行相同操作的新方法,只是它在导致 VM 生成错误的调用之前有十分之一秒的暂停。由于此时 DOM 已更新,因此不会触发错误。感觉更像是一种解决方法而不是答案,但我还没有想出更好的方法。仍然要求任何其他答案,因为我讨厌这种混乱。


推荐阅读