Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как исправить раскладку клавиатуры в заданной области textarea (https://javascript.ru/forum/dom-window/30215-kak-ispravit-raskladku-klaviatury-v-zadannojj-oblasti-textarea.html)

Demath 30.07.2012 20:25

Цитата:

Сообщение от Deff
Нун нажимать не клавишами - а иконкой в вашей форме - выделили текст - нажали - иконку

Тогда от скрипта будет мало толку. Цель и практическая ценность скрипта в том, чтобы облегчить пользователю ввод формул (пример здесь)

С выделением не легче (может чуть-чуть), чем с переключением раскладки. К тому же, пользователю нужно видеть в процессе ввода, что он вводит.

Я так понимаю, что проблема связана с событием onKeyUp?

Demath 01.08.2012 14:49

Вот получилось (не без помощи) исправлять раскладку клавиатуры с Ru на En внутри тегов [ math][/math ] в textarea во время ввода (событие OnKeyUp), при этом каретка не переносится в конец строки после каждого нажатия клавиши внутри [ math][/math ].

Но раскладка клавиатуры корректируется только в первом вхождении [ math][/math ], в последующих не изменяется :(
Подскажите, как это исправить.

<textarea style="width: 450px; height: 140px" id="abcd" onkeyup="correctInTag (this)">
Наберите что-либо на русском внутри [ math][/math ].
 
Но внутри второй пары [ math][/math ] и всех последующих раскладка не корректируется.
</textarea>
 
<script  type="text/javascript"> 
function correctInTag (t)
{ 
if ((/[а-я]/i).exec (t.value.split ('[ math]') [1].split ('[/math ]') [0]) == null) return;
var cyr = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя',
    klv = 'F<DULT~:PBQRKVYJGHCNEA{WXIOMS}">Zf,dult`;pbqrkvyjghcnea[wxioms]\'.z';
if (document.selection)
   {t.focus ();
     var rng = document.selection.createRange ();
     rng.moveEnd ('character', -1); rng.moveEnd ('character', 1);
     rng.text = klv.charAt (cyr.indexOf (rng.text));
   }
else if (t.selectionStart >= 0)
   {var s = t.selectionStart - 1;
     t.value = t.value.substr (0, s)
           + klv.charAt (cyr.indexOf (t.value.substr (s, 1)))
           + t.value.substr (s + 1);
     t.selectionStart = t.selectionEnd = s + 1;
   }
} 
</script>

Deff 01.08.2012 15:25

Цитата:

Сообщение от Demath
Но раскладка клавиатуры корректируется только в первом вхождении

2. Парс делаете Метод match(regexp) http://javascript.ru/basic/regular-e...d-match-regexp

тогда у Вас массив - его и обрабатываете через свою функцию correctInTag

Demath 01.08.2012 15:39

Цитата:

Сообщение от Deff (Сообщение 193635)
2. Парс делаете Метод match(regexp) http://javascript.ru/basic/regular-e...d-match-regexp

тогда у Вас массив - его и обрабатываете через свою функцию correctInTag

Deff, если не трудно, подробней, пожалуйста.

Deff 01.08.2012 15:43

Demath, метод match(сейчас вы делаете через exec)
Выдаст Вам массив совпадени -Ошибся -Сорри

Занчит рекурсия через replace http://javascript.ru/basic/regular-e...herez-funkciyu
Делаете парс с помощью replace и вызываемой функцией и делаете замену - подстановку каждого вхождения

Demath 01.08.2012 18:10

Цитата:

Сообщение от Deff
Занчит рекурсия через replace http://javascript.ru/basic/regular-e...herez-funkciyu
Делаете парс с помощью replace и вызываемой функцией и делаете замену - подстановку каждого вхождения

Спасибо.

Пытаюсь по всякому, но не получается :(

Deff 01.08.2012 19:24

Demath,
Выложите чисто считанную полную строку вместе с тегами вставленного обрамления [match] и восклицалом отметьте место текущего положения курсора

Demath 03.08.2012 23:46

Спасибо за подсказки! Кажется, получилось во всех вхождениях тега [math].[/math] корректировать раскладку клавиатуры.

<script  type="text/javascript"> 
function correctInTag(t)
{ 
    for (var z = t.value.split('[math]'), f = 0, j = 1, lj = z.length; j < lj; j++)
         { if (new RegExp('[а-яё]', 'i').exec(z[j].split('[/math]')[0]) != null) {f = 1; break} }
    if (!f) return;   
    var cyr = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя',
        klv = 'F<DULT~:PBQRKVYJGHCNEA{WXIOMS}">Zf,dult`;pbqrkvyjghcnea[wxioms]\'.z';
    if (document.selection)
        { t.focus();
          var rng = document.selection.createRange();
          rng.moveEnd('character', -1);
          rng.moveEnd('character', 1);
          rng.text = klv.charAt(cyr.indexOf(rng.text));
        }
    else if (t.selectionStart >= 0)
             { var s = t.selectionStart - 1;
               t.value = t.value.substr(0, s)
                         + klv.charAt(cyr.indexOf(t.value.substr(s, 1)))
                         + t.value.substr(s + 1);
               t.selectionStart = t.selectionEnd = s + 1;
             }
} 
</script>

<textarea id="abcd" onkeyup="correctInTag(this)" style="width: 300px; height: 100px">
Наберите что-либо на русском внутри [math].[/math].
И в этом [math].[/math].
</textarea>

Deff 03.08.2012 23:54

Demath,
:-E криво работает в опере еще и селект строк добавляет - приходится гасить... и рекурсия медленная - при большой скорости набора - убивает теги обрамлений
Всё нун делать несколько иначе

Demath 04.08.2012 00:08

Цитата:

Сообщение от Deff
криво работает в опере

А что именно происходит в Опере?

Цитата:

Сообщение от Deff
еще и селект строк добавляет - приходится гасить

Не понял. Уточните, пожалуйста.


Часовой пояс GMT +3, время: 06:38.