Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Работа с текстом, выделенным в textarea (opera+ff) (https://javascript.ru/forum/misc/24941-rabota-s-tekstom-vydelennym-v-textarea-opera-ff.html)

Белый шум 19.01.2012 18:51

Работа с текстом, выделенным в 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 элементов, предшествующих и следующих за нужными полями ввода.

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

Octane 19.01.2012 19:01

Вообще ваш код для IE, просто Opera поддерживает и майкрософтовский способ работы с выделением, помимо стандартного. Подробнее тут: http://habrahabr.ru/blogs/javascript/55922/

Выделение сбрасывается автоматически во многих случаях, что вы написали.

Белый шум 19.01.2012 19:10

Цитата:

Сообщение от Octane (Сообщение 151481)
Вообще ваш код для IE, просто Opera поддерживает и майкрософтовский способ работы с выделением, помимо стандартного.

Не суть важно кто из них был первым, мне нужен код, работающий в опере и фф. На остальные браузеры пофиг.

Цитата:

Сообщение от Octane (Сообщение 151481)
Выделение сбрасывается автоматически во многих случаях, что вы написали.

Ну я же наверное проверил (по крайней мере в файрфоксе) перед тем как этот пост написать? Убедиться просто - пишем в textarea текст до появления полосы прокрутки, выделяем часть текста и кликаем мышкой за пределами формы. Думаете, что выделение сбросилось? А вы теперь нажмите мышкой на полосу прокрутки... Ну или после выделения текста нажать TAB и затем шифт+TAB.

nerv_ 19.01.2012 20:20

Цитата:

Сообщение от Белый шум
В опере это сделать просто:

И, если я не ошибаюсь, при выделении текста ЗА пределами элементов управления и нажатии на Вашу кнопку, он тоже будет менять регистр :)

Белый шум 19.01.2012 21:30

Цитата:

Сообщение от nerv_ (Сообщение 151503)
И, если я не ошибаюсь, при выделении текста ЗА пределами элементов управления и нажатии на Вашу кнопку, он тоже будет менять регистр :)

По-моему это не работало вне полей ввода. Хотя не уверен. Под рукой только более новая версия оперы (11.60) и в ней, как я только что выяснил, document.selection уже не работает. Наверное разработчики решили избавиться от пережитков ИЕ.

Зато в ней работает document.getSelection() для полей ввода форм, в отличии от фф. Но в итоге всё-равно нужен универсальный безкостыльный способ, или хотя бы вариант с меньшим кол-вом костылей.

devote 19.01.2012 21:50

Цитата:

Сообщение от Белый шум
и в ней, как я только что выяснил, document.selection уже не работает.

Это потому что в эту версию внедрили движок от 12-й оперы, а там он совсем иной, полностью переписанный, и конечно же более не имеет старых ненужных методов.

popov654 21.01.2012 00:26

Цитата:

Сообщение от devote (Сообщение 151520)
Это потому что в эту версию внедрили движок от 12-й оперы, а там он совсем иной, полностью переписанный, и конечно же более не имеет старых ненужных методов.

Ой печаль...
Раньше это было огромным преимуществом Оперы - поддержка модели IE.
Уж сколько раз я намучился в последнем проекте с тем, что случайно забывал передать объект-событие из функции-обработчика в вызываемую из него функцию. В Опере это оставалось безнаказанным - ведь там был window.event (или ещё есть?), и код вызываемой функции получал ссылку на него (в отсутствие переданного параметра). А в Firefox всё разваливалось.
А теперь, похоже, в Опера всё будет как в FF.

devote 21.01.2012 01:04

Цитата:

Сообщение от popov654
ведь там был window.event (или ещё есть?)

Ну это пока что все еще есть. Все старье не удалили, но часть удалено. Точно сказать не могу какие именно.

devote 21.01.2012 01:07

хотя window.event имеет значение null :-?
объект эвента удалили, а имя объекта забыли :D

Nekromancer 21.01.2012 01:16

popov654,
в хроме тоже так можно, радуйтесь.
А по хорошему конечно, забывать не стоит, сделайте себе функцию которая будет передавать в обработчики первым аргументом корректное событие, тогда и проблем не будет.


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