- Contenteditable – текстовый редактор
- ExecCommand
- Поддержка команд в браузере:
- Жирный
- Курсив
- Подчеркнутый
- Перечёркнутый
- Верхний индекс
- Нижний индекс
- Маркированный список
- Нумерованный список
- Заголовки, параграф, цитата и т.д.
- Горизонтальная линия
- Изображение
- Ссылка
- Вставка текста
- Вставка HTML
- Выравнивание текста
- По левому краю:
- По центру:
- По правому краю:
- По ширине:
- Шрифты
- Название шрифта
- Размер:
- Цвет:
- Фон:
- Undo и Redo
- Выделить всё
- Удаление выделенного
- Очистить стили
- Вырезать
- Копировать
- Пример редактора
- Переносы строк
- Табуляция
Contenteditable – текстовый редактор
Если добавить атрибут contenteditable к элементу, его содержимое становится доступно для редактирования пользователю, а с использованием JS и JQuery можно сделать простой WYSIWYG редактор.
ExecCommand
JS-метод document.execCommand(сommand, showDefaultUI, аrgument) применяет команды к элементу с атрибутом contenteditable , который находится в фокусе. Т.к. нет единого стандарта, логика команд может отличатся в разных браузерах так и их поддержка, описание команд на https://developer.mozilla.org.
Проверить доступность команды можно методом queryCommandSupported(сommand) .
var enable = document.queryCommandSupported('paste'); if (enable)
Поддержка команд в браузере:
Жирный
Включает и отключает у выделенного текста жирное начертание тегом , IE использует тег .
document.execCommand('bold', false, null);
Курсив
document.execCommand('italic', false, null);
Подчеркнутый
document.execCommand('underline', false, null);
Перечёркнутый
document.execCommand('strikethrough', false, null);
Верхний индекс
document.execCommand('superscript', false, null);
Нижний индекс
document.execCommand('subscript', false, null);
Маркированный список
document.execCommand('insertUnorderedList', false, null);
Нумерованный список
document.execCommand('insertOrderedList', false, null);
Заголовки, параграф, цитата и т.д.
formatBlock добавляет блочный тег вокруг выделенного текста.
document.execCommand('formatBlock', false, 'h1'); document.execCommand('formatBlock', false, 'h2'); document.execCommand('formatBlock', false, 'h3'); document.execCommand('formatBlock', false, 'p'); document.execCommand('formatBlock', false, 'blockquote'); document.execCommand('formatBlock', false, 'div');
Горизонтальная линия
document.execCommand('insertHorizontalRule', false, null);
Изображение
var url = prompt('Введите адрес изображения', ''); document.execCommand('insertImage', false, url);
Ссылка
var url = prompt('Введите URL', ''); document.execCommand('CreateLink', false, url);
document.execCommand('unlink', false, null);
Вставка текста
var text = prompt('Введите текст', ''); document.execCommand('insertText', false, text);
Вставка HTML
var html = prompt('Введите HTML код', ''); document.execCommand('insertHTML', false, html);
С помощью insertHTML можно обернурнуть выделенный текст тегом, например :
document.execCommand('insertHTML', false, '
' + document.getSelection().toString() + '');
Выравнивание текста
Добавляет родительскому блоку CSS-свойство text-align .
По левому краю:
document.execCommand('justifyLeft', false, null);
По центру:
document.execCommand('justifyCenter', false, null);
По правому краю:
document.execCommand('justifyRight', false, null);
По ширине:
document.execCommand('justifyFull', false, null);
Шрифты
По умолчанию команды установки шрифта добавляются тегом c атрибутами face , size , color , что не очень хорошо.
Команда styleWithCSS переключает режим, в место семантических тегов добавляются .
После установки шрифта нужно переключить styleWithCSS обратно т.к. он распространяется на другие теги ( , , и т.д.).
Название шрифта
document.execCommand('styleWithCSS', false, true); document.execCommand('fontName', false, 'monospace'); document.execCommand('styleWithCSS', false, false);
Размер:
Размер шрифта задаётся в условных единицах (1-7), в режиме styleWithCSS некоторые браузеры используют font-size: xx-small , x-small , small , medium , large , x-large , xx-large .
document.execCommand('styleWithCSS', false, true); document.execCommand('fontSize', false, '5'); document.execCommand('styleWithCSS', false, false);
Цвет:
document.execCommand('styleWithCSS', false, true); document.execCommand('foreColor', false, '#eeeeee'); document.execCommand('styleWithCSS', false, false);
Фон:
document.execCommand('styleWithCSS', false, true); document.execCommand('hiliteColor', false, 'orange'); document.execCommand('styleWithCSS', false, false);
Undo и Redo
Отмена последнего действия, Ctrl + z .
document.execCommand('undo', false, null);
Повтор последнего действия, Ctrl + y .
document.execCommand('redo', false, null);
Выделить всё
document.execCommand('selectAll', false, null);
Удаление выделенного
document.execCommand('delete', false, null);
Очистить стили
Удаляет инлайновые теги и атрибуты style , все блочные теги остаются.
document.execCommand('removeFormat', false, null);
Вырезать
document.execCommand('cut', false, null);
Копировать
document.execCommand('copy', false, null);
Пример редактора
p H1 hr HTML Text
Цвет Фон
..toolbar a < display: inline-block; border: 1px solid #888; padding: 5px 8px; margin: 0 5px 10px 0; color: #000; border-radius: 3px; font-size: 12px; box-shadow: 1px 1px 2px #ddd; background: #fff; vertical-align: top; text-decoration: none; >.toolbar select < display: inline-block; height: 28px; line-height: 28px; background: #fff; padding: 0; margin: 0 5px 10px 0; color: #000; box-shadow: 1px 1px 2px #ddd; border-radius: 3px; vertical-align: top; font-size: 12px; >.toolbar input < display: inline-block; height: 28px; line-height: 28px; background: #fff; padding: 0; margin: 0 5px 10px 0; color: #000; box-shadow: 1px 1px 2px #ddd; border-radius: 3px; vertical-align: top; font-size: 12px; >.toolbar span < display: inline-block; height: 30px; line-height: 30px; padding: 0; margin: 0 0 10px 0; color: #000; vertical-align: top; font-size: 12px; >.editor// Жирный (b) $('body').on('click', '.toolbar-b', function()< document.execCommand('bold', false, null); return false; >); // Курсив (i) $('body').on('click', '.toolbar-i', function()< document.execCommand('italic', false, null); return false; >); // Подчёркнутый текст (u) $('body').on('click', '.toolbar-u', function()< document.execCommand('underline', false, null); return false; >); // Зачёркнутый текст (strike) $('body').on('click', '.toolbar-s', function()< document.execCommand('strikethrough', false, null); return false; >); // Верхний индекс (sup) $('body').on('click', '.toolbar-sup', function()< document.execCommand('superscript', false, null); return false; >); // Нижний индекс (sub) $('body').on('click', '.toolbar-sub', function()< document.execCommand('subscript', false, null); return false; >); // Маркированный список (ul) $('body').on('click', '.toolbar-ul', function()< document.execCommand('insertUnorderedList', false, null); return false; >); // Нумерованный список (ol) $('body').on('click', '.toolbar-ol', function()< document.execCommand('insertOrderedList', false, null); return false; >); // Параграф (p) $('body').on('click', '.toolbar-p', function()< document.execCommand('formatBlock', false, 'p'); return false; >); // Заголовок (h1) $('body').on('click', '.toolbar-h1', function()< document.execCommand('formatBlock', false, 'h1'); return false; >); // Горизонтальная линия (hr) $('body').on('click', '.toolbar-hr', function()< document.execCommand('insertHorizontalRule', false, null); return false; >); // Цитата (blockquote) $('body').on('click', '.toolbar-blockquote', function()< document.execCommand('formatBlock', false, 'blockquote'); return false; >); // Изображение (img) $('body').on('click', '.toolbar-img', function()< var url = prompt('Введите адрес изображения', 'https://snipp.ru/demo/526/image.jpg'); document.execCommand('insertImage', false, url); return false; >); // Ссылка (a) $('body').on('click', '.toolbar-a', function()< var url = prompt('Введите URL', ''); document.execCommand('CreateLink', false, url); return false; >); // Удаление ссылки $('body').on('click', '.toolbar-unlink', function()< document.execCommand('unlink', false, null); return false; >); // Вставить html $('body').on('click', '.toolbar-html', function()< var html = prompt('Введите HTML код', ''); document.execCommand('insertHTML', false, html); return false; >); // Вставить текст $('body').on('click', '.toolbar-text', function()< var text = prompt('Введите текст', ''); document.execCommand('insertText', false, text); return false; >); // Выравнивание текста по левому краю $('body').on('click', '.toolbar-left', function()< document.execCommand('justifyLeft', false, null); return false; >); // Выравнивание текста по центру $('body').on('click', '.toolbar-center', function()< document.execCommand('justifyCenter', false, null); return false; >); // Выравнивание текста по правому краю $('body').on('click', '.toolbar-right', function()< document.execCommand('justifyRight', false, null); return false; >); // Выравнивание по ширине $('body').on('click', '.toolbar-justify', function()< document.execCommand('justifyFull', false, null); return false; >); // Шрифт $('body').on('input', '.toolbar-font', function()< var val = $(this).val(); document.execCommand('styleWithCSS', false, true); document.execCommand('fontName', false, val); document.execCommand('styleWithCSS', false, false); >); // Размер шрифта $('body').on('input', '.toolbar-size', function()< var val = $(this).val(); document.execCommand('styleWithCSS', false, true); document.execCommand('fontSize', false, val); document.execCommand('styleWithCSS', false, false); >); // Цвет шрифта $('body').on('input', '.toolbar-color', function()< var val = $(this).val(); document.execCommand('styleWithCSS', false, true); document.execCommand('foreColor', false, val); document.execCommand('styleWithCSS', false, false); >); // Цвет фона $('body').on('input', '.toolbar-bg', function()< var val = $(this).val(); document.execCommand('styleWithCSS', false, true); document.execCommand('hiliteColor', false, val); document.execCommand('styleWithCSS', false, false); >); // Отмена $('body').on('click', '.toolbar-undo', function()< document.execCommand('undo', false, null); return false; >); // Повтор $('body').on('click', '.toolbar-redo', function()< document.execCommand('redo', false, null); return false; >); // Удалить $('body').on('click', '.toolbar-delete', function()< document.execCommand('delete', false, null); return false; >); // Выделить всё $('body').on('click', '.toolbar-selectAll', function()< document.execCommand('selectAll', false, null); return false; >); // Очистить стили $('body').on('click', '.toolbar-removeFormat', function()< document.execCommand('removeFormat', false, null); return false; >); // Вырезать $('body').on('click', '.toolbar-cut', function()< document.execCommand('cut', false, null); return false; >); // Копировать $('body').on('click', '.toolbar-copy', function()< document.execCommand('copy', false, null); return false; >);
Переносы строк
В большинстве браузерах при нажатии на Enter , новая строка начнется с преведущего блочного элемента (p, li, blockquote).
Если редактор был пуст, то вставится , в место него можно использовать
вызвав команду:
document.execCommand('defaultParagraphSeparator', false, 'p');
Если редактору сделать display: inline-block , то будут вставляться только
.Табуляция
В contenteditable клавиша Tab не добавляет отступ, а переключает фокус на следующий элемент. Включить табуляцию можно, добавив CSS-свойство white-space: pre-wrap чтобы начали выводится пробельные символы, но при этом переносы строк тоже заработают.
И обработчик нажатия клавиши на JQuery:
$('body').on('keydown', '.editor', function(e) < if (e.keyCode === 9) < e.preventDefault(); var editor = this; var doc = editor.ownerDocument.defaultView; var sel = doc.getSelection(); var range = sel.getRangeAt(0); var tabNode = document.createTextNode("\t"); range.insertNode(tabNode); range.setStartAfter(tabNode); range.setEndAfter(tabNode); sel.removeAllRanges(); sel.addRange(range); >>);