I want to move focus from an input field to another when a user has entered the maxLength amount of characters into the first input field. So in my example below, when a user has entered 2 characters into the day input, the focus would move to the month input.
This is my code so far:
<input formControlName="day" maxlength="2" placeholder="DD" type="text" (keyup)="keytab($event)" />
<input formControlName="month" maxlength="2" placeholder="MM" type="text" (keyup)="keytab($event)" />
<input formControlName="year" maxlength="4" placeholder="YYYY" type="text" />
And in my TS file:
keytab(event){
let nextInput = event.srcElement.nextElementSibling; // get the sibling element
var target = event.target || event.srcElement;
var id = target.id
console.log(id.maxlength); // prints undefined
if(nextInput == null) // check the maxLength from here
return;
else
nextInput.focus(); // focus if not null
}
I know the code in my TS file is wrong, but I was trying to find a way of getting the maxLength property and then shifting the focus. Right now the focus will move as soon as there is a keyup in the input field.
Can anyone tell me how I can access the inputs maxLength property from the keytab function? Thanks.
I'm using Angular 4.
Edit - I'm trying to get the maxLength value and then compare to the input value length. If the input value is more, then move focus to the input field.
Another simple answer for Angular 9+
<input #input1 (keyup)="(input1.value.length == 2) ? input2.focus() : ''" type="text" maxlength="2">
<input #input2 (keyup)="(input2.value.length == 2) ? input3.focus() : ''" type="text" maxlength="2">
<input #input3 (keyup)="(input2.value.length == 2) ? submit.focus() : ''" type="text" maxlength="2">
<button #submit type="submit">Submit</button>
here is a generic (Directive) solution to move to next similar control type when reaches the maximum length
1- Create the Directive
import { Directive, HostListener } from '@angular/core';
@Directive({
selector: 'input[moveNextByMaxLength], textarea[moveNextByMaxLength]',
})
export class MoveNextByMaxLengthDirective {
@HostListener('keyup', ['$event']) onKeyDown(keyboardEvent: KeyboardEvent) {
const target = keyboardEvent.target as
| HTMLInputElement
| HTMLTextAreaElement
| null;
if (!target || target.maxLength !== target.value.length) return;
keyboardEvent.preventDefault();
const { type } = target;
let { nextElementSibling } = target;
while (nextElementSibling) {
if (
(nextElementSibling as HTMLInputElement | HTMLTextAreaElement).type ===
type
) {
(nextElementSibling as HTMLInputElement | HTMLTextAreaElement).focus();
return;
}
nextElementSibling = nextElementSibling.nextElementSibling;
}
}
}
2- Declare the Directive in the module
@NgModule({
imports: [ BrowserModule ],
declarations: [
AppComponent,
MoveNextByMaxLengthDirective
],
bootstrap: [ AppComponent ]
})
3- Use the Directive in the component
<input formControlName="day" maxlength="2" moveNextByMaxLength placeholder="DD" type="text" (keyup)="keytab($event)" />
<input formControlName="month" maxlength="2" moveNextByMaxLength placeholder="MM" type="text" (keyup)="keytab($event)" />
<input formControlName="year" maxlength="4" placeholder="YYYY" type="text" />
Use a different approach. Angular does not select elements and read attributes from the existing DOM, as jQuery does, because Angular generates the DOM from data. So it's difficult, if possible at all, to read the input's maxlength
attribute, and anyway it would be clumsy an "non-Angulary".
Instead, use a different approach and pass the maxLength in the keyup
function :
<input type="text" (keyup)="keytab($event, 2)" />
<input type="text" (keyup)="keytab($event, 4)" />
keytab(event, maxLength){
console.log(maxlength); // 2 or 4
// .......
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With