JavaScript заменяет выбор всех браузеров - PullRequest
13 голосов
/ 22 марта 2011

Есть ли простая функция js, которую я могу использовать для замены выделения текущего документа каким-нибудь моим html?

Например, допустим, что документ где-то содержит <p>AHAHAHA</p>, а пользователь выбирает 1-й текст "ha"чанк.

Теперь я хочу заменить это на что-то вроде: <span><font color="red">hoho</font></span>

Когда я использую Google для * выбор замены javascript * Я не могу получить простой простойответ!

Ответы [ 2 ]

25 голосов
/ 22 марта 2011

Да.Следующее будет делать это во всех основных браузерах, с возможностью впоследствии выбрать вставленный контент, как это было запрошено в комментариях (хотя эта часть не реализована для IE <= 8): </p>

Демонстрация в реальном времени: http://jsfiddle.net/bXsWQ/147/

Код:

function replaceSelection(html, selectInserted) {
    var sel, range, fragment;

    if (typeof window.getSelection != "undefined") {
        // IE 9 and other non-IE browsers
        sel = window.getSelection();

        // Test that the Selection object contains at least one Range
        if (sel.getRangeAt && sel.rangeCount) {
            // Get the first Range (only Firefox supports more than one)
            range = window.getSelection().getRangeAt(0);
            range.deleteContents();

            // Create a DocumentFragment to insert and populate it with HTML
            // Need to test for the existence of range.createContextualFragment
            // because it's non-standard and IE 9 does not support it
            if (range.createContextualFragment) {
                fragment = range.createContextualFragment(html);
            } else {
                // In IE 9 we need to use innerHTML of a temporary element
                var div = document.createElement("div"), child;
                div.innerHTML = html;
                fragment = document.createDocumentFragment();
                while ( (child = div.firstChild) ) {
                    fragment.appendChild(child);
                }
            }
            var firstInsertedNode = fragment.firstChild;
            var lastInsertedNode = fragment.lastChild;
            range.insertNode(fragment);
            if (selectInserted) {
                if (firstInsertedNode) {
                    range.setStartBefore(firstInsertedNode);
                    range.setEndAfter(lastInsertedNode);
                }
                sel.removeAllRanges();
                sel.addRange(range);
            }
        }
    } else if (document.selection && document.selection.type != "Control") {
        // IE 8 and below
        range = document.selection.createRange();
        range.pasteHTML(html);
    }
}

Пример:

replaceSelection('<span><font color="red">hoho</font></span>', true);
6 голосов
/ 24 мая 2012

Вы можете использовать библиотеку Rangy http://code.google.com/p/rangy/

Вы можете сделать

var sel = rangy.getSelection();
var range = sel.getRangeAt(0);

range.deleteContents();
var node = range.createContextualFragment('<span><font color="red">hoho</font></span>');
range.insertNode(node);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...