PaulGor
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору да, это в Опере 9 ошибки - я им в форум написал (что невозможно определить, что было нажато - Del или '.') - это у всех такое - попробуйте, например, ввести строку, а потом нажать Del или Home или End на http://translit.ru/?ru-keyboard Я уже почти исправил Home/End легко было исправить; а для Del с точкой сложнее - их же не различишь, поэтому если код 46 - просто даю ему отработать как обычно, то есть, как будто нет кода Клавиатуры. А потом по "отжатию клавиши" (onkeyup) проверяю, что же это было - точка или Del и если точка, то быстро заменяю точку на ту русскую букву или символ, что положено для данной Раскладки. Естественно, на долю секунды точку видно в тексте, а потом она, например, на 'ю' заменяется - но по-другому ничего не придумал (и в Интернете смотрел - часа два - но ничего не нашел - раз Опера 9 дает 46 и на Del и на точку всегда - хоть по onkeypress хоть по onkeydown) - думаю, что ничего страшного - только под Оперой и только один символ - точка - будет работать как работают все буквы под Мозиллой/Firefоx в некоторых Клавиатурах, например, на http://www.yandex.ru/keyboard_qwerty.html - там сначала нажатая латинская появляется, а потом на русскую заменяется быстренько, но все же виден этот процесс... Осталось мне только сделать, чтобы все работало, если человек выделит/закрасит что-то в тексте, а потом клавишу с точкой нажмет Добавлено: . Всё, сделал код обработки этого ненормального поведения Оперы 9 1) В cvtf.js найти строку, начинающуюся с function changeKey а) перед этой строкой вставить вот такую: Код: б) В тексте этой функции changeKey найти текст Код: if (keyCode) CurrentKey = String.fromCharCode(keyCode); | Заменить его на вот такой, чтобы Home/End не безобразничали Код: if (keyCode) { if (keyCode == 35 || keyCode == 36) return true; CurrentKey = String.fromCharCode(keyCode); } | в) В тексте этой функции changeKey найти текст Код: // cancel the key event and insert the newKey for the current selection if (evt.preventDefault) evt.preventDefault(); var oldSelectionStart = textControl.selectionStart; var oldSelectionEnd = textControl.selectionEnd; var selectedText = textControl.value.substring(oldSelectionStart, oldSelectionEnd); var newText = typeof keyCheck.newKey != 'undefined' ? keyCheck.newKey : String.fromCharCode(keyCheck.newKeyCode); | и первые 3 строки, которые с комментария начинаются, переместить в самый конец этого куска г) Перед этими перемещёнными 3-мя строками (то есть, выше комментария) вставить следующий код: Код: if (Opera && OperaVer >= 9 && keyCode == 46) { dotReplacement = newText; return true; } else dotReplacement = null; | ************************************* 2) В cvtf.js найти строку, начинающуюся с function saveCaret В конце 'тела' этой функции, после её текущего кода, добавить: Код: if (Opera && OperaVer >= 9 && dotReplacement != null) { var oldSelectionStart = elem.selectionStart; var oldSelectionEnd = elem.selectionEnd; var selectedText = elem.value.substring(oldSelectionStart, oldSelectionEnd); var str1 = elem.value.substring(0, oldSelectionStart); var sym = str1.substring(str1.length - 1); if (sym == ".") { elem.value = elem.value.substring(0, oldSelectionStart-1) + dotReplacement + elem.value.substring(oldSelectionEnd); elem.setSelectionRange(oldSelectionStart, oldSelectionStart); } dotReplacement = null; } | Всё, теперь буде работать - и даже если не просто на Del и точку нажимать, но и если перед этим 'закрасить' несколько букв. ** | Всего записей: 631 | Зарегистр. 05-04-2002 | Отправлено: 04:29 15-09-2006 | Исправлено: PaulGor, 05:26 15-09-2006 |
|