Есть ли способ вставить текст, похожий на bbcode, до и после выбранного текста в contenteditable div? Я видел много ответов для textarea, но код не работает с contenteditable div. Поддержка IE не требуется.
Вставка текста до и после выбора в контентной
Ответ 1
Подход, который я предлагаю:
- Получить диапазон из выделения
- Вставьте текст node в конец диапазона
- Вставьте другой текст node в начале диапазона
- Повторно выберите исходный текст
Следующая демонстрация будет работать во всех основных браузерах, кроме IE <= 8.
Демо: http://jsfiddle.net/8WEru/
код:
function surroundSelection(textBefore, textAfter) {
if (window.getSelection) {
var sel = window.getSelection();
if (sel.rangeCount > 0) {
var range = sel.getRangeAt(0);
var startNode = range.startContainer, startOffset = range.startOffset;
var startTextNode = document.createTextNode(textBefore);
var endTextNode = document.createTextNode(textAfter);
var boundaryRange = range.cloneRange();
boundaryRange.collapse(false);
boundaryRange.insertNode(endTextNode);
boundaryRange.setStart(startNode, startOffset);
boundaryRange.collapse(true);
boundaryRange.insertNode(startTextNode);
// Reselect the original text
range.setStartAfter(startTextNode);
range.setEndBefore(endTextNode);
sel.removeAllRanges();
sel.addRange(range);
}
}
}
Ответ 2
Если я понимаю из ваших комментариев новую цель, у вас есть выбор и вы хотите окружить ее элементом. Затем должен работать метод диапазона surroundContents:
var selection = window.getSelection();
var range = selection.getRangeAt(0);
var strong = document.createElement('strong');
range.surroundContents(strong);