| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > 4 пробела для Python-а (продолжение) +баги Opera8+ |
| Автор: 12345c 2.12.2006, 20:55 | ||||
| Заведённая довольно давно http://forum.vingrad.ru/topic-113416.html ("вставка/удаление 4-х пробелов при нажатии "Ctrl+]"/"Ctrl+[" " ) по вставке пробелов-отступов для программ богата на раскрывание особенностей работы с браузерами в textarea. Она такой ожидалась. Уже тема "сборной солянки" (BB-коды, текст над курсором) говорила об этом. И здесь, доработка скрипта, основные усилия в котором легли на обход багов IE, показала незначительные, но баги (один) в Опере 8.01. Конкретно - ну никак не хотела она ставить selectionEnd на место selectionStart, несмотря на то, что обратное работало. Пришлось даже применить TextRange, чтобы превратить выделение в курсор. Потом, у Оперы есть свойство, что не может установить selectionEnd со значением, меньшим selectionStart. Если такое происходит, смена выделения самостоятельно отменяется сразу после выполнения скрипта (но не во время выполнения). Итак, скрипт, который http://forum.vingrad.ru/topic-115734.html удалось заставить корректно работать в 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 4.12.2006, 02:12 | ||
Править TextAreaSelectionHelper.prototype.setSelectedText для всех остальных функций - это заново переписать, добавив примерно 1-1.5 К кода. Тут стоит вопрос, что 2.5 К на "4 пробела" много... Скажут админы: "Поставим" - сделаю по аналогии, мне будет проще, чем тебе вдаваться во все детали. Добавлено @ 02:14 Что код готов, должны сказать тестеры. Мне - так 2 момента не нравится в алгоритме, и в Сафари никто не проверял и там будут ошибки (если переносы - это \r). |
| Автор: 12345c 11.1.2007, 14:43 |
Тем временем обнаружил код с недокументированной функцией вставки-убирания табов в начале каждой строки выделенной области - http://www.artlebedev.ru/tools/technogrette/js/allow_tab_key/ . Если выделить область начала строки, одну или несколько, то нажатие Tab приведёт к вставке табов, а нажатие Shift-Tab - к удалению табов (по одному) в начало / из начала каждой строки. (Захват пустых переносов в конце выделения, как обычно, крупно пролетает в IE, так что значимости написанного кода не умаляет, но интересен принцип реализации - достаточно простая функция вставки-удаления. Конечно, тут не надо ловить пробелы, не кратные 4, что упрощает выполнение, но и нет заморочек с принудительным выделением строки, если нажато "Ctrl-[" .) |
| Автор: Sardar 11.1.2007, 22:29 |
У нас задача была несколько иная, с любой позиции в строке сдвинуть строку, что и изменило/усложнило реализацию |
| Автор: Girder 13.1.2007, 12:33 | ||
|
| Автор: pythonwin 15.1.2007, 07:42 |
| 12345c, Sardar, Girder, спасибо, что работаете над проблемой и делаете наш форум лучше |
| Автор: V.A.KeRneL 3.3.2007, 15:37 |
| По http://forum.vingrad.ru/topic-121716.html#entry1038555 pythonwin тоже говорю здесь всем спасибо! |