2

我有一个指令来自动聚焦下一个输入,如下所示。该项目是 Ionic 的 angularJs。它适用于另一个项目(基于phonegap - 不是离子),但在这个离子项目中它不是在玩球。标记是相同的。

(function() {
'use strict';
angular.module('appname.directives')
    .directive('focus', [function() {
    return {
        restrict: 'A',
        link: function($scope,elem) {

            //after character keypress the focus switches to the next input
            elem.bind('keyup', function(e) {

                if (e.keyCode >= 48 && e.keyCode <= 90 || e.keyCode >= 96 && e.keyCode <= 105) {

                    if (elem[0].value !== "") {
                        if (elem.nextAll('input') && elem.nextAll('input').length > 0) {
                            elem.nextAll('input').first().focus();    
                        } else {
                            elem.parent().parent().nextAll(".module__inner").first().find('input').first().focus();    
                        }        
                    }
                } 
            });
        }
    };
}]);
})();

html 看起来有点像下面:

    <div class="input-holder">
      <input data-order="1" focus />
      <input data-order="2" focus />
      <input data-order="3" focus />
    </div>

奇怪的是,在调试中我可以看到执行“elem.nextAll('input').first().focus();”行的代码

这确实会按下本机键盘,但不会关注下一个输入。奇怪的是,当我“制表”到下一个输入时,该指令起作用,我可以回到第一个输入,它会按预期自动制表。

在绑定指令方面,我可以调试并看到它正在触发,所以它不能成为与此相关的问题。HTML 是静态的,因此不存在事件委托问题。

我对此感到困惑,我一直回到的唯一一件事是,最初的 .focus() 似乎并没有真正集中注意力,而且每隔一段时间它就会集中注意力。

我尝试将它包装在 $timeout 和 $scope.$apply() 中,但似乎不起作用。

有没有人知道我可以尝试的东西?


编辑


奇怪的是,当我的 Chrome 开发工具未打开时,它按预期工作。它也不适用于设备。除了可能较慢的执行周期之外,我看不出这里有什么区别?

4

1 回答 1

0

我在设备上有类似的问题。

如果您使用的是 Ionic + AngularJS,那么您需要在 config.xml 中添加 Ionic Keyboard 插件和这些首选项

<preference name="KeyboardDisplayRequiresUserAction" value="false" />

<feature name="Keyboard">
  <param name="ios-package" value="IonicKeyboard" onload="true" />
</feature>

KeyboardDisplayRequiresUserAction首选项是阻碍焦点功能的首选项。

于 2015-06-04T02:36:22.057 回答