我有一个指令来自动聚焦下一个输入,如下所示。该项目是 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 开发工具未打开时,它按预期工作。它也不适用于设备。除了可能较慢的执行周期之外,我看不出这里有什么区别?