我正在使用AngularJS处理Ionic App。
我得到的输入很少(登录/注册的东西),当按下Enter键时 - 在Android上的按钮和等效的iOS- KeyCode 13
,它会在下一个输入时关注自定义指令。< / p>
它在网络浏览器上运行得非常好,但在手机上,它会聚焦下一个输入,然后焦点会立即丢失,键盘会自行隐藏,迫使用户再次点击输入。
以下是 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();
}
});
}
};
以下是涉及的控制器方法:
$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模拟器,它确实在真正的手机上工作(至少是我的。)
答案 0 :(得分:2)
我认为你应该在未聚焦元素之前调用blur()
方法。
我已经完成了离子和cordova的工作,它完美无缺。
另外,将focus()
包裹在timeout
的下一个元素上(角度版本为$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();
}
});
}
答案 1 :(得分:1)
我做了一个plunkr示例和我的三星S5它的工作原理。没有您在问题中描述的问题。按下键(13)后,焦点会跳到下一个输入元素,而不是隐藏键盘或类似的东西。
也许是版本的东西。我没有使用构建的应用程序测试它。我用智能手机打开了那个傻瓜。看看这个。也许你会得到一些暗示。
https://plnkr.co/edit/R8uRlzQpfSg7w37nKEKH?p=preview
(为什么不再发布一个plunkr链接???)