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