Set focus on first invalid input in AngularJs form

前端 未结 13 1412
-上瘾入骨i
-上瘾入骨i 2020-12-04 18:55

I\'ve read several articles and StackOverflow questions relating to the setting of focus in AngularJs.

Unfortunately all the examples that I have read assume that th

相关标签:
13条回答
  • 2020-12-04 19:37

    You can also use angular.element

    angular.element('input.ng-invalid').first().focus();
    

    View

    <form name="myForm" novalidate="novalidate" data-ng-submit="myAction(myForm.$valid)" autocomplete="off"></form>
    

    Controller

    $scope.myAction= function(isValid) {
        if (isValid) {
            //You can place your ajax call/http request here
        } else {
            angular.element('input.ng-invalid').first().focus();
        }
    };
    

    used ngMessages for validation

    The no jquery way

    angular.element($document[0].querySelector('input.ng-invalid')).focus();
    

    When using this method, need to pass $document as parameter in your angular controller

    angular.module('myModule')
    .controller('myController', ['$document', '$scope', function($document, $scope){
        // Code Here
    }]);
    
    0 讨论(0)
  • 2020-12-04 19:39

    Ok, so the answer was simpler than I thought.

    All I needed was a directive to put on the form itself, with an event handler looking for the submit event. This can then traverse the DOM looking for the first element that has the .ng-invalid class on it.

    Example using jQLite:

    myApp.directive('accessibleForm', function () {
        return {
            restrict: 'A',
            link: function (scope, elem) {
    
                // set up event handler on the form element
                elem.on('submit', function () {
    
                    // find the first invalid element
                    var firstInvalid = elem[0].querySelector('.ng-invalid');
    
                    // if we find one, set focus
                    if (firstInvalid) {
                        firstInvalid.focus();
                    }
                });
            }
        };
    });
    

    The example here uses an Attribute directive, you could expand the example to have this be an element directive (restrict: 'E') and include a template that converts this to a . This is however a personal preference.

    0 讨论(0)
  • 2020-12-04 19:39

        .directive('accessibleForm', function () {
            return {
                restrict: 'A',
                link: function (scope, elem) {
                    // set up event handler on the form element
                    elem.on('submit', function () {
                        // find the first invalid element
                        var firstInvalid = elem[0].querySelector('.ng-invalid');
                        if (firstInvalid && firstInvalid.tagName.toLowerCase() === 'ng-form') {
                            firstInvalid = firstInvalid.querySelector('.ng-invalid');
                        }
                        // if we find one, set focus
                        if (firstInvalid) {
                            firstInvalid.focus();
                        }
                    });
                }
            };
        })

    0 讨论(0)
  • 2020-12-04 19:40

    You can create directive as some other answers or alternatively you can hook it with ng-submit and implement logic in the controller.

    View:

    <form name='yourForm' novalidate ng-submit="save(yourForm)">
    </form>
    

    Controller:

    $scope.save = function(yourForm) {
      if (!yourForm.$valid) {
        angular.element("[name='" + yourForm.$name + "']").find('.ng-invalid:visible:first').focus();
        return false;
      }
    };
    
    0 讨论(0)
  • 2020-12-04 19:42

    A non-directive based method could look like this. It is what i used, since i have a 'next' button at the bottom of each page that is actually in index.html in the footer. I use this code in main.js.

    if (!$scope.yourformname.$valid) {
          // find the invalid elements
          var visibleInvalids = angular.element.find('.ng-invalid:visible');
    
    
          if (angular.isDefined(visibleInvalids)){
            // if we find one, set focus
            visibleInvalids[0].focus();
          }
    
          return;
        }
    
    0 讨论(0)
  • 2020-12-04 19:43

    A minor tweak with what @Sajan said worked for me,

    angular.element("[name='" + this.formName.$name + "']").find('.ng-invalid:visible:first')[0].focus();
    
    0 讨论(0)
提交回复
热议问题