фишка в том, что строка в ФФ не съезжает (а должна), когда курсор устанавливается в нужную позицию (за пределы поля).
"На лету" не получится корректировать, так как при вставке тогда курсор будет уезжать (так как при вставке никакого charCode не будет) |
А я еще вывод подсказки добавил!!! :D
function setMask(I,M){ M = M.split(''); M2 = M.join('|'); if (/z/.test(M2)) M2 = M2.replace(/z/g,'[a-z]'); else if (/я/.test(M2)) M2 = M2.replace(/я/g,'[а-яё]'); else if (/a/.test(M2)) M2 = M2.replace(/a/g,'[a-zа-яё]'); else if (/\*/.test(M2)) M2 = M2.replace(/\*/g,'[a-zа-яё0-9]'); M2 = M2.replace(/\(/g,'\\(').replace(/\)/g,'\\)').replace(/\//g,'\\/').replace(/9/g,'\\d').replace(/\./g,'\\.'); var r = new RegExp(M2,'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--; ShowHint(I, M); } 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) } var Hint = document.createElement('div'); Hint.style.display = 'none'; Hint.style.fontFamily = 'Arial'; Hint.style.fontSize = '8pt'; Hint.style.color = '#000000'; Hint.style.border = '1px solid #7D8891'; Hint.style.backgroundColor = '#FFFFE1'; Hint.style.padding = '1px 5px'; Hint.style.position = 'absolute'; Hint.style.zIndex = '100'; function ShowHint(I, M) { if (Hint.timer_id) { window.clearTimeout(Hint.timer_id); Hint.style.display = 'none'; } var w = parseInt(I.offsetWidth); var h = parseInt(I.offsetHeight); var t = 0; var l = 0; var obj = I; while(obj) { t += parseInt(obj.offsetTop); l += parseInt(obj.offsetLeft); obj = obj.offsetParent; } if (M != '') { var MSG = 'Разрешено вводить только следующие символы: '; for (i = 0; i < M.length; i++) { if (i > 0) MSG += ' '; if (M[i] == 'a') MSG += '<strong>буквы русского и латинского алфавитов</strong>'; else if (M[i] == 'z') MSG += '<strong>буквы латинского алфавита</strong>'; else if (M[i] == 'я') MSG += '<strong>буквы русского алфавита</strong>'; else if (M[i] == '9') MSG += '<strong>цифры</strong>'; else if (M[i] == '*') MSG += '<strong>буквы русского и латинского алфавитов цифры</strong>'; else if (M[i] == ' ') MSG += '<strong>знак пробела</strong>'; else MSG += '<strong>' + M[i] + '</strong>'; } } else MSG = 'Запрещено вводить какие-либо символы.'; Hint.style.top = t + 2 + 'px'; Hint.style.left = l + w + 10 + 'px'; Hint.innerHTML = MSG; Hint.style.display = 'block'; Hint.timer_id = setTimeout('HideHint()', 4000); } function HideHint() { Hint.style.display = 'none'; Hint.timer_id = undefined; } function SetHint() { document.body.appendChild(Hint); } if (typeof document.attachEvent != 'undefined') window.attachEvent('onload', SetHint); else window.addEventListener('load', SetHint, false); |
чуть чуть затупил:
if (M != '') { var MSG = 'Разрешено вводить только следующие символы: <strong>'; for (i = 0; i < M.length; i++) { if (i > 0) MSG += ' '; if (M[i] == 'a') MSG += 'буквы русского и латинского алфавитов'; else if (M[i] == 'z') MSG += 'буквы латинского алфавита'; else if (M[i] == 'я') MSG += 'буквы русского алфавита'; else if (M[i] == '9') MSG += 'цифры'; else if (M[i] == '*') MSG += 'буквы русского и латинского алфавитов цифры'; else if (M[i] == ' ') MSG += 'знак пробела'; else MSG += M[i]; } MSG += '</strong>'; } else MSG = 'Запрещено вводить какие-либо символы.'; |
Вот написал ф-цию в ФФ работает на ура, но не знаю как вставить в твою:
function data_check(e, I, M) { if (e.charCode && !e.ctrlKey) { M = M.split(''); var BOOL = false; for (i = 0; i < M.length; i++) { if (M[i] == 'a' && ((e.charCode >= 65 && e.charCode <= 90) || (e.charCode >= 97 && e.charCode <= 122) || (e.charCode >= 1040 && e.charCode <= 1103))) { BOOL = true; break; } else if (M[i] == 'z' && ((e.charCode >= 65 && e.charCode <= 90) || (e.charCode >= 97 && e.charCode <= 122))){ BOOL = true; break; } else if (M[i] == 'я' && (e.charCode >= 1040 && e.charCode <= 1103)) { BOOL = true; break; } else if (M[i] == '9' && (e.charCode >= 48 && e.charCode <= 57)) { BOOL = true; break; } else if (M[i] == '*' && ((e.charCode >= 48 && e.charCode <= 57) || (e.charCode >= 65 && e.charCode <= 90) || (e.charCode >= 97 && e.charCode <= 122) || (e.charCode >= 1040 && e.charCode <= 1103))) { BOOL = true; break; } else if (M[i].charCodeAt() == e.charCode) { BOOL = true; break; } } if (!BOOL) ShowHint(I, M); return BOOL; } } |
А да я ступил немного, непонял сначала - в моей ф-ции ввести-то нельзя запреш. символы, а вставить можно. Вот хрень то.
|
Как ты узнаешь текущую позицию курсора в строке - решил попробовать написать ф-цию смещения строки, за счет изменения text-indent.
|
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] } } |
Все ништяг - ФФ не отсекается. Чуток разобрался в твоем коде и дописал ф-цию позиционирования строки. Вот весь код:
var TMP = document.createElement('span'); TMP.style.position = 'absolute'; TMP.style.top = '-50px'; function setMask(I,M){ M = M.split(''); M2 = M.join('|'); if (/z/.test(M2)) M2 = M2.replace(/z/g,'[a-z]'); else if (/я/.test(M2)) M2 = M2.replace(/я/g,'[а-яё]'); else if (/a/.test(M2)) M2 = M2.replace(/a/g,'[a-zа-яё]'); else if (/\*/.test(M2)) M2 = M2.replace(/\*/g,'[a-zа-яё0-9]'); M2 = M2.replace(/\(/g,'\\(').replace(/\)/g,'\\)').replace(/\//g,'\\/').replace(/9/g,'\\d').replace(/\./g,'\\.'); var r = new RegExp(M2,'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--; ShowHint(I, M); } I.value=x.join(''); I.sC(s); },0) } function LinePos(pos) { TMP.innerHTML = '<pre style="font-family: Microsoft Sans Serif; font-size: 10pt;">' + I.value.substr(0, pos) + '</pre>'; l = parseInt(TMP.offsetWidth); if (l > I.offsetWidth) I.style.textIndent = '-' + (l - I.offsetWidth + 6) + 'px'; else I.style.textIndent = '0px'; } 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(); } if (navigator.userAgent.indexOf('Firefox') >= 0) LinePos(l); } 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) } var Hint = document.createElement('div'); Hint.style.display = 'none'; Hint.style.cursor = 'default'; Hint.style.fontFamily = 'Arial'; Hint.style.fontSize = '8pt'; Hint.style.color = '#000000'; Hint.style.border = '1px solid #7D8891'; Hint.style.backgroundColor = '#FFFFE1'; Hint.style.padding = '1px 5px'; Hint.style.position = 'absolute'; Hint.style.zIndex = '100'; Hint.onmousedown = function(){ HideHint(); } function ShowHint(I, M) { if (Hint.timer_id) { window.clearTimeout(Hint.timer_id); Hint.timer_id = undefined; Hint.style.display = 'none'; } var w = parseInt(I.offsetWidth); var h = parseInt(I.offsetHeight); var t = 0; var l = 0; var obj = I; while(obj) { t += parseInt(obj.offsetTop); l += parseInt(obj.offsetLeft); obj = obj.offsetParent; } var MSG = 'Разрешено вводить только следующие символы: <strong>'; for (i = 0; i < M.length; i++) { if (i > 0) MSG += ' '; if (M[i] == 'a') MSG += 'буквы русского и латинского алфавитов'; else if (M[i] == 'z') MSG += 'буквы латинского алфавита'; else if (M[i] == 'я') MSG += 'буквы русского алфавита'; else if (M[i] == '9') MSG += 'цифры'; else if (M[i] == '*') MSG += 'буквы русского и латинского алфавитов цифры'; else if (M[i] == ' ') MSG += 'знак пробела'; else MSG += M[i]; } MSG += '</strong>'; Hint.style.top = t + 2 + 'px'; Hint.style.left = l + w + 5 + 'px'; Hint.innerHTML = MSG; Hint.style.display = 'block'; Hint.timer_id = setTimeout('HideHint()', 5000); } function HideHint() { window.clearTimeout(Hint.timer_id); Hint.style.display = 'none'; Hint.timer_id = undefined; } function SetEls() { document.body.appendChild(TMP); document.body.appendChild(Hint); } if (typeof document.attachEvent != 'undefined') window.attachEvent('onload', SetEls); else window.addEventListener('load', SetEls, false); Едиственный недостаток - строгая зависимость от шрифта, используемого в инпуте. Здесь настроено для стандартного шрифта, но если кто-то будет использовать эту ф-цию и при этом переопределит шрифт для инпута, ему придется указать тот же шрифт в след. строке: TMP.innerHTML = '<pre style="font-family: Microsoft Sans Serif; font-size: 10pt;">' + I.value.substr(0, pos) + '</pre>'; Это самая первая строка в ф-ции LinePos |
Если придуиаешь что-нибудь с Ctrl-Z для IE, пиши. Огромное спасибо за помощь. Скажи куда тебе можно компенсацию кинуть :)
|
никуда... Я ж не говорил что за деньги это буду делать...
|
Часовой пояс GMT +3, время: 12:31. |