Javascript.RU

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

В результате вроде всё должно работать как положено, но, блин, это же маразм какой-то и костыль на костыле получается (вместо простейшей функции, работающей в Опере). Может есть какой-то более правильный способ сделать то же самое? Фреймворки не предлагать.
Ответить с цитированием
  #2 (permalink)  
Старый 19.01.2012, 19:01
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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

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

Сообщение от Octane Посмотреть сообщение
Вообще ваш код для IE, просто Opera поддерживает и майкрософтовский способ работы с выделением, помимо стандартного.
Не суть важно кто из них был первым, мне нужен код, работающий в опере и фф. На остальные браузеры пофиг.

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

Последний раз редактировалось Белый шум, 19.01.2012 в 19:12.
Ответить с цитированием
  #4 (permalink)  
Старый 19.01.2012, 20:20
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Белый шум
В опере это сделать просто:
И, если я не ошибаюсь, при выделении текста ЗА пределами элементов управления и нажатии на Вашу кнопку, он тоже будет менять регистр
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #5 (permalink)  
Старый 19.01.2012, 21:30
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 498

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

Зато в ней работает document.getSelection() для полей ввода форм, в отличии от фф. Но в итоге всё-равно нужен универсальный безкостыльный способ, или хотя бы вариант с меньшим кол-вом костылей.
Ответить с цитированием
  #6 (permalink)  
Старый 19.01.2012, 21:50
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Белый шум
и в ней, как я только что выяснил, document.selection уже не работает.
Это потому что в эту версию внедрили движок от 12-й оперы, а там он совсем иной, полностью переписанный, и конечно же более не имеет старых ненужных методов.
Ответить с цитированием
  #7 (permalink)  
Старый 21.01.2012, 00:26
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Сообщение от devote Посмотреть сообщение
Это потому что в эту версию внедрили движок от 12-й оперы, а там он совсем иной, полностью переписанный, и конечно же более не имеет старых ненужных методов.
Ой печаль...
Раньше это было огромным преимуществом Оперы - поддержка модели IE.
Уж сколько раз я намучился в последнем проекте с тем, что случайно забывал передать объект-событие из функции-обработчика в вызываемую из него функцию. В Опере это оставалось безнаказанным - ведь там был window.event (или ещё есть?), и код вызываемой функции получал ссылку на него (в отсутствие переданного параметра). А в Firefox всё разваливалось.
А теперь, похоже, в Опера всё будет как в FF.
Ответить с цитированием
  #8 (permalink)  
Старый 21.01.2012, 01:04
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от popov654
ведь там был window.event (или ещё есть?)
Ну это пока что все еще есть. Все старье не удалили, но часть удалено. Точно сказать не могу какие именно.
Ответить с цитированием
  #9 (permalink)  
Старый 21.01.2012, 01:07
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

хотя window.event имеет значение null
объект эвента удалили, а имя объекта забыли
Ответить с цитированием
  #10 (permalink)  
Старый 21.01.2012, 01:16
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с textarea zsaz jQuery 1 11.11.2010 06:21
Работа с textarea bookin jQuery 9 29.10.2010 14:59
Работа с textarea. MadGest AJAX и COMET 1 07.08.2010 10:26
Работа с выделенным текстом. lancer Общие вопросы Javascript 1 21.03.2008 16:55