I am sharing two different examples here. In the first example, I’ll use the ng-click directive and in next I’ll use AngularJS ng-init directive. The principle is the same in both the examples.
In the first example, I have two Input boxes of type text and number and a button control. The button’s click event will call a function in my controller to set focus on the textbox (with the number type).
The second example, I have a jQuery Datepicker control. When I select a date, it would automatically set focus on an Input box (textbox).
First Example - Set Focus on an Input box using AngularJS ng-click
Look carefully at the controls. I have two <input> boxes. The first is of type text and second is of type number. Both the elements have unique ids. You can add any type of <input> box for this example to work.
<!DOCTYPE html> <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script> </head> <body> <div ng-app="myApp" ng-controller="myController"> <p>Enter your name: <input type="text" id="name" /></p> <p><button ng-click="setFocus()" id="bt">Click to Set Focus</button></p> <p>Enter your age: <input type="number" id="age" /></p> </div> </body> <script> var myApp = angular.module('myApp', []); myApp.controller('myController', function ($scope, $window) { $scope.setFocus = function () { var name = $window.document.getElementById('name'); var age = $window.document.getElementById('age'); if (name.value != '') age.focus(); else { alert('Invalid name'); name.focus(); } }; }); </script> </html>
If you have worked with JavaScript, you will find it easy to understand. I am sure the method getElementById() looks familiar to you. In my controller function, I have two objects as $scope and $window.
I have attached a method called setFocus() to the $scope. Here in this method (or function), I’ll check for values in the first <input> box (the name).
In the above markup section, I have declared the ng-click directive to a button control, with an expression setFocus(). When you click the button, it calls setFocus() method in the controller.
The AngularJS $window object provides the method getElementById(). I have declared two variables one each for name and age.
var name = $window.document.getElementById('name'); var age = $window.document.getElementById('age');
I’ll check if the name field has a value. If yes, I’ll set focus on the age field, or the focus remains the in the first (name) field.
age.focus();
Second Example - Set Focus on an Input box using AngularJS ng-init
In my second example, I am using a jQuery Datepicker control (it’s a widget) attached to an <input> box. What I am trying to show here is, when you select a date, it would automatically set focus on another <input> box.
I also have a condition that set focus only when you select a date. Else, the next <input> box remains hidden.
<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.0/themes/base/jquery-ui.css"> <script src="https://code.jquery.com/jquery-1.12.4.js"></script> <script src="https://code.jquery.com/ui/1.12.0/jquery-ui.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script> </head> <body> <div ng-app="myApp" ng-controller="myController"> <p> <input type="text" id="date" datepicker ng-model="datevalue" placeholder="Select a date" /> </p> <p ng-if="datevalue" ng-init="setFocus()"> <input type="text" placeholder="Enter some value" id="t" /> </p> </div> </body> <script> var myApp = angular.module('myApp', []); myApp.controller('myController', function ($scope, $window) { $scope.setFocus = function () { var someElement = $window.document.getElementById('t'); someElement.focus(); }; }); myApp.directive("datepicker", function () { function link(scope, element, attrs, controller) { element.datepicker({ onSelect: function (dt) { scope.$apply(function () { controller.$setViewValue(dt); }); }, dateFormat: "dd/mm/yy" }); } return { require: 'ngModel', link: link }; }); </script> </html>
The principle is the same here. Except, the I am calling the setFocus() method using AngularJS ng-init directive.
The second <p> element has ng-if directive along with ng-init.
<p ng-if="datevalue" ng-init="setFocus()"> <input type="text" placeholder="Enter some value" id="t" /> </p>
The directive ng-if evaluates an expression based on true or false. If true that is, when you select a value from the Datepicker, it will show the <p> element and that will initiate the setFocus() method in the controller (attached with $scope object).
See the code. I am not checking any condition, since ng-if evaluates the expression.
Well, that’s it. Today you have learn two simple ways to set focus automatically on an <input> box of any type in AngularJS using two different methods. I am sure there are other ways to do this. If you know one, do share it with us here.