Как в одном input для email совместить плагин inputmask и проверку запрещенных символов, которая покажет неправильный символ и сразу удаляет его

Есть плагин inputmask который запрещает любой ввод кроме определенных символов и создает маску '_ @ _ . _' Нужно совместить со скриптом который запрещает любой ввод запрещенных символов, но при этом показывает что это был за символ и сразу стирает его. код скрипта:

$(document).ready(function() {

  $('#mailFirst').focus(function() {
    $(this).attr('placeholder', '');
  });
  $('#mailFirst').blur(function() {
    $(this).attr('placeholder', 'Ваш E-mail');
  });
  $('#mailFirst').keyup(function() {
    this.value = this.value.replace(/[^a-zA-Z0-9@\-.]/i, "");
  });

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="mailFirst" class="mail first" placeholder="Ваш E-mail" type="text">
На моем тестовом сайте, 2 инпута, один со скриптом, второй с маской https://tronenko.pp.ua/mail/


Ответы (1 шт):

Автор решения: frozencoast

Как вариант:

$(function() {
  let $input = $('#mailSecond');
  let cursor = $input[0].selectionStart;
  let prev = $input.val();

  $input.inputmask({
    mask: "*{1,50}[.*{1,50}][.*{1,50}]@*{1,50}.*{1,20}[.*{1,20}][.*{1,20}]",
    greedy: false,
    clearIncomplete: true,
    showMaskOnHover: false,
    definitions: {
      '*': {
        validator: "[^_@.]"
      }
    }
  }).on('keyup paste', function() {
    if (this.value && /[^_a-zA-Z0-9@\-.]/i.test(this.value)) {
      this.value = prev;
      this.setSelectionRange(cursor, cursor);
      $input.trigger('input');
    } else {
      cursor = this.selectionStart;
      prev = this.value;
    }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/gh/RobinHerbots/[email protected]/dist/jquery.inputmask.min.js"></script>
<input id="mailSecond" placeholder="Ваш E-mail" type="text">

→ Ссылка