Как получить выделенный html-текст с помощью javascript? - программирование
Подтвердить что ты не робот

Как получить выделенный html-текст с помощью javascript?

Я могу использовать следующий код для получения выделенного текста:

text=window.getSelection(); /// for Firefox text=document.selection.createRange().text; /// for IE

Но как я могу получить выбранный Html, который включает в себя теги text и html?

4b9b3361

Ответ 1

В IE <= 10 браузерах это:

document.selection.createRange().htmlText

Как отметил @DarrenMB, IE11 больше не поддерживает это. См. этот ответ для справки.


В браузерах, отличных от IE, я просто попытался сыграть с этим... это, похоже, работает, У БЕЛКА есть побочные эффекты от разрыва узлов пополам и создания дополнительного диапазона, но это отправная точка:

var range = window.getSelection().getRangeAt(0),
  content = range.extractContents(),
     span = document.createElement('SPAN');

span.appendChild(content);
var htmlContent = span.innerHTML;

range.insertNode(span);

alert(htmlContent);

К сожалению, я не могу вернуть node обратно, как это было (поскольку вы можете, например, вытащить половину текста из диапазона).

Ответ 2

Здесь функция, которая получит вам HTML, соответствующий текущему выбору во всех основных браузерах. Он также обрабатывает несколько диапазонов в пределах выделения (в настоящее время только в Firefox):

function getSelectionHtml() {
    var html = "";
    if (typeof window.getSelection != "undefined") {
        var sel = window.getSelection();
        if (sel.rangeCount) {
            var container = document.createElement("div");
            for (var i = 0, len = sel.rangeCount; i < len; ++i) {
                container.appendChild(sel.getRangeAt(i).cloneContents());
            }
            html = container.innerHTML;
        }
    } else if (typeof document.selection != "undefined") {
        if (document.selection.type == "Text") {
            html = document.selection.createRange().htmlText;
        }
    }
    return html;
}

alert(getSelectionHtml());

Ответ 3

Вот что я придумал. Протестировано с помощью IE, Chrome, Firefox, Safari, Opera. Не возвращает пустую строку.

function getSelected() {
    var text = "";
    if (window.getSelection
    && window.getSelection().toString()
    && $(window.getSelection()).attr('type') != "Caret") {
        text = window.getSelection();
        return text;
    }
    else if (document.getSelection
    && document.getSelection().toString()
    && $(document.getSelection()).attr('type') != "Caret") {
        text = document.getSelection();
        return text;
    }
    else {
        var selection = document.selection && document.selection.createRange();

        if (!(typeof selection === "undefined")
        && selection.text
        && selection.text.toString()) {
            text = selection.text;
            return text;
        }
    }

    return false;
}

Ответ 4

@zyklus:

Я изменил вашу функцию на работу (я использую jQuery, но эти части можно легко переписать в Javascript):

function getSelectionHtml() {
    var htmlContent = ''

    // IE
    if ($.browser.msie) {
        htmlContent = document.selection.createRange().htmlText;
    } else {
        var range = window.getSelection().getRangeAt(0);
        var content = range.cloneContents();

        $('body').append('<span id="selection_html_placeholder"></span>');
        var placeholder = document.getElementById('selection_html_placeholder');

        placeholder.appendChild(content);

        htmlContent = placeholder.innerHTML;
        $('#selection_html_placeholder').remove();

    }


    return htmlContent;
}

Ответ 5

Я нашел highlight плагин, чтобы быть лучшим, он очень легкий, и с его помощью вы можете выделить часть содержание

$('li').highlight('bla');