<b>*</b>
<b>* Этот модуль полностью реализован в ненавязчивом стиле: он не определяет</b>
<b>* никаких переменных в глобальном пространстве имен.</b>
<b>*/</b>
<b>whenReady(function () { // Вызовет эту функцию, когда документ будет загружен </b>
<b> // Отыскать все элементы <input></b>
<b> var inputelts = document.getElementsByTagName("input");</b>
<b> // Обойти их в цикле</b>
<b> for(var і = 0 ; і < inputelts.length; i++) {</b>
<b> var elt = inputelts[i];</b>
<b> // Пропустить элементы, не являющиеся текстовыми полями ввода</b>
<b> // и не имеющие атрибута data-allowed-chars.</b>
<b> if (elt.type != "text" || !elt.getAttribute(”data-allowed-chars")) continue;</b>
<b> // Зарегистрировать наш обработчик события в этом элементе input</b>
<b> // keypress - старое событие и реализовано во всех броузерах.</b>
<b> // textInput (смешанный регистр символов) поддерживается в Safari</b>
<b> // и Chrome с 2010 года.</b>
<b> // textinput (все символы строчные) - версия проекта</b>
<b> // стандарта "DOM Level 3 Events",</b>
<b> if (elt.addEventListener) {</b>
<b> elt.addEventListener("keypress", filter, false);</b>
<b> elt.addEventListener("textlnput", filter, false);</b>
<b> elt.addEventListened"textinput", filter, false);</b>
<b> }</b>
<b> // textinput не поддерживается версиями IE, в которых не реализован</b>
<b> // метод addEventListener()</b>
<b> else {</b>
<b> elt.attachEvent("onkeypress", 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 === "textinput" || e.type === "textlnput")</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 < 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("data-allowed-chars");</b>
<b>// Допустимые символы</b>
<b> var messageid = target.getAttribute("data-messageid"); // Сообщение id</b>
<b> if (messageid) // Если указано значение id, получить элемент</b>
<b> var messageElement = document.getElementByld(messageid);</b>
<b> // Обойти в цикле символы во введенном тексте</b>
<b> for(var і = 0; і < 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="visible";</b>
<b> // Отменить действия по умолчанию, чтобы предотвратить вставку текста</b>
<b> if (е.preventDefault) е.preventDefault();</b>
<b> if (е.returnValue) е.returnValue = false;</b>