Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 30.07.2012, 20:25
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Сообщение от Deff
Нун нажимать не клавишами - а иконкой в вашей форме - выделили текст - нажали - иконку
Тогда от скрипта будет мало толку. Цель и практическая ценность скрипта в том, чтобы облегчить пользователю ввод формул (пример здесь)

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

Я так понимаю, что проблема связана с событием onKeyUp?
Ответить с цитированием
  #12 (permalink)  
Старый 01.08.2012, 14:49
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Вот получилось (не без помощи) исправлять раскладку клавиатуры с 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>
Ответить с цитированием
  #13 (permalink)  
Старый 01.08.2012, 15:25
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от Demath
Но раскладка клавиатуры корректируется только в первом вхождении
2. Парс делаете Метод match(regexp) http://javascript.ru/basic/regular-e...d-match-regexp

тогда у Вас массив - его и обрабатываете через свою функцию correctInTag
Ответить с цитированием
  #14 (permalink)  
Старый 01.08.2012, 15:39
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

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

тогда у Вас массив - его и обрабатываете через свою функцию correctInTag
Deff, если не трудно, подробней, пожалуйста.
Ответить с цитированием
  #15 (permalink)  
Старый 01.08.2012, 15:43
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

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

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

Последний раз редактировалось Deff, 01.08.2012 в 16:38.
Ответить с цитированием
  #16 (permalink)  
Старый 01.08.2012, 18:10
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

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

Пытаюсь по всякому, но не получается
Ответить с цитированием
  #17 (permalink)  
Старый 01.08.2012, 19:24
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Demath,
Выложите чисто считанную полную строку вместе с тегами вставленного обрамления [match] и восклицалом отметьте место текущего положения курсора
Ответить с цитированием
  #18 (permalink)  
Старый 03.08.2012, 23:46
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Спасибо за подсказки! Кажется, получилось во всех вхождениях тега [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>

Последний раз редактировалось Demath, 04.08.2012 в 00:10.
Ответить с цитированием
  #19 (permalink)  
Старый 03.08.2012, 23:54
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Demath,
криво работает в опере еще и селект строк добавляет - приходится гасить... и рекурсия медленная - при большой скорости набора - убивает теги обрамлений
Всё нун делать несколько иначе
Ответить с цитированием
  #20 (permalink)  
Старый 04.08.2012, 00:08
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Сообщение от Deff
криво работает в опере
А что именно происходит в Опере?

Сообщение от Deff
еще и селект строк добавляет - приходится гасить
Не понял. Уточните, пожалуйста.

Последний раз редактировалось Demath, 04.08.2012 в 00:15.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как взять выделенный текст из textarea? fankiss Общие вопросы Javascript 5 13.02.2016 14:36
Как выполнить javascript из textarea urel Events/DOM/Window 2 08.10.2010 23:21
Как очистить textarea при нажатии на него soniclord Общие вопросы Javascript 12 11.01.2010 08:12
Как округлить число в меньшую сторону с заданной точностью? barcelona Общие вопросы Javascript 2 19.08.2009 12:07
Как можно найти разрешение рабочей области браузера? Влад Общие вопросы Javascript 3 20.07.2009 10:18