我正在使用AngularJS开发Ionic应用程序。

我只有很少的输入(登录/注册内容),当按下Enter键时-android上的按钮-和iOS上的等效按钮-KeyCode 13,它着重于下一个具有自定义指令的输入。

它在Web浏览器上可以很好地工作,但是在电话上,它可以聚焦下一个输入,然后焦点立即消失,键盘隐藏起来,迫使用户再次单击输入。

这是 HTML :

<ion-view title="First Screen" hide-nav-bar="true" id="firstScreen" class=" ">
<ion-content padding="false" style="background: url(img/XAYpMMdUTvWFVAnrEhUi_restaurant.jpg) no-repeat center;background-size:cover;" class=" manual-remove-top-padding" scroll="false">
    <div class="">
        <img src="img/awdYDbeeSlSHCToXN5Lw_logo.png" width="auto" height="30%" style="display: block; margin-left: auto; margin-right: auto;">
    </div>
        <label class="item item-input " id="emailInput" name="email">
            <input class="invisible-input" type="email" placeholder="Email" ng-model="user.email" focus-me="currentInput == 0" ng-keyup="inputKeyEvent($event, 0)">
     </label>
    <label class="item item-input " id="passwordInput" name="password">
        <input class="invisible-input" type="password" placeholder="Mot de passe"  focus-me="currentInput == 1" ng-model="user.password" ng-keyup="inputKeyEvent($event, 1)">
    </label>
    <label  ng-show="isSignUp" class="item item-input " ng-class="{'animated fadeInLeft': isSignUp, 'animated fadeOutLeft' : !isSignUp && changed }" id="confirmPasswordInput" name="password">
        <input class="invisible-input" type="password" placeholder="Confirmation du mot de passe"  focus-me="currentInput == 2" ng-model="user.confirmation" ng-keyup="inputKeyEvent($event, 2)">
    </label>
    <div>
        {{response}}
    </div>
    <div class="actionButtonContainer">
        <button ng-click="signin()" id="loginButton" class=" button button-balanced  button-full">Se oonnecter</button>
        <button ng-click="signup()" id="signupButton" class=" button button-energized  button-full" ng-disabled="disableSignUp()">S'inscrire</button>
    </div>
</ion-content>

这是指令:
directive('focusMe', function() {
return {
    link: function (scope, element, attrs) {
        scope.$watch(attrs.focusMe, function (value) {
            if (value === true) {
                element[0].focus();
            }
        });
    }
};

这是涉及的 Controller 方法:
$scope.inputKeyEvent = function(event, inputId)
{
    $scope.response = event.keyCode;
    if (event.keyCode == 13)
    {
        $scope.currentInput = inputId + 1;
        if ($scope.currentInput == 2 && !$scope.isSignUp)
            $scope.signin();
        else if ($scope.currentInput == 3 && $scope.isSignUp)
            $scope.signup();
    }
}

谢谢你的帮助 !

编辑

问题是我的genymotion模拟器,它在真实电话上(至少是我的手机)确实运行良好。

最佳答案

我认为您应该在未聚焦的元素上调用blur()方法。
我已经完成了 ionic 和 Cordova 的工作,它完美地工作。

同样,将focus()包装在timeout(用于 Angular 版本的$timeout或用于vanillajs的setTimeout)中的下一个元素上,以便在模糊结束后在另一个作用域中执行焦点。

您应该具有以下内容:

$scope.inputKeyEvent = function(event, id) {
    // prevent default
    event.preventDefault();

    // blur on the unfocused element
    event.target.blur();

    // focus on next element
    // wrapped in timeout so it will run
    // in "another thread"
    $timeout(function() {
      // If you want to follow all angular best practices
      // Make a broadcast and read the event in the link function
      // of your directive
      var obj = document.getElementById(nextId);

      // Check if object exists
      if(obj) {
       obj.focus();
      }

    });
}

关于javascript - 使用javascript聚焦后,输入立即失去对Android的聚焦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37378548/

10-12 03:21