Показать сообщение отдельно
  #1 (permalink)  
Старый 19.01.2012, 18:51
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 498

Работа с текстом, выделенным в textarea (opera+ff)
На странице есть форма с несколькими input и несколькими textarea. Нужно сделать две кнопки, при нажатии на которые текст, выделенный в данный момент в одном из этих элементов формы - менял бы свой регистр (верхний/нижний).
В опере это сделать просто:
function sToLow() { 
    var str, rng; 
    str = document.selection; 
    rng = str.createRange(); 
    rng.text=rng.text.toLowerCase(); 
}

- на соответствующую кнопку вешается срабатывание данной функции.

Но в фф это не работает.
В голову приходит только использовать selectionStart и selectionEnd у полей ввода в формах, но проблема в том что пользователь может выделить текст одновременно в нескольких полях ввода и нет(?) возможности узнать какое выделение именно сейчас активно.

Ну ладно, с помощью события onfocus или onblur можно узнать какое из полей ввода было активно в последний раз. Но тогда возможны случайные срабатывания по сценарию:
- пользователь выделил текст, но потом потом убрал фокус (например кликнул мышкой на странице за пределами формы);
- затем он случайно нажимает по одной из кнопок, но подвоха в этом не видит (он ведь не держит в памяти, что где-то там текст остался выделен).

Избежать такого случайного срабатывания пришло на ум только с помощью события onmousedown на элементе body и установкой там переменной (мол, теперь нигде текст не выделен). Плюс, на случай если фокус снимается не мышкой, а TAB-ом, надо повесить ещё аналогичную установку этой переменной на событие onfocus элементов, предшествующих и следующих за нужными полями ввода.

В результате вроде всё должно работать как положено, но, блин, это же маразм какой-то и костыль на костыле получается (вместо простейшей функции, работающей в Опере). Может есть какой-то более правильный способ сделать то же самое? Фреймворки не предлагать.
Ответить с цитированием