23.09.2008, 09:30
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
фишка в том, что строка в ФФ не съезжает (а должна), когда курсор устанавливается в нужную позицию (за пределы поля).
"На лету" не получится корректировать, так как при вставке тогда курсор будет уезжать (так как при вставке никакого charCode не будет)
|
|
23.09.2008, 10:28
|
|
Аспирант
|
|
Регистрация: 01.09.2008
Сообщений: 79
|
|
А я еще вывод подсказки добавил!!!
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);
|
|
23.09.2008, 10:34
|
|
Аспирант
|
|
Регистрация: 01.09.2008
Сообщений: 79
|
|
чуть чуть затупил:
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 = 'Запрещено вводить какие-либо символы.';
|
|
23.09.2008, 11:09
|
|
Аспирант
|
|
Регистрация: 01.09.2008
Сообщений: 79
|
|
Вот написал ф-цию в ФФ работает на ура, но не знаю как вставить в твою:
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;
}
}
|
|
23.09.2008, 11:16
|
|
Аспирант
|
|
Регистрация: 01.09.2008
Сообщений: 79
|
|
А да я ступил немного, непонял сначала - в моей ф-ции ввести-то нельзя запреш. символы, а вставить можно. Вот хрень то.
|
|
23.09.2008, 12:50
|
|
Аспирант
|
|
Регистрация: 01.09.2008
Сообщений: 79
|
|
Как ты узнаешь текущую позицию курсора в строке - решил попробовать написать ф-цию смещения строки, за счет изменения text-indent.
|
|
23.09.2008, 13:01
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
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]
}
}
|
|
23.09.2008, 18:35
|
|
Аспирант
|
|
Регистрация: 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.
Причина: чуть чуть подкорректировал работу с подсказкой
|
|
23.09.2008, 18:43
|
|
Аспирант
|
|
Регистрация: 01.09.2008
Сообщений: 79
|
|
Если придуиаешь что-нибудь с Ctrl-Z для IE, пиши. Огромное спасибо за помощь. Скажи куда тебе можно компенсацию кинуть
|
|
23.09.2008, 18:51
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
никуда... Я ж не говорил что за деньги это буду делать...
|
|
|
|