Как сделать текст жирным? Крошечный редактор WYSIWYG

Привет, сообщество Stackoverflow,

Существует метод str.bold() для переноса текста в <b></b> тегов. Это просто идеально для крошечного WYSIWYG-редактора (я знаю, что некоторые скажут, что я должен взять одно из сотен решений с открытым исходным кодом, но это тоже для учебных целей).

Проблема в том, как выделить текст.

Вот моя попытка http://jsfiddle.net/Kxmaf/178/

Я знаю, что есть editor.execCommand('bold', false, '');, но это дает разные результаты HTML в каждом браузере. Мне нужно иметь только <b></b>, <i></i>, <u></u>

Любая помощь высоко ценится :)


person Aley    schedule 28.06.2012    source источник
comment
Я полагаю, что в этом сообщении тот же вопрос. ‹br/› stackoverflow.com/questions/9528466/   -  person EricG    schedule 28.06.2012
comment
Этот пост предоставляет только решения jQuery...   -  person nbrooks    schedule 28.06.2012
comment
это все равно было бы лучше с диапазонами и классами css, добавление/удаление класса было бы намного проще, чем анализ текста для заданных тегов/строк и добавление/удаление выбранных тегов стиля...   -  person Gonçalo Vieira    schedule 28.06.2012
comment
@Gonçalo Vieira, это интересная идея :) Спасибо.   -  person Aley    schedule 28.06.2012
comment
Я неправильно понял вашу проблему, извините. вы можете попробовать регулярное выражение   -  person nbrooks    schedule 28.06.2012


Ответы (2)


как насчет перебора выбранной строки с помощью javascript при нажатии определенной кнопки стиля. вы просто можете сохранить несколько тегов, таких как ,, .... внутри массива, а затем выполнить цикл по выбранной вами строке. так что вы даже можете изменить стиль кнопок стилей, когда какой-либо из тегов был найден, чтобы пользователь знал, какой стиль только что используется. После отмены выбора стиля просто повторите цикл и удалите теги из строки.

person Alex Cio    schedule 28.06.2012

Вам нужно рассмотреть случай, когда выбор пользователя охватывает абзацы. Например (границы выбора обозначены трубками):

<p>One <b>t|wo</b></p>
<p>Thr|ee</p>

Чтобы справиться с этим, вам нужно обернуть все текстовые узлы и частичные текстовые узлы в пределах выбора пользователя в теги <b>, а также определить, какие текстовые узлы уже выделены жирным шрифтом, и оставить их в покое. Это нетривиально, и document.execCommand() сделает все за вас, как и большие WYSIWYG-редакторы.

Большинство браузеров позволяют переключаться между режимами стиля, позволяя вам выбирать между стилем с использованием таких элементов, как <b> и <i>, или стилем с использованием элементов <span> с атрибутами стиля. Вы можете сделать это с помощью команды «StyleWithCSS», откатившись к «UseCSS» в старых браузерах. Следующие команды переключают для использования версии без CSS:

try {
    if (!document.execCommand("StyleWithCSS", false, useCss)) {
        // The value required by UseCSS is the inverse of what you'd expect
        document.execCommand("UseCSS", false, !useCss);
    }
} catch (ex) {
    // IE doesn't recognise these commands and throws.
}

Наконец, если вы переключились на использование классов CSS вместо <b> и т. д., вы можете использовать класс CSS. модуль применения моей библиотеки Rangy.

person Tim Down    schedule 28.06.2012
comment
Это правда, но если я использую document.execCommand(), результат HTML отличается. Как я могу использовать теги вместо диапазонов со свойствами стиля? - person Aley; 28.06.2012
comment
@Aley: Вы можете сделать это с помощью document.execCommand("StyleWithCSS", false, false) в большинстве браузеров и document.execCommand("UseCSS", false, false) в старых браузерах. Однако некоторые браузеры будут использовать <strong> вместо <b>. - person Tim Down; 28.06.2012
comment
Спасибо за отличный ответ. Я реализовал ваше предложение, и все работает хорошо, но есть только одна проблема. Если изначально iframe скрыт, настройки не будут применяться :( Вот jsfiddle.net/Kxmaf/179< /а> - person Aley; 28.06.2012
comment
Спасибо, Тим. Проблема в том, что iframe, к которому я хочу применить изменения, невидим, а затем становится видимым. В вашем JsFiddle это уже видно с самого начала. Возможно ли в любом случае использовать StyleWithCSS? Я пробовал это с contentEditable в div, и это отлично работает. Но с div я должен изменить текущий документ, что плохо, когда я хочу иметь несколько редакторов с разными настройками. - person Aley; 29.06.2012
comment
@ user960567: Если вы имеете в виду document.execCommand(), это работает для нередактируемого контента в IE, но не в других браузерах. Обходной путь заключается в том, чтобы временно установить document.designMode = "on" перед вызовом document.execCommand(), а затем снова отключить его. - person Tim Down; 31.07.2012
comment
@TimDown, спасибо, ваши сообщения очень полезны в этой области. - person user960567; 31.07.2012