シングルマウスクリックですべてのDIVテキストを選択


135

ユーザーがDIVをクリックしたときにDIVタグのコンテンツを強調表示/選択する方法...すべてのテキストが強調表示/選択されるため、ユーザーは手動でテキストをマウスで強調表示する必要がなく、潜在的にテキストの一部が欠けていますか?

たとえば、次のようなDIVがあるとします。

<div id="selectable">http://example.com/page.htm</div>

...そしてユーザーがそのURLのいずれかをクリックすると、URLテキスト全体がハイライト表示されるので、ブラウザーで選択したテキストを簡単にドラッグしたり、右クリックで完全なURLをコピーしたりできます。

ありがとう!

回答:


192

function selectText(containerid) {
    if (document.selection) { // IE
        var range = document.body.createTextRange();
        range.moveToElementText(document.getElementById(containerid));
        range.select();
    } else if (window.getSelection) {
        var range = document.createRange();
        range.selectNode(document.getElementById(containerid));
        window.getSelection().removeAllRanges();
        window.getSelection().addRange(range);
    }
}
<div id="selectable" onclick="selectText('selectable')">http://example.com/page.htm</div>

今度は、IDを引数として渡す必要があります。この場合は「選択可能」ですが、よりグローバルであり、Chiborgが述べたように、jQueryを使用せずにどこでも複数回使用できます。


8
ところで、あなたは簡単に交換するjQueryのクリックイベントハンドラにこれを回すことができるdocument.getElementById('selectable')this。:そして、あなたは、例えば、容器内のいくつかのdiv、いくつかの要素に控えめに機能を追加することができます jQuery('#selectcontainer div').click(selectText);
chiborg

3
これは、Chrome、FF、Safari(Mac)、ChromeおよびIE(Windows 9以降、8はテストされていません)では正常に動作します。ただし、iPad Mini(iOS6)またはiPhone 4のSafariでは機能しないようです。他のiOSまたはAndroidについては不明です。
プロトタイプは

1
この記事によると、クエリif (window.getSelection) {はOpera(quirksmode.org/dom/range_intro.html)の最初に来る必要があります
プロトタイプ

1
このソリューションはie11では機能しないようです。なぜか?
スイスミスター

5
Chromeバージョン36以降では、「不連続な選択はサポートされていません」というエラーが返されます。解決策は、window.getSelection().removeAllRanges();前に追加することですwindow.getSelection().addRange(range);
nHaskins 2015年

121

更新2017:

ノードのコンテンツ呼び出しを選択するには:

window.getSelection().selectAllChildren(
    document.getElementById(id)
);

これは、IE9 +(標準モード)を含むすべての最新ブラウザーで機能します。

実行可能な例:

function select(id) {
  window.getSelection()
    .selectAllChildren(
      document.getElementById("target-div") 
    );
}
#outer-div  { padding: 1rem; background-color: #fff0f0; }
#target-div { padding: 1rem; background-color: #f0fff0; }
button      { margin: 1rem; }
<div id="outer-div">
  <div id="target-div">
    Some content for the 
    <br>Target DIV
  </div>
</div>

<button onclick="select(id);">Click to SELECT Contents of #target-div</button>


以下の元の回答は廃止されたためwindow.getSelection().addRange(range); 廃止されました

元の回答:

上記の例はすべて次のものを使用しています。

    var range = document.createRange();
    range.selectNode( ... );

しかし、その問題は、DIVタグなどを含むノード自体を選択することです。

OPの質問に従ってノードのテキストを選択するには、代わりに呼び出す必要があります。

    range.selectNodeContents( ... )

したがって、完全なスニペットは次のようになります。

    function selectText( containerid ) {

        var node = document.getElementById( containerid );

        if ( document.selection ) {
            var range = document.body.createTextRange();
            range.moveToElementText( node  );
            range.select();
        } else if ( window.getSelection ) {
            var range = document.createRange();
            range.selectNodeContents( node );
            window.getSelection().removeAllRanges();
            window.getSelection().addRange( range );
        }
    }

this要素のclickリスナー内にある限り、IDに基づいて要素を取得する代わりにを使用することもできます。
Zach Saucier

44

純粋なCSS4ソリューションがあります。

.selectable{
    -webkit-touch-callout: all; /* iOS Safari */
    -webkit-user-select: all; /* Safari */
    -khtml-user-select: all; /* Konqueror HTML */
    -moz-user-select: all; /* Firefox */
    -ms-user-select: all; /* Internet Explorer/Edge */
    user-select: all; /* Chrome and Opera */

}

user-selectはCSSモジュールレベル4仕様です。これは現在ドラフトで非標準のCSSプロパティですが、ブラウザはこれを適切にサポートしています— #search = user-selectを参照してください。

MDNでのユーザー選択の詳細については、こちらをお読みください。


3
+1素晴らしい素晴らしいエレガントなソリューション!2017年9月にテストされ、FireFoxとChromeで問題なく動作しますが、MICROSOFT EDGEでは動作しません!?なぜそうではないアイデアとそれを修正する方法は?ありがとう!
Sam

13

Neuroxikの答えは本当に役に立ちました。Chromeで問題があったのは、外部divをクリックしたときに機能しなかったためです。新しい範囲を追加する前に古い範囲を削除して解決できます:

function selectText(containerid) {
    if (document.selection) {
        var range = document.body.createTextRange();
        range.moveToElementText(document.getElementById(containerid));
        range.select();
    } else if (window.getSelection()) {
        var range = document.createRange();
        range.selectNode(document.getElementById(containerid));
        window.getSelection().removeAllRanges();
        window.getSelection().addRange(range);
    }
}
<div id="selectable" onclick="selectText('selectable')">http://example.com/page.htm</div>

9

コンテンツを編集できるもの(通常の入力ではない)の場合は、(selectNodeだけでなく)selectNodeContentsを使用する必要があります。

注:「document.selection」および「createTextRange()」へのすべての参照は、IE 8以下を対象としています...このようなトリッキーなことを行おうとしている場合は、そのモンスターをサポートする必要はないでしょう。

function selectElemText(elem) {

    //Create a range (a range is a like the selection but invisible)
    var range = document.createRange();

    // Select the entire contents of the element
    range.selectNodeContents(elem);

    // Don't select, just positioning caret:
    // In front 
    // range.collapse();
    // Behind:
    // range.collapse(false);

    // Get the selection object
    var selection = window.getSelection();

    // Remove any current selections
    selection.removeAllRanges();

    // Make the range you have just created the visible selection
    selection.addRange(range);

}

6

テキスト領域フィールドを使用すると、これを使用できます:(Via Google)

<form name="select_all">

    <textarea name="text_area" rows="10" cols="80" 
    onClick="javascript:this.form.text_area.focus();this.form.text_area.select();">

    Text Goes Here 

    </textarea>
</form>

これは、ほとんどのWebサイトがそれを実行している方法です。彼らはCSSでそれをスタイルするだけなので、textareaのようには見えません。


どうしてthis.focus();this.select();
Taha Paksu

5

このスニペットは、必要な機能を提供します。あなたがする必要があるのは、そのdivにfnSelectをアクティブにするイベントを追加することです。完全に行うべきではなく、おそらく機能しない可能性のある簡単なハックは、次のようになります。

document.getElementById("selectable").onclick(function(){
    fnSelect("selectable");
});

明らかに、リンクされたスニペットが含まれていたと仮定します。


5

この関数をjQueryプラグインとしてラップすると便利です。

$.fn.selectText = function () {
    return $(this).each(function (index, el) {
        if (document.selection) {
            var range = document.body.createTextRange();
            range.moveToElementText(el);
            range.select();
        } else if (window.getSelection) {
            var range = document.createRange();
            range.selectNode(el);
            window.getSelection().addRange(range);
        }
    });
}

したがって、それは再利用可能なソリューションになります。次に、これを行うことができます:

<div onclick="$(this).selectText()">http://example.com/page.htm</div>

そして、それはdivでテストを選択します。


1
window.getSelection()。removeAllRanges();を呼び出すことを忘れないでください。ジョシージョのコードのように。また、これはHTML5標準であり、document.selectionはIE8以前の古いIEフォールバックであるため、最初のオプションとしてwindow.getSelectを指定することをお勧めします。
Jan Aagaard 14

3

この簡単な解決策はどうですか?:)

<input style="background-color:white; border:1px white solid;" onclick="this.select();" id="selectable" value="http://example.com/page.htm">

確かに、あなたが言ったようなdiv構築ではありませんが、それでも私のために働いています。


1
簡潔な解決策ですが、これは入力フィールドまたはテキストエリアフィールド以外の要素のテキストを考慮していません。
JoePC

3

Niko Lay:この簡単な解決策はどうですか?:)

`<input style="background-color:white; border:1px white solid;" onclick="this.select();" id="selectable" value="http://example.com/page.htm">`

.....

前のコード:

<textarea rows="20" class="codearea" style="padding:5px;" readonly="readonly">

後のコード:

<textarea rows="20" class="codearea" style="padding:5px;" readonly="readonly" onclick="this.select();" id="selectable">

この部分onclick = "this.select();" 私のコードのid = "selectable"は問題なく動作しました。コードボックス内のすべてを1回のマウスクリックで選択します。

ニコ・レイ、助けてくれてありがとう!


0
$.fn.selectText = function () {
    return $(this).each(function (index, el) {
        if (document.selection) {
            var range = document.body.createTextRange();
            range.moveToElementText(el);
            range.select();
        } else if (window.getSelection) {
            var range = document.createRange();
            range.selectNode(el);
            window.getSelection().addRange(range);
        }
    });
}

addRangeが以前に追加された範囲を削除するため、上記の回答はChromeでは機能しません。私はCSSでの偽の選択以外にこれに対する解決策を見つけませんでした。


誰かがこのコードをテストしたところ、Chromeの最新バージョンで機能していることがわかったので役立つかもしれません:$ .fn.selectText = function(){return $(this).each(function(index、el){if(document。 selection){var range = document.body.createTextRange(); range.moveToElementText(el); range.select();} else if(window.getSelection){var range = document.createRange(); range.selectNode(el ); window.getSelection()。removeAllRanges(); window.getSelection()。addRange(range);}}); }
ハイダーアッバス2017

0

cssプロパティのuser-selectをallに設定すると、簡単に実現できます。このような:

div.anyClass {
  user-select: all;
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.