$(document).ready(() => { EmailInputInitializer.init(); }); class EmailInputInitializer { static readonly emailInputSelector = ".email-input"; static readonly patternKey = /[A-z\d\.\!\#\$\%\&\'\*\+\-\/\=\?\^\_\`\{\}\~\;\(\)\:\,\<\>\@\[\]\\\|]/; public static init() { // Реагирует на всё, включая копипасту. $(this.emailInputSelector).on('input', this.emailKeyValidate); } public static emailKeyValidate(event: Event) { //Основная валидация происходит на основе jquery let result = EmailValidator.validateElement(event.target as any); // key === "undefined", если нажата управляющая клавиша. if (event instanceof KeyboardEvent && typeof event.key !== "undefined" && this.patternKey.test(event.key)) { return; } if (result) { return true; } else { event.preventDefault(); return false; } } } class EmailValidator { static readonly classValid = 'email-input__valid'; static readonly classInvalid = 'email-input__invalid'; public static isInvalid(input: JQuery): boolean { return input.hasClass(this.classInvalid); } /** * Обработать валидацию на основе jquery validation * @param rawInput */ public static validateElement(rawInput: HTMLElement): boolean { let isValidationForRequestOn = $(rawInput).hasClass(ValidationIndicator.validateClass); let input = $(rawInput); if (!isValidationForRequestOn && !$(input).val()) { return true; } var validity = (rawInput as any).validity; if (!validity.valid) { return false; } return true; } public static renderValidation(input: HTMLElement) { ValidationIndicator.enableIndication(input); if (EmailValidator.validateElement(input)) { ValidationIndicator.setSuccess(input); } else { ValidationIndicator.setError(input); } } };