当字段值达到最大长度时,如何关注下一个字段

时间:2014-08-17 09:53:54

标签: angularjs

我有一个场景,我有两个或更多的textarea,当用户在textarea中输入值,当值达到max-length,例如ng-max-length为15时,焦点应自动移动到下一个文本 - 面积。

如何实现这一目标?

为了控制最大长度,我已经从link获得了解决方案。

但我不知道如何自动关注下一个元素

下面我给出了我试过的代码

textarea.html

<!DOCTYPE html>

<html>
    <head>
        <title>Angular App</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width">
    </head>
    <body>
      <div ng-app="taApp">
       <div ng-controller="taController">
         <textarea my-maxlength="15" ng-model="ta1.text1" rows="4" cols="20"> </textarea>
         <textarea my-maxlength="15" ng-model="ta2.text2" rows="4" cols="20"> </textarea>

         <textarea my-maxlength="15" ng-model="ta3.text3" rows="4" cols="20"> </textarea>
       </div>
      </div>

      <script src="js/libs/angularjs-1.0.2/angular.js" type="text/javascript"></script>
      <script src="js/controller/pageController.js" type="text/javascript"></script>
      <script src="js/controller/textAreaFocus.js" type="text/javascript"></script>
    </body>
</html>

textAreaFocus.js

angular.module('textareafocus',[]).directive('myMaxlength', function() {
  return {
    require: 'ngModel',
    link: function (scope, element, attrs, ngModelCtrl) {
      var maxlength = Number(attrs.myMaxlength);
      function fromUser(text) {
          if (text.length > maxlength) {
            var transformedInput = text.substring(0, maxlength);
            ngModelCtrl.$setViewValue(transformedInput);
            ngModelCtrl.$render();

            return transformedInput;
          } 
          return text;
      }
      ngModelCtrl.$parsers.push(fromUser);
    }
  }; 
}); 

pageController.js

var taApp = angular.module('taApp',["textareafocus"]); // this creates a new angular module named "myApp";

taApp.controller('taController', function ($scope,$http) {

     $scope.ta1 = { text1: 'TextArea 1'};

     $scope.ta2 = { text2: 'TextArea 2'};

     $scope.ta3 = { text3: 'TextArea 3'};

});

截图

enter image description here

目前我只有3个textarea但可能更多,因此焦点应该自动转移到下一个元素。

我尝试使用元素[1] .focus(),但它不起作用。

请帮助我解决此问题。

2 个答案:

答案 0 :(得分:11)

您可以实现一个自定义指令,要求jQuery查找其他文本区域,使用ngMaxlength确定最大长度(可以更改为自定义属性),使用tabindex确定Tab键顺序:

<强>指令

app.directive('autoNext', function() {
    return {
       restrict: 'A',
       link: function(scope, element, attr, form) { 
           var tabindex = parseInt(attr.tabindex);
           var maxLength = parseInt(attr.ngMaxlength);
           element.on('keypress', function(e) {
               if (element.val().length > maxLength-1) {
                  var next = angular.element(document.body).find('[tabindex=' + (tabindex+1) + ']');
                  if (next.length > 0) {
                      next.focus();
                      return next.triggerHandler('keypress', { which: e.which});
                  }
                  else  {
                      return false;                          
                  }
               }
               return true;
           });

       }
    }
});

<强> HTML

<textarea ng-maxlength="10" tabindex="1" auto-next></textarea>
<textarea ng-maxlength="10" tabindex="2" auto-next></textarea>
<textarea ng-maxlength="10" tabindex="3" auto-next></textarea>

Demo Fiddle

答案 1 :(得分:1)

你不能在textarea.html中使用jQuery吗?如果可以,那么这是一个解决方案:

$("textarea").keyup(function(event) {
    if ($(this).val().length == $(this).attr("maxlength")) {
        textfields = $("textarea");
        curr = textfields.index(this);
        next = textfields[curr + 1];
        if (next != null) {
            next.focus();
        }
    }
});

JSFiddle Link:http://jsfiddle.net/a2gtnmrm/