Несколько вопросов по execCommand
Привет всем!
Пишу WYSIWYG-редактор. Он почти готов, осталось только разобраться с несколькими не слишком важными, но очень напрягающими моментами. [Есть ответ] Задача 1. При нажатии Enter, ФаерФокс вставляет <br>, а ИЕ - <p>. Мне нужно чтобы они оба работали через <br>. Задача 2. При вставке с помощью pasteHTML, содержимое вставляется после мигающего курсора. Нужно чтобы содержимое появлялось до курсора, либо чтобы курсор сам отодвигался на нужное количество символов. [Есть ответ] Задача 3. При вставке ссылки с помощью createLink, если текст для будущей ссылки не выделен, ИЕ вставляет текст ссылки, а ФФ не вставляет ничего. Пожалуйста, помогите решить эти три задачки) Заранее благодарю откликнувшихся! |
Это все не тривиально, в одну или две строчки решения не получится, придется много работать с DOM и объектами Range/TextRange, возможно даже без использования execCommand.
|
что ж, с помощью Range/TextRange решил 3-ю задачу. точнее смог проверить, выделен ли текст. спасибо Octane.
осталось еще 2) Цитата:
а вот первый вопрос самый сложный (как мне кажется). вот на него как раз и хотелось бы узнать ответ больше всего) |
По первому пункту нажатие Enter внутри списка списка надо отфильтровывать. И простой заменой абзаца на <br> не обойтись, проблем больше. Например, при удалении форматирования списков, все элементы помещаются в <p> или разделяются через <br>. Причем абзацы добавляет еще и Opera, поэтому количество кода удвоится, так как задачу придется решать W3C-методами объекта Range для Opera и TextRange – для IE.
Отлавливайте нажатие этой кнопки и заменяйте на <br> параграфы, получая их с помощью все тех же Range/TextRange. А еще в WebKit есть баг, когда после искуственно вставленного <br /> больше нет символов, то переход на новую строку не будет осуществлен, нужно вставлять еще один <br /> или любой символ. Вообще лучше использовать абзацы, а от <br /> вообще избавиться. Например, в MS Word нажатие Enter всегда приводит к образованию нового абзаца, никаких разрывов строк нет. Статья по теме: Range, TextRange и Selection |
Цитата:
Цитата:
ну да ладно... будем использовать <p>. это я сделал без проблем. что ж, остался лишь один вопрос: как заставить pasteHTML вставлять текст перед курсором (или как сдвигать курсор в конец вставки)? опять Range/TextRange? xD |
Цитата:
А <p> луше использовать, хотя бы потому, что его IE лепит везде, а средствами TextRange не особо удобно переделывать все на <br />. Ну и текст верстают обычно абзацами ;) Цитата:
|
Цитата:
|
ну можно, например, сделать копию (duplicate) объекта TextRange, полученного до вставки текста. Затем восстановить его (select) и схлопнуть (collapse) выделение в каретку (курсор).
|
хм... интересный способ... но вот только если совпадений будет несколько, он не сработает (вроде бы).
просто с помощью pasteHTML я вставляю смайлы типа :-) и :wink: смайлов может быть много... причем одинаковых))))))))) |
Почему не сработает? В дубликате TextRange останутся старые границы, которые в нужном месте и будут восстановлены, если конечно pasteHTML не заменит выделенный участок. Метод findText не используем же.
Можно конечно и самостоятельно границы выделения сдвинуть: textrange.moveStart("character", количество_символов); textrange.moveEnd("character", количество_символов); или чтобы не двигать конечную точку, сделать textrange.collapse(true) Главное не забыть потом восстановить визуальное выделение методом select. |
Часовой пояс GMT +3, время: 20:44. |