ФФ:
1. позиция строки в поле при наборе длинного текста не смещается, т.е. курсор уходит за пределы поля 2. нельзя выделять с помощью Shift'а Опера: 1. при вводе запрещ. символа позиция строки уст. на начало (в отличии от ФФ при вводе разреш. символов позиция строки смещ., т.е. курсор находится в пределах поля) 2. нельзя выделять с помощью Shift'а 3. при нажатии Ctrl выделение снимается ИЕ: 1. с самого начала можно ввести один запрещенный символ, который сразу пропадает, если ввести еще что-нибудь 2. не работает Ctrl+Z в остальном ИЕ работает идельно, позиция строки в поле при наборе текста смещается как положено, на начало не прыгает при вводе запрещ. символов, выделение с шифтом работает вставка, копироване тоже работают ГУГЛ: В ГУГЛЕ все идеально Никаких лишних символов не пропускается ни в одном браузере!!! :) |
завтра ещё посмотрю...
|
Неполучается?
Напиши мне тогда комментарии (что, для чего и т. д.) - попробую разобраться. |
а, я просто занят был сильно на работе, сегодня посмотрю...
А по поводу ввода в ИЕ 1-го запрешённого символа - я такое поймать не смог. |
Цитата:
|
Цитата:
У меня в Опере ничего в начало не устанавливается... В ИЕ работает Ctrl+Z, но он работает только на отмену удаления. Как побороть пока не придумал. С шифтом сейчас разберусь. |
Вот с исправленным шифтом.
Про ИЕ (ctrl+Z) пока ничего не придумал. function setMask(I,M){ M = M.split('').join('|'); if (/z/.test(M)) M = M.replace(/z/g,'[a-z]'); else if (/я/.test(M)) M = M.replace(/я/g,'[а-яё]'); else if (/a/.test(M)) M = M.replace(/a/g,'[a-zа-яё]'); else if (/\*/.test(M)) M = M.replace(/\*/g,'[a-zа-яё0-9]'); M = M.replace(/\(/g,'\\(').replace(/\)/g,'\\)').replace(/\//g,'\\/').replace(/9/g,'\\d').replace(/\./g,'\\.'); var r = new RegExp(M,'i'), d=document, c='character', y=-100000; function V(){ setTimeout(function(k){ s=I.gC()[0]; var a=I.value.split(''),x=[]; for(var i=0;i<a.length;i++)if(r.test(a[i]))x.push(a[i]);else s--; I.value=x.join(''); I.sC(s); },0) } I = typeof I=='string' ? d.getElementById(I) : I; I.onkeypress = function(e){ e=e||event; if(e.ctrlKey||e.shiftKey)return true; V(); return true } I.sC = function(l,g){ if(this.setSelectionRange) this.setSelectionRange(l,l); else { g = this.createTextRange(); g.collapse(true); g.moveStart(c,y); g.move(c,l); g.select(); } } I.gC = function(r,b){ if (this.setSelectionRange) return [this.selectionStart,this.selectionEnd]; else { r = d.selection.createRange(); b = 0-r.duplicate().moveStart(c,y) return [b,b+r.text.length] } } if (d.all&&!window.opera) I.onpaste=V; else I.addEventListener('input',V,false) } |
Да, с ФФ кнечно гон получился (самое плохое, что под ним дофига народа сидит), а в остальном все ништяг. Читал на англоязычных форумах, чего там только не написано про эту тему, но более менее работающей функции пока никто не представил. Жуткий все-таки этот язык javascript, чтобы написать то, на что в других языках (к примеру Delphi) уйдет пара строк, здесь необходимо ТАК выебнуться - УЖОСС!!!
Но ты вообще гений! :)) |
Просто задача очень нестандартная и нетривиальная. Язык под такие задачи не заточен. А делфи более широкопрофильный...
|
Появилась идейка, как обойти баг в ФФ. Ты я так понял переписываешь значение инпута заново, поэтому в ФФ строка относительно границ элемента не съезжает. Но зато в ФФ работает charCode. Что если сделать проверку, если charCode не undefined, тогда корректируем символы с помощью него на лету, иначе уже написанным методом. По моему это должно сработать.
|
Часовой пояс GMT +3, время: 06:46. |