|
Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » [решено] JS. Обратная транслитерация. |
|
[решено] JS. Обратная транслитерация.
|
Пользователь Сообщения: 67 |
Профиль | Сайт | Отправить PM | Цитировать кароче делаю для сайта автоперевод с транслита на кирилицу (для чата и форума)
для IE сделал, а для мозилы никак не разрулю как подменить в event`е keyCode??? и как предыдущую от курсора букву удалить??? чё та я с Range не разрулю никак var a = new Array(1100,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1097,1088,1089,1090,1091,1074,1099,1093,1099,1079); var A = new Array(1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1065,1056,1057,1058,1059,1042,1067,1061,1067,1047); var H1 = 'CKSZ'; var h = new Array(1095,1093,1096,1078); var H = new Array(1063,1061,1064,1046); var Q1 = '`E'; var q = new Array(1098,1101); var Q = new Array(1066,1069); var Y1 = 'AOU'; var y = new Array(1103,1105,1102); var Y = new Array(1071,1025,1070); var lastCodes = new Array(0,0,0); function Transliterate(e) { var code = -1; if (typeof(e.charCode) != 'undefined') { code = e.charCode; } else if (typeof(event) != 'undefined') { code = event.keyCode; e = event; } if (code < 0) return false; if (code == 192) code = 96; if (code != 16) for (var i = 0; i < 2; i++) lastCodes[i] = lastCodes[i + 1]; lastCodes[2] = code >= 97 && code <= 122 ? code - 32 : code; if (lastCodes[2] == 72 && lastCodes[1] == 72 && lastCodes[0] == 83) { RemovePrevLetter(e); code = code == 72 ? 1065 : 1097; } else if (lastCodes[2] == 90 && lastCodes[1] == 67){ RemovePrevLetter(e); code = code == 90 ? 1062 : 1094; lastCodes[2] = 0; } else if (lastCodes[2] == 72) { key = H1.indexOf(String.fromCharCode(lastCodes[1])); if (key >= 0) { RemovePrevLetter(e); code = code == 72 ? H[key] : h[key]; } } else if (lastCodes[2] == 96) { key = Q1.indexOf(String.fromCharCode(lastCodes[1])); if (key >= 0) { RemovePrevLetter(e); code = lastCodes[1] == 96 && event.shiftKey ? Q[key] : q[key]; lastCodes[2] = 0; } } else if (lastCodes[1] == 89) { key = Y1.indexOf(String.fromCharCode(lastCodes[2])); if (key >= 0) { RemovePrevLetter(e); code = code == 89 ? Y[key] : y[key]; } } if (code >= 96 && code <= 122) code = a[code - 96]; else if(code >= 65 && code <= 90) code = A[code - 65]; if (typeof(event) != 'undefined') event.keyCode = code; else return code; // вот тут надо подменить для мозиллы и остальных gecko } function RemovePrevLetter(e) { if (typeof (document.selection) != 'undefined') { var m = document.selection.createRange(); } else { // тут надо определиться с m = new Range() для мозиллы } if (!(m.text > '')) m.moveStart('character', -1); if (m.htmlText.substring(0, 1) == '<') return; m.deleteContents(); m.select(); }
Trans - это глобальная переменная - транслитерация включена/выключена повторяю - в ie всё ок |
|
Отправлено: 23:06, 26-01-2007 |
Пользователь Сообщения: 67
|
Профиль | Сайт | Отправить PM | Цитировать итак, решено
вот код var a = new Array(1100,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1097,1088,1089,1090,1091,1074,1099,1093,1099,1079); var A = new Array(1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1065,1056,1057,1058,1059,1042,1067,1061,1067,1047); var H1 = 'CKSZ'; var h = new Array(1095,1093,1096,1078); var H = new Array(1063,1061,1064,1046); var Q1 = '`E'; var q = new Array(1098,1101); var Q = new Array(1066,1069); var Y1 = 'AOU'; var y = new Array(1103,1105,1102); var Y = new Array(1071,1025,1070); var lastCodes = new Array(0,0,0); function Transliterate(e) { var code = -1; if (typeof(e.charCode) != 'undefined') { code = e.charCode; } else if (typeof(event) != 'undefined') { code = event.keyCode; e = event; } if (code == 192) code = 96; if (code != 16) for (var i = 0; i < 2; i++) lastCodes[i] = lastCodes[i + 1]; lastCodes[2] = code >= 97 && code <= 122 ? code - 32 : code; if (code <= 0) { if (typeof(e.keyCode) != 'undefined') lastCodes[2] = e.keyCode; return false; } if (e.ctrlKey || e.altKey) return false; if (lastCodes[2] == 72 && lastCodes[1] == 72 && lastCodes[0] == 83) { RemovePrevLetter(e); code = code == 72 ? 1065 : 1097; } else if (lastCodes[2] == 90 && lastCodes[1] == 67){ RemovePrevLetter(e); code = code == 90 ? 1062 : 1094; lastCodes[2] = 0; } else if (lastCodes[2] == 72) { var key = H1.indexOf(String.fromCharCode(lastCodes[1])); if (key >= 0) { RemovePrevLetter(e); code = code == 72 ? H[key] : h[key]; } } else if (lastCodes[2] == 96) { var key = Q1.indexOf(String.fromCharCode(lastCodes[1])); if (key >= 0) { RemovePrevLetter(e); code = lastCodes[1] == 96 && e.shiftKey ? Q[key] : q[key]; lastCodes[2] = 0; } } else if (lastCodes[1] == 89) { var key = Y1.indexOf(String.fromCharCode(lastCodes[2])); if (key >= 0) { RemovePrevLetter(e); code = code == 89 ? Y[key] : y[key]; } } if (code >= 96 && code <= 122) code = a[code - 96]; else if(code >= 65 && code <= 90) code = A[code - 65]; if (typeof(event) != 'undefined') event.keyCode = code; else { if (e.cancelable) e.preventDefault(); var t = e.target; if (typeof (e.target) == 'undefined') return false; var elt = e.target; var startPos = elt.selectionStart; var endPos = elt.selectionEnd; elt.value = elt.value.substring(0, startPos) + String.fromCharCode(code) + elt.value.substring(endPos, elt.value.length); elt.selectionStart = startPos + 1; elt.selectionEnd = elt.selectionStart; } } function RemovePrevLetter(e) { if (typeof (document.selection) != 'undefined') { var m = document.selection.createRange(); m.collapse(false); m.moveStart('character', -1); m.text = ''; m.select(); } else { if (typeof (e.target) == 'undefined') return false; var elt = e.target; var startPos = elt.selectionStart; var endPos = elt.selectionEnd; elt.value = elt.value.substring(0, startPos - 1) + elt.value.substring(endPos, elt.value.length); elt.selectionStart = startPos; elt.selectionEnd = elt.selectionStart; } } function checkKey(e) { var code = -1; if (typeof(e.charCode) != 'undefined') { code = e.charCode; if (code <= 0) { if (typeof(e.keyCode) != 'undefined') code = e.keyCode; } } else if (typeof(event) != 'undefined') { code = event.keyCode; e = event; } var navigateCodes = [8, 9, 27, 33, 34, 35, 36, 37, 38, 39, 40, 46]; for (var i = 0; i < navigateCodes.length; i++) { if (code == navigateCodes[i]) { lastCodes[2] = code; break; } } }
onkeydown - это чтоб перехватить клавиши навигации - их onkeypress в эксплорере не перехватывает с range в файрфоксе так и не разобрался, но этот вариант работает и в эксплорере и в файрфоксе в опере, правда никак если таки найдется умелец и сделает (или хотяб подскажет) для оперы, буду только благодарен |
Отправлено: 21:00, 27-01-2007 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
|