Выберите весь текст DIV одним щелчком мыши

Как выделить/выбрать содержимое тега DIV, когда пользователь нажимает на DIV... идея состоит в том, что весь текст выделен/выбран, поэтому пользователю не нужно вручную выделять текст с помощью мыши и, возможно, пропустить немного текста?

Например, скажем, у нас есть DIV, как показано ниже:

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

... и когда пользователь нажимает на любой из этих URL-адресов, весь текст URL-адреса выделяется, поэтому они могут легко перетаскивать выделенный текст в браузере или копировать полный URL-адрес с помощью правого щелчка.

Спасибо!

Ответ 1

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>

Ответ 2

ОБНОВЛЕНИЕ 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>

Ответ 3

Существует чистое решение 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 - это спецификация уровня 4 модуля CSS, которая в настоящее время является черновым и нестандартным свойством CSS, но браузеры хорошо ее поддерживают - см. caniuse.com/#feat=user-select.

Узнайте больше о выборе пользователем здесь на MDN и поиграйте с ним здесь, в w3scools

Ответ 4

Ответ 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>

Ответ 5

Для содержимого редактируемого материала (а не для обычных входов вам нужно использовать selectNodeContents (а не просто selectNode).

ПРИМЕЧАНИЕ. Все ссылки на "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

Используя поле текстовой области, вы можете использовать это: (через 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>

Вот как я вижу, что большинство веб-сайтов это делают. Они просто стилизуют его с помощью CSS, поэтому он не похож на текстовое поле.

Ответ 7

Этот фрагмент предоставляет требуемые функции. Что вам нужно сделать, это добавить к этому div событие, которое активирует fnSelect в нем. Быстрый взлом, который вы не должны делать и, возможно, не работает, будет выглядеть следующим образом:

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

Очевидно, предполагается, что связанный с фрагментом был включен.

Ответ 8

Мне посчастливилось обернуть эту функцию как плагин 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.

Ответ 9

Как насчет этого простого решения?:)

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

Конечно, это не div-конструкция, как вы упомянули, но все же это сработало для меня.

Ответ 10

Нико Лай: Как насчет этого простого решения?:)

`<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" в моем коде работал нормально. Выбирает все в моем поле кода одним щелчком мыши.

Спасибо за помощь Niko Lay!

Ответ 11

$.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);
        }
    });
}

Выше ответ не работает в Chrome, потому что addRange удаляет предыдущий добавленный диапазон. Я не нашел решения для этого под фальшивым выбором с помощью css.

Ответ 12

Легко достигается с помощью свойства css user-select, установленного на all. Как это:

div.anyClass {
  user-select: all;
}