web-dev-qa-db-ja.com

javascriptで選択されたhtmlテキストを取得するにはどうすればよいですか?

次のコードを使用して、選択したテキストを取得できます。

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

しかし、テキストタグとhtmlタグを含む選択されたHtmlを取得するにはどうすればよいですか?

37
user570494

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);

残念ながら、ノードを元の状態に戻すことはできません(たとえば、スパンからテキストの半分を引き出すことができるため)。

28
Mark Kahn

すべての主要なブラウザで現在の選択に対応する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());
64
Tim Down

これが私が思いついたものです。 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;
}
5
Alex

@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;
}
0
nkkollaw