![]() |
Модераторы: Sardar, Aliance |
![]() ![]() ![]() |
|
12345c |
|
||||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 57 Всего: 101 |
Заведённая довольно давно скромная тема ("вставка/удаление 4-х пробелов при нажатии "Ctrl+]"/"Ctrl+[" "
) по вставке пробелов-отступов для программ богата на раскрывание особенностей работы с браузерами в textarea. Она такой ожидалась. Уже тема "сборной солянки" (BB-коды, текст над курсором) говорила об этом. И здесь, доработка скрипта, основные усилия в котором легли на обход багов IE, показала незначительные, но баги (один) в Опере 8.01. Конкретно - ну никак не хотела она ставить selectionEnd на место selectionStart, несмотря на то, что обратное работало. Пришлось даже применить TextRange, чтобы превратить выделение в курсор. Потом, у Оперы есть свойство, что не может установить selectionEnd со значением, меньшим selectionStart. Если такое происходит, смена выделения самостоятельно отменяется сразу после выполнения скрипта (но не во время выполнения). Итак, скрипт, который большими усилиями удалось заставить корректно работать в IE, дополнен до поддержки остальных браузеров. Алгоритм гибридизирован, выполняется одной веткой. Включает в себя функцию lenTR(,) корректного определения длины выделения в IE и комментарии алгоритма.
Демонстрирующий код (так как он написан к функции, в нём есть избыточность вызовов по событиям) :
![]() Если всё устроит, сделанную функцию можно внедрять в форум. Пример внедрённой функции лежит в архиве http://js2.ru/files/vingradScripts.rar (30К). Там же, кстати, и приведённый выше код в 1 файле. Длины функций кода.Как видно, для реализации корректной работы надо необычно много кода. Кроме того, что сама алгоритмическая часть занимает 50-60% функции move4p, есть ещё функция специально для исправления багов IE, других способов обхода которого практически нет. Суммарная длина кода без комментариев и демо-примера - 2700 байт. Проверялся только под Win (IE6, 7, FF1.07, 2, Opera8.01), поэтому настоятельная просьба проверить под Юниксом и в Сафари - скорее всего, придётся что-то дорабатывать (для Сафари). Дополнение по теме багов: По чудесам выделения текстов в IE есть такой пример:http://js2.ru/example/JsPrimeryCode-97.htm - "IE-ошибки определения длины областей TextRange в Textarea". Дополнение по клавишному управлению на Винграде: посмотрел работу скриптов клавишного управления на Винграде и в примере, который я из него вырезал - оказывается, кнопочное управление для IE на нём работает очень плохо - в чистом IE6 срабатывают немногие кнопки. Должны работать все, которые описаны в HotKeyHandler.keys и HotKeyHandler.alt_keys (ToolMenuData.js), но работают в чистом IE6 только Ctrl-U, Q, остальные, видимо, перебиваются браузерными функциями. В остальных браузерах клавиши работают нормально, в том числе и внедрённые мной коды Ctrl+[, Ctrl+] . Это сообщение отредактировал(а) 12345c - 3.3.2008, 13:15 -------------------- Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go |
||||
|
|||||
Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Ух-ты... Это я писал и проверял под всеми популярными браузерами (FireFox1.4+ , IE5.5+, Opera6+, Konqueror), работало всё корректно. Не надо думаю объяснять, что тестя все четыре браузера автоматом тестим все подобные на таких же движках (Seamonkey, MyIE, Safari etc). Покопаюсь в последних переделках... По коду, вижу бага с обрезанием переносов только для индента убрана... ожидал что если и будешь править, то для всех функций. Вместо архива лучше дал бы ссылку. Если считаешь, что код уже готов, поставлю на SVN, от туда на форум. P.S. млин не читабельно пишешь... -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
12345c |
|
|||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 57 Всего: 101 |
Править TextAreaSelectionHelper.prototype.setSelectedText для всех остальных функций - это заново переписать, добавив примерно 1-1.5 К кода. Тут стоит вопрос, что 2.5 К на "4 пробела" много... Скажут админы: "Поставим" - сделаю по аналогии, мне будет проще, чем тебе вдаваться во все детали. Добавлено @ 02:14 Что код готов, должны сказать тестеры. Мне - так 2 момента не нравится в алгоритме, и в Сафари никто не проверял и там будут ошибки (если переносы - это \r). |
|||
|
||||
12345c |
|
|||
![]() Круглый ![]() ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 2018 Регистрация: 26.12.2005 Где: наша не пропадала ? Репутация: 57 Всего: 101 |
Тем временем обнаружил код с недокументированной функцией вставки-убирания табов в начале каждой строки выделенной области - http://www.artlebedev.ru/tools/technogrett.../allow_tab_key/ . Если выделить область начала строки, одну или несколько, то нажатие Tab приведёт к вставке табов, а нажатие Shift-Tab - к удалению табов (по одному) в начало / из начала каждой строки. (Захват пустых переносов в конце выделения, как обычно, крупно пролетает в IE, так что значимости написанного кода не умаляет, но интересен принцип реализации - достаточно простая функция вставки-удаления. Конечно, тут не надо ловить пробелы, не кратные 4, что упрощает выполнение, но и нет заморочек с принудительным выделением строки, если нажато "Ctrl-[" .) Это сообщение отредактировал(а) 12345c - 11.1.2007, 14:43 |
|||
|
||||
Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
У нас задача была несколько иная, с любой позиции в строке сдвинуть строку, что и изменило/усложнило реализацию ![]() -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: нет Всего: 155 |
![]() -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 1 Всего: 36 |
12345c, Sardar, Girder, спасибо, что работаете над проблемой и делаете наш форум лучше
![]() |
|||
|
||||
V.A.KeRneL |
|
|||
![]() Vadim A. Kazantsev ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 3.12.2006 Где: Moscow, Russia Репутация: нет Всего: 14 |
-------------------- «C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы» ---/)/)---(\.../)---(\(\ --(':'=)---(=';'=)---(=':') (")(")..)-(").--.(")-(..(")(") |
|||
|
||||
![]() ![]() ![]() |
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |