Tek bir tıklama ile tüm DIV metnini seçin


136

Kullanıcı DIV'yi tıkladığında bir DIV etiketinin içeriği nasıl vurgulanır / seçilir ... fikir, metnin tümünün vurgulandığı / seçildiği ve böylece kullanıcının metni fare ile manuel olarak vurgulaması gerekmeyeceği ve potansiyel olarak metnin bir kısmını özlüyor musun?

Örneğin, aşağıdaki gibi bir DIV'miz olduğunu varsayalım:

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

... ve kullanıcı bu URL'nin herhangi birini tıkladığında, seçili metni tarayıcıda kolayca sürükleyebilmeleri veya tüm URL'yi sağ tıklamayla kopyalayabilmeleri için tüm URL metni vurgulanır.

Teşekkürler!

Yanıtlar:


194

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>

Şimdi kimliği bir argüman olarak geçmelisiniz, bu durumda "seçilebilir", ancak daha küreseldir, chiborg'un belirttiği gibi jQuery'i kullanmadan herhangi bir yerde birden çok kez kullanmanıza izin verir.


8
BTW, kolayca yerine bir jQuery tıklama olay işleyicisi içine bu açabilirsiniz document.getElementById('selectable')ile this. Daha sonra işlevselliği göze çarpmayan bir şekilde birkaç öğeye ekleyebilirsiniz, örneğin bir kaptaki birkaç jQuery('#selectcontainer div').click(selectText);
div

3
Bu, Chrome, FF, Safari (Mac) ve Chrome ve IE'de (Windows 9+, 8 test edilmedi) iyi çalışır. Ancak iPad Mini'de (iOS6) veya iPhone 4'te Safari'de çalışmıyor gibi görünüyor, diğer iOS veya Android'den emin değilim.
prototip

1
Bu makale için, sorgu if (window.getSelection) {Opera için önce gelmelidir ( quirksmode.org/dom/range_intro.html )
prototip

1
Bu çözüm ie11'de işe yaramıyor gibi görünüyor. Neden olduğu hakkında bir fikrin var mı?
İsviçre Bay

5
Chrome 36 ve sonraki sürümlerinde bu, "Bitişik olmayan seçim desteklenmiyor" hatası verir. Çözüm daha window.getSelection().removeAllRanges();önce eklemekwindow.getSelection().addRange(range);
nHaskins

122

GÜNCELLEME 2017:

Düğümün içindekileri seçmek için:

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

Bu, IE9 + dahil tüm modern tarayıcılarda çalışır (standartlar modunda).

Çalıştırılabilir Örnek:

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>


Aşağıdaki orijinal yanıt window.getSelection().addRange(range); kullanımdan kaldırıldığı için kullanılmıyor

Orijinal Yanıt:

Yukarıdaki örneklerin tümü şunları kullanır:

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

ancak bununla ilgili sorun DIV etiketi vb.Dahil olmak üzere Düğümün kendisini seçmesidir.

Düğümün metnini OP sorusuna göre seçmek için aramanız gerekir:

    range.selectNodeContents( ... )

Tam pasaj şöyle olur:

    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Öğeyi, öğenin clickdinleyicisinde olduğu sürece kimliğe dayalı olarak almak yerine de kullanabilirsiniz .
Zach Saucier

44

Saf CSS4 çözümü var:

.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şu anda taslak ve standart olmayan bir CSS özelliği olan bir CSS Modül Seviye 4 spesifikasyonudur, ancak tarayıcılar bunu iyi destekler - bkz. # search = user-select .

Daha okuyun kullanıcı seçmek MDN'yi burada ve onunla oynamak w3scools burada


3
+1 müthiş harika zarif çözüm! Eylül 2017'de test edildi ve FireFox ve Chrome'da kusursuz çalışıyor, ancak MICROSOFT EDGE'DE DEĞİL !? Neden olmasın ve bunu nasıl düzeltebilirim? Teşekkürler!
Sam

13

Neuroxik'in cevabı gerçekten yardımcı oldu. Yalnızca Chrome ile ilgili bir sorunum vardı, çünkü harici bir div'ı tıkladığımda işe yaramadı. Yeni aralığı eklemeden önce eski aralıkları kaldırarak çözebilirim:

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

İçerik düzenlenebilir şeyler için (normal girişler değil), selectNodeContents (yalnızca selectNode yerine) kullanmanız gerekir.

NOT: "document.selection" ve "createTextRange ()" için tüm referanslar IE 8 ve daha düşük sürümler içindir ... Böyle zor şeyler yapmaya çalışıyorsanız, bu canavarı desteklemeniz gerekmeyecektir.

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

Bir metin alanı alanı kullanarak şunları kullanabilirsiniz: (Google ile)

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

Çoğu web sitesinin bunu yaptığını görüyorum. Sadece CSS ile şekillendiriyorlar, bu yüzden bir metin alanına benzemiyor.


neden sadece this.focus();this.select();?
Taha Paksu

5

Bu pasaj, ihtiyacınız olan işlevselliği sağlar . Yapmanız gereken, bu div'e içinde fnSelect'i etkinleştiren bir olay eklemektir. Tamamen yapmamanız ve muhtemelen çalışmamanız gereken hızlı bir kesmek şöyle görünecektir:

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

Açıkça, snippet ile bağlantılı olduğunu varsaymak.


5

Bu işlevi bir jQuery eklentisi olarak sarmak için yararlı buldum:

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

Böylece, yeniden kullanılabilir bir çözüm haline gelir. Sonra bunu yapabilirsiniz:

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

Ve div test seçecektir.


1
Window.getSelection () öğesini çağırmayı unutmayın. RemoveAllRanges (); Josillo'nun kodunda olduğu gibi. Ayrıca: Bu HTML5 standardı ve document.selection IE8 ve önceki sürümler için eski IE yedek olduğu için window.getSelect'i ilk seçenek olarak koyarak savunurdum.
Jan Aagaard

3

Bu basit çözüme ne dersiniz? :)

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

Tabii ki bahsettiğiniz gibi div-inşaat değil, ama yine de benim için çalıştı.


1
Kısa çözüm, ancak bu girdi veya metin alanı dışındaki bir öğedeki metni hesaba katmaz.
JoePC

3

Niko Lay: Bu basit çözüme ne dersiniz? :)

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

.....

Önceki kod:

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

Kodlama tarihi:

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

Sadece bu kısım onclick = "this.select ();" Kodumda id = "seçilebilir" iyi çalıştı. Tek bir tıklama ile kod kutumdaki her şeyi seçer.

Yardımınız için teşekkürler Niko Lay!


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

Yukarıdaki yanıt Chrome'da çalışmıyor çünkü addRange önceki eklenen aralığı kaldırıyor. Ben css ile sahte seçim yanında bunun için herhangi bir çözüm bulamadık.


Birisi için bu kod test ettiğim ve Chrome'un en son sürümünde çalıştığı için yararlı olabilir: $ .fn.selectText = function () {return $ (this) .each (function (index, el) {if (belge. selection) {var range = document.body.createTextRange (); range.moveToElementText (el); range.select ();} eğer başka (window.getSelection) {var range = document.createRange (); range.selectNode (el ); window.getSelection (). removeAllRanges (); window.getSelection (). addRange (aralık);}}); }
Haider Abbas

0

Tüm kullanıcılara özel ayarlanmış css özelliği ile kolayca elde edilir. Bunun gibi:

div.anyClass {
  user-select: all;
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.