Contenteditable - извлечь текст из каретки в конец элемента

После просмотра всех возможных вопросов и ответов, я попробую это так.

Я программирую RTE, но мне не удалось успешно извлечь текст в contenteditable элемент. Причина этого заключается в том, что каждый браузер обрабатывает узлы и события нажатия клавиш (#13) немного по-разному (например, один создает "br", другой "div", "p" и т. Д.). все это непротиворечиво, я пишу кросс-браузерный редактор, который убивает все действия по умолчанию с помощью e.preventDefault();

Следующий сценарий:

1) Пользователь нажимает клавишу # 13 (чек)

2) Обнаружено положение каретки (проверка)

3) создать новый p (aragraph) после элемента каретки (check)

4) если текст (узел (ы)) между кареткой и концом элемента, извлеките его (???)

5) поместить текст (узел (ы)) во вновь созданный p (aragraph) (проверить)

Как вы можете себе представить, все работает, кроме пункта 4.

Есть похожая функциональность в известной библиотеке js rangy, где извлекается конкретный выбор.

Что мне нужно, это следующее: Получить и извлечь весь текст (с тэгами, конечно, splitBoundaries) от каретки до конца элемента contenteditable абзаца (p, h1, h2, ...).

Любые подсказки, подсказки или фрагменты приветствуются! Заранее спасибо.

С уважением, р

1 ответ

Решение

Вы можете сделать это, создав объект Range, который охватывает содержимое от каретки до конца содержащего элемента блока и вызывая его extractContents() метод:

function getBlockContainer(node) {
    while (node) {
        // Example block elements below, you may want to add more
        if (node.nodeType == 1 && /^(P|H[1-6]|DIV)$/i.test(node.nodeName)) {
            return node;
        }
        node = node.parentNode;
    }
}

function extractBlockContentsFromCaret() {
    var sel = window.getSelection();
    if (sel.rangeCount) {
        var selRange = sel.getRangeAt(0);
        var blockEl = getBlockContainer(selRange.endContainer);
        if (blockEl) {
            var range = selRange.cloneRange();
            range.selectNodeContents(blockEl);
            range.setStart(selRange.endContainer, selRange.endOffset);
            return range.extractContents();
        }
    }
}

Это не будет работать в IE <= 8, который не поддерживает Range или тот же объект выделения, что и другие браузеры. Вы можете использовать Rangy (который вы упомянули) для поддержки IE. Просто замени window.getSelection() с rangy.getSelection(),

jsFiddle: http://jsfiddle.net/LwXvk/3/

Другие вопросы по тегам