JavaScript. Подробное руководство, 6-е издание, стр. 269

<b>*</b>

<b>* Этот модуль полностью реализован в ненавязчивом стиле: он не определяет</b>

<b>* никаких переменных в глобальном пространстве имен.</b>

<b>*/</b>

<b>whenReady(function () { // Вызовет эту функцию, когда документ будет загружен </b>

<b>  // Отыскать все элементы &lt;input&gt;</b>

<b>  var inputelts = document.getElementsByTagName(&quot;input&quot;);</b>

<b>  // Обойти их в цикле</b>

<b>  for(var і = 0 ; і &lt; inputelts.length; i++) {</b>

<b>    var elt = inputelts[i];</b>

<b>    // Пропустить элементы, не являющиеся текстовыми полями ввода</b>

<b>    // и не имеющие атрибута data-allowed-chars.</b>

<b>    if (elt.type != &quot;text&quot; || !elt.getAttribute(”data-allowed-chars&quot;)) continue;</b>

<b>    // Зарегистрировать наш обработчик события в этом элементе input</b>

<b>    // keypress - старое событие и реализовано во всех броузерах.</b>

<b>    // textInput (смешанный регистр символов) поддерживается в Safari</b>

<b>    // и Chrome с 2010 года.</b>

<b>    // textinput (все символы строчные) - версия проекта</b>

<b>    // стандарта &quot;DOM Level 3 Events&quot;,</b>

<b>    if (elt.addEventListener) {</b>

<b>      elt.addEventListener(&quot;keypress&quot;, filter, false);</b>

<b>      elt.addEventListener(&quot;textlnput&quot;, filter, false);</b>

<b>      elt.addEventListened&quot;textinput&quot;, filter, false);</b>

<b>    }</b>

<b>    // textinput не поддерживается версиями IE, в которых не реализован</b>

<b>    // метод addEventListener()</b>

<b>    else {</b>

<b>     elt.attachEvent(&quot;onkeypress&quot;, filter);</b>

<b>    }</b>

<b>  }</b>

<b>  // Обработчик событий keypress и textlnput, фильтрующий ввод пользователя</b>

<b>  function filter(event) {</b>

<b>    // Получить объект события и целевой элемент target</b>

<b>    var е = event || window.event; // Модель стандартная или IE</b>

<b>    var target = e.target || e.srcElement; // Модель стандартная или IE </b>

<b>    var text = null; // Введенный текст</b>

<b>    // Получить введенный символ или текст</b>

<b>    if (e.type === &quot;textinput&quot; || e.type === &quot;textlnput&quot;)</b>

<b>      text = e.data; </b>

<b>    else { // Это было событие keypress</b>

<b>      // Введенный печатаемый символ в Firefox сохраняется в свойстве charCode</b>

<b>      var code = е.charCode || e.keyCode;</b>

<b>      // Если была нажата какая-либо функциональная клавиша, не фильтровать ее </b>

<b>      if (code &lt; 32 || // Управляющий символ ASCII</b>

<b>             е.charCode == 0 || // Функциональная клавиша (в Firefox)</b>

<b>             e.ctrlKey || e.altKey) // Удерживаемая клавиша-модификатор</b>

<b>        return; // Не фильтровать это событие</b>

<b>      // Преобразовать код символа в строку</b>

<b>      var text = String.fromCharCode(code);</b>

<b>    }</b>

<b>    // Отыскать необходимую нам информацию в этом элементе input</b>

<b>    var allowed = target.getAttribute(&quot;data-allowed-chars&quot;);</b>
<b>// Допустимые символы</b>

<b>    var messageid = target.getAttribute(&quot;data-messageid&quot;); // Сообщение id</b>

<b>    if (messageid) // Если указано значение id, получить элемент</b>

<b>      var messageElement = document.getElementByld(messageid);</b>

<b>    // Обойти в цикле символы во введенном тексте</b>

<b>    for(var і = 0; і &lt; text.length; i++) {</b>

<b>      var c = text.charAt(i);</b>

<b>      if (allowed.indexOf(c) == -1) { // Недопустимый символ?</b>

<b>        // Отобразить элемент с сообщением, если указан</b>

<b>        if (messageElement) messageElement.style.visibility=&quot;visible&quot;;</b>

<b>        // Отменить действия по умолчанию, чтобы предотвратить вставку текста</b>

<b>        if (е.preventDefault) е.preventDefault();</b>

<b>        if (е.returnValue) е.returnValue = false;</b>