jQuery - bir metin alanından tüm metni seçin


130

Bir metin alanının içine tıkladığınızda tüm içeriğinin seçilmesini nasıl sağlayabilirim?

Ve sonunda tekrar tıkladığınızda seçimi kaldırmak için.


olası JQuery
Blender

5
@Blender: Hayır, bu soru bir metin alanında değil, bir öğedeki metni vurgulamakla ilgilidir. İkisi oldukça farklı.
Tim Down

Yanıtlar:


194

Fareyi kullanarak imleci her hareket ettirmeye çalıştıklarında tüm metin seçildiğinde kullanıcının sinirlenmesini önlemek için, bunu focusolayı değil olayı kullanarak yapmalısınız click. Aşağıdakiler işi yapacak ve Chrome'da en basit sürümün (yani select()bir focusolay işleyicisinde yalnızca metin alanının yöntemini çağırma) çalışmasını engelleyen bir sorunu çözecektir .

jsFiddle: http://jsfiddle.net/NM62A/

Kod:

<textarea id="foo">Some text</textarea>

<script type="text/javascript">
    var textBox = document.getElementById("foo");
    textBox.onfocus = function() {
        textBox.select();

        // Work around Chrome's little problem
        textBox.onmouseup = function() {
            // Prevent further mouseup intervention
            textBox.onmouseup = null;
            return false;
        };
    };
</script>

jQuery sürümü:

$("#foo").focus(function() {
    var $this = $(this);
    $this.select();

    // Work around Chrome's little problem
    $this.mouseup(function() {
        // Prevent further mouseup intervention
        $this.unbind("mouseup");
        return false;
    });
});

10
Odaktaki metni otomatik olarak seçmek veya tıklama olayları gerçekten can sıkıcı olduğundan, bu şeyleri ayrı bir "tüm metni seç" düğmesi kullanarak uygulamak daha iyidir.
RobG

2
bu Chrome'da benim için başarısız oluyor, çalışma çözümü: stackoverflow.com/a/6201757/126600
zack

@zack: Bu cevaptaki jsFiddle örneği Chrome'da benim için çalışıyor. Senin için değil mi Bağlandığınız cevabın daha kusursuz olduğuna katılıyorum.
Tim Down

@TimDown: haklısın, biraz fazla gayretli davrandım - aslında 'tıklama' ile doğru şekilde çalışıyor, ancak tabmetin alanına girerseniz başarısız oluyor - diğer çözümünüz her iki durumda da çalışıyor :)
zack

Yukarıdaki kodu biraz değiştirirseniz bir cazibe gibi çalışacaktır .. $("#foo").mouseup(function() { $("#foo").unbind("mouseup"); return false; });this
Metin kutusunu

14

Sekme ve krom sorununa çözüm ve yeni jquery yolu ile daha iyi bir yol

$("#element").on("focus keyup", function(e){

        var keycode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
        if(keycode === 9 || !keycode){
            // Hacemos select
            var $this = $(this);
            $this.select();

            // Para Chrome's que da problema
            $this.on("mouseup", function() {
                // Unbindeamos el mouseup
                $this.off("mouseup");
                return false;
            });
        }
    });

11

Bunu kullandım:

$('.selectAll').toggle(function() {
  $(this).select();
}, function() {
  $(this).unselect();
});

ancak metnin önceden seçilip seçilmediğini nasıl kontrol edeceğimi bilmiyorum, bu yüzden iki işlemi tersine çevirebilirim :(
Alex

1
@Alex: Yerinde olsam bununla fazla uğraşmazdım. Kullanıcılar metin alanlarından standart davranış beklemektedir.
Tim Down

hayır, bu belirli metin alanı yalnızca kopyalayıp yapıştırmak içindir. İçindeki tüm metin, ya tamamen değiştirilebilen ya da panoya kopyalanabilen büyük bir şifreli dizedir
Alex

@Alex: Ah, doğru. Daha readonlysonra özniteliği ekleyerek salt okunur hale getirmek isteyebilirsiniz .
Tim Down

1
@Hollister: Hayır, kullanıcının veya komut dosyasının bir div içindeki içeriği seçmesi tamamen mümkün. Muhtemelen panoya kopyalamayı düşünüyorsunuz, bu ZeroClipboard gibi Flash tabanlı bir kitaplık olmadan komut dosyasında mümkün değildir.
Tim Down

6
$('textarea').focus(function() {
    this.select();
}).mouseup(function() {
    return false;
});

5

Biraz daha kısa jQuery sürümü:

$('your-element').focus(function(e) {
  e.target.select();
  jQuery(e.target).one('mouseup', function(e) {
    e.preventDefault();
  });
});

Chrome köşe kasasını doğru şekilde kullanıyor. Örnek için http://jsfiddle.net/Ztyx/XMkwm/ adresine bakın .


4

Bir öğedeki metni seçme (farenizle vurgulamaya benzer)

:)

Bu gönderideki kabul edilen yanıtı kullanarak işlevi şu şekilde çağırabilirsiniz:

$(function() {
  $('#textareaId').click(function() {
    SelectText('#textareaId');
  });
});

Belki de bu soruyu kopya olarak işaretlemek daha yararlı olabilir? Aslında cevabınız değildi, bu yüzden iki soruyu birleştirmek daha iyi olurdu.
Blender

Kabul Edildi - OP, uygulaması için eklenen açıklamadan yararlanabilir. :)
Todd

Bu soru bir metin alanında değil, bir öğedeki metnin vurgulanmasıyla ilgilidir. İkisi oldukça farklı.
Tim Down

teşekkürler, bunu yapabileceğimi öğrendim, bunu $(this).select()kullanacağım çünkü daha az kod var :)
Alex
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.