You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS iOS端:如何捕获点击DONE按钮关闭键盘的事件

解决AngularJS中仅捕获Done按钮关闭键盘的问题

这个需求我之前做移动端AngularJS项目时也碰到过,确实AngularJS自带的ng-keypress搞不定——因为Done按钮触发的是回车这类非打印字符的按键事件,ng-keypress只监听可打印字符,所以抓不到。而ng-blur又太宽泛,连点击页面其他地方失焦都会触发,完全不符合你的需求。不过有两个实用的办法可以解决:

方案一:用ng-keyup监听回车事件

大多数移动端键盘的Done按钮,本质上是映射到**回车键(keyCode 13)**的,部分安卓键盘可能会用keyCode 66。我们可以直接用ng-keyup监听按键抬起事件,然后判断对应的keyCode:

模板代码

<input type="text" ng-keyup="handleDoneButton($event)">

控制器代码

angular.module('yourApp').controller('YourController', function($scope) {
  $scope.handleDoneButton = function(event) {
    // 兼容iOS(13)和部分安卓键盘(66)的Done按键码
    const doneKeyCodes = [13, 66];
    if (doneKeyCodes.includes(event.keyCode)) {
      // 这里写你点击Done后的业务逻辑
      console.log('用户点击了Done按钮,键盘即将关闭');
      // 如果需要主动收起键盘,可以手动触发blur
      event.target.blur();
    }
  };
});

这个方案的好处是简单直接,不需要额外写指令,适合快速实现需求。

方案二:自定义可复用的on-done指令

如果你的项目里多个输入框都需要这个功能,写个自定义指令会更方便复用:

指令代码

angular.module('yourApp').directive('onDone', function() {
  return {
    restrict: 'A', // 属性型指令
    link: function(scope, element, attrs) {
      // 监听输入框的keyup事件
      element.on('keyup', function(event) {
        const doneKeyCodes = [13, 66];
        if (doneKeyCodes.includes(event.keyCode)) {
          // 触发指令绑定的表达式,需要用$apply触发AngularJS的脏检查
          scope.$apply(function() {
            scope.$eval(attrs.onDone);
          });
        }
      });
    }
  };
});

使用方式

<!-- 在输入框上绑定指令,指定触发的方法 -->
<input type="text" on-done="handleDoneAction()">

控制器方法

$scope.handleDoneAction = function() {
  // 执行你的业务逻辑
};

补充说明

  • 为什么ng-keypress不行?因为keypress事件只针对可打印字符,回车、Done这类属于控制字符,不会触发keypress,所以必须用keyup或keydown。
  • 如果是Cordova这类混合应用,还可以用键盘插件专门监听键盘收起事件,但纯Web场景用上面的方法就足够了。

内容的提问来源于stack exchange,提问作者24sharon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:57:18