Показать сообщение отдельно
  #38 (permalink)  
Старый 23.09.2008, 18:35
Аватар для Kos
Kos Kos вне форума
Аспирант
Отправить личное сообщение для Kos Посмотреть профиль Найти все сообщения от Kos
 
Регистрация: 01.09.2008
Сообщений: 79

Все ништяг - ФФ не отсекается. Чуток разобрался в твоем коде и дописал ф-цию позиционирования строки. Вот весь код:

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

Последний раз редактировалось Kos, 23.09.2008 в 19:17. Причина: чуть чуть подкорректировал работу с подсказкой
Ответить с цитированием