jquery girişi odağın tümünü seç


326

Bir kullanıcı alana odaklanırken denemek ve alandaki tüm metni seçmek için bu kodu kullanıyorum. Ne olur, hepsini bir saniye için seçer, ardından seçili değildir ve imleç tıkladığım yerde bırakılır ...

$("input[type=text]").focus(function() {
   $(this).select();
});

Her şeyin seçili kalmasını istiyorum.


Hangi tarayıcı, FF'de benim için iyi çalışıyor gibi görünüyor?
R0MANARMY

8
Chrome = bunun için başarısız
wowo_999

1
Chrome kullanıyordum, ancak .click () sorunu çözdü :)
Tim

4
Not: Burada kabul edilen cevap sorunun sadece yarısını çözmektedir. Seçimin çalışmasını sağlar, ancak sonraki tıklamalarla seçimini kaldırmayı zorlaştırır. Daha iyi bir çözüm burada bulunabilir: stackoverflow.com/questions/3380458/…
SDC

Yanıtlar:


480

clickBunun yerine kullanmayı deneyin focus. Hem fare hem de önemli etkinlikler için çalışıyor gibi görünüyor (en azından Chrome / Mac'te):

jQuery <sürüm 1.7:

$("input[type='text']").click(function () {
   $(this).select();
});

jQuery sürüm 1.7+:

$("input[type='text']").on("click", function () {
   $(this).select();
});

İşte bir demo


62
sorun, metnin bir kısmını fare ile artık seçememenizdir, bir kez tıklandığında tam metin seçilir.
Helin Wang

6
Benim için uygun bir çözüm değil. Bu, Wang'ın tanımladığı sorunu yaratır.
Marquez

1
Aşağıda Nianpeng'in fare metin seçimi ile de çalışan bir çözümü var.
Philibert Perusse

4
@AwQiruiGuo $ .fn.on ('klik', ..) daha az bellek kullanabilir ve dinamik olarak eklenen alt öğeler için çalışabilir.
Ricky Boyce

7
Bu, sekme yaparken bir alana odaklanmak için çalışmaz.
Colin Breame

65

Bence bu şu:

focus()
   UI tasks related to pre-focus
   callbacks
       select()
   UI tasks related to focus (which unselect again)

Geçici çözüm select () öğesini eşzamansız olarak çağırıyor olabilir, böylece odaktan () sonra tamamen çalışır:

$("input[type=text]").focus(function() { 
    var save_this = $(this);
    window.setTimeout (function(){ 
       save_this.select(); 
    },100);
});

3
$ ("input [type = metin]"). focus (function () {var save_this = $ (this); window.setTimeout (function () {save_this.select ();}, 100);});
etienne

@etienne: Oh, iyi bir nokta: bu thistür kapsamlarda kullanımı biraz beklenmedik. Kodu güncelleyeceğim.
Piskvor

3
0 zaman aşımı değeri de iyi görünüyor ve "focusin ()" işlevi de bu yöntemle çalışıyor.
Tanguy

4
evet, nokta belirlemenize bile gerek yok. 0 zaman aşımları geçerli çağrı yığınının sonunda çalıştığından iyi sonuç verecektir. bu, odaklama ve tıklama olaylarının tümüyle
tetiklendiği

1
Zaman aşımı 0, 'click' olayının daha sonraki bir çerçevede tetiklenebilmesi ve kutunun seçiminin kaldırılması sorununu yaşıyor gibi görünüyor. Zaman aşımı 10'un oldukça iyi çalıştığını görüyorum - gözle görülür bir gecikme yok, ancak 0'dan daha güvenilir.
philh

57

Bunun daha iyi bir çözüm olduğunu düşünüyorum. Yalnızca onclick olayını seçmenin aksine, fareyle metin seçmeyi / düzenlemeyi engellemez. IE8 dahil olmak üzere büyük oluşturma motorlarıyla çalışır.

$('input').on('focus', function (e) {
    $(this)
        .one('mouseup', function () {
            $(this).select();
            return false;
        })
        .select();
});

http://jsfiddle.net/25Mab/9/


4
Bu sadece mevcut alanlar için geçerlidir, işte yeni girdi alanlarına bağlamak için bir güncelleme: jsfiddle.net
adriaan

Bazen odak bir tıklama olmadan verilebilir ve bu da onu iyi idare eder. Bu nedenle, bu benim için en temiz cevap - giriş her tıklandığında değil, sarkan olay dinleyicileri olsa da, bir tıklama ile değil ... setTimeout'tan çok daha iyi
ilovett

Bu, sayısal girişlerde ikinci bir tıklamanın metnin fareyle başka bir bölümünü seçmesine izin vermez. Ancak ikincisini kaldırmak select()işe yarıyor gibi görünüyor.
dperish

Ek olarak daha da iyi$('input[autofocus]').select();
Daniel Bleisteiner

38

Burada bazı iyi cevaplar var ve @ user2072367 benim favorim, ancak tıklama yerine sekme ile odaklandığınızda beklenmeyen bir sonuç var. (beklenmeyen sonuç: sekme yoluyla odaklandıktan sonra metni normal olarak seçmek için bir kez daha tıklamanız gerekir)

Bu keman, bu küçük hatayı düzeltir ve gereksiz DOM seçimini önlemek için $ (this) değişkenini depolar. Bunu kontrol et! (:

IE'de test edildi> 8

$('input').on('focus', function() {
    var $this = $(this)
        .one('mouseup.mouseupSelect', function() {
            $this.select();
            return false;
        })
        .one('mousedown', function() {
            // compensate for untriggered 'mouseup' caused by focus via tab
            $this.off('mouseup.mouseupSelect');
        })
        .select();
});

2
+1 sizin ve @ user2072367 çözümleri tüm iş parçacığı içinde en temiz ve keşke daha hızlı almak için bir yol olsaydı.
KyleMit

1
Kullanıcı tüm metni kendileri seçmeye çalışırsa bile çalışır, bravo.
Vitani

Benim için bu, Windows 8.1'de ie11 üzerinde çalışmaz. Windows 7 ve Windows 10'da
ie11'de çalışıyor

1
@LarsThomasBredland 8.1 + ie11 kazanmaya çalıştım ve beklendiği gibi çalışıyor. Bu konuda sizin için "işe yaramaz" nedir?
animatedgif

Hiçbir şey seçmez. (Başka bir win8 üzerinde test ettim ve orada çalışıyor - aynı os seviyesi ve yani sürüm)
Lars Thomas Bredland

21

Dikkatli bir şekilde inceledikten sonra, bu konu içinde çok daha temiz bir çözüm olarak öneriyorum:

$("input").focus(function(){
    $(this).on("click.a keyup.a", function(e){      
        $(this).off("click.a keyup.a").select();
    });
});

JsFiddle'da demo

Sorun:

İşte biraz açıklama:

İlk olarak, fareyi bir alana getirdiğinizde veya bir alana sektiğinizde olayların sırasına bakalım.
Bunun gibi tüm ilgili olayları kaydedebiliriz:

$("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
              function(e) { console.log(e.type); });

odak olayları

Not : Bu çözümü daha sonra etkinlik kanalında clickolduğu mouseupgibi kullanmak üzere değiştirdim ve @ Jocie'nin yorumuna göre firefox'ta bazı sorunlara neden oluyor gibi görünüyordu

Bazı tarayıcılar mouseupveya clickolayları sırasında imleci konumlandırmaya çalışır . Düzeltmeyi bir konumda başlatmak ve metni vurgulamak için sürüklemek isteyebileceğinizden bu mantıklıdır. Fareyi gerçekten kaldırıncaya kadar şapka konumu hakkında bir atama yapamaz. Böylece, işleyen işlevler focusçok erken yanıt vermek için kaderlenir ve tarayıcı konumlandırmanızı geçersiz kılar.

Ancak ovmak, odak olayını gerçekten ele almak istediğimizdir. Birinin alana ilk kez girdiğini bize bildirir. Bu noktadan sonra, kullanıcı seçim davranışını geçersiz kılmaya devam etmek istemiyoruz.

Çözüm:

Bunun yerine, focusolay işleyicisine, ateş etmek üzere olan click(tıklama) ve keyup(sekme girişi) etkinlikleri için dinleyicileri hızla ekleyebiliriz .

Not : Bir sekme olayının klavyesi aslında bir öncekinde değil, yeni giriş alanında tetiklenir

Etkinliği sadece bir kez başlatmak istiyoruz. Kullanabiliriz .one("click keyup), ancak bu her olay türü için olay işleyiciyi bir kez çağırır . Bunun yerine, mouseup veya keyup tuşuna basıldığında işlevimizi arayacağız. Yapacağımız ilk şey, her ikisi için işleyicileri kaldırmaktır. Bu şekilde sekmeli veya fareyle uğraştığımız farketmez. İşlev tam olarak bir kez yürütülmelidir.

Not : Çoğu tarayıcı doğal olarak bir sekme etkinliği sırasında tüm metni seçer, ancak animatedgif'in belirttiği gibi , yine de keyupetkinliği işlemek isteriz , aksi takdirde sekme mouseupyaptığımız her seferinde etkinlik hala devam eder. Her ikisini de dinleyebiliriz. seçimi işleme koyar koymaz dinleyicileri devre dışı bırakın.

Şimdi, select()tarayıcı seçimini yaptıktan sonra arayabiliriz , böylece varsayılan davranışı geçersiz kılacağız.

Son olarak, ekstra koruma için, ve işlevlerine olay ad alanları ekleyebiliriz , böylece yöntem oyundaki diğer dinleyicileri kaldırmaz.mouseupkeyup.off()


IE 10+, FF 28+ ve Chrome 35+ sürümlerinde test edilmiştir


Alternatif olarak, jQuery'yi herhangi bir sayıda olay için tam olarak bir kez tetiklenecek adlıonce bir işlevle genişletmek istiyorsanız :

$.fn.once = function (events, callback) {
    return this.each(function () {
        var myCallback = function (e) {
            callback.call(this, e);
            $(this).off(events, myCallback);
        };
        $(this).on(events, myCallback);
    });
};

Sonra kodu daha da basitleştirebilirsiniz:

$("input").focus(function(){
    $(this).once("click keyup", function(e){      
        $(this).select();
    });
});

Gösteri demo


Windows'taki Firefox 31'de, kodunuz iki metin kutusunun arasına tıkladığınızda yalnızca diğer her tıklamayla ilgili metni seçer
Vitani

1
@Jocie, neden değiştiğinden emin değilim, ancak FF click, boru hattından daha aşağı olan olayda metin seçimini işliyor gibi görünüyor mouseup. Bize tarayıcıyı geçersiz kılma şansını vermek için seçimin sonunu mümkün olduğunca geç ele almak istediğimiz için, fare yerine tıklama kullanmak hile yapmalıdır. FF, Chrome ve IE'de test edildi.
KyleMit

1
Teşekkür ederim! Sonunda gerçekten çalışan ve tüm tarayıcılarda bir çözüm!
Vincent

1
Evet! Bu benim için de işe yaradı! Teşekkür ederim. Bu resmi cevap olmalı
Fandango68

1
@RiZKiT, one"İşleyici her olay türü için öğe başına bir kez yürütülür. Kesilen olayı otomatik olarak kapatır, ancak diğeri hala devam eder ve offher ikisiyle de ilgilenir." soru: herhangi bir sayıda olay için tam olarak bir kez çalışacak fonksiyon
KyleMit

13

Bu, işi yapar ve metnin bir bölümünü artık fare ile seçememeniz sorununu önler.

$("input[type=text]").click(function() {
    if(!$(this).hasClass("selected")) {
        $(this).select();
        $(this).addClass("selected");
    }
});
$("input[type=text]").blur(function() {
    if($(this).hasClass("selected")) {
        $(this).removeClass("selected");
    }
});

1
Metnin bir bölümünü fare ile seçebilmeniz önemlidir. Bunu ve A1'i kullanıyorum
Philibert Perusse

2
Burada çok fazla şey var, user2072367'nin odak /
George

@George user2072367 oldukça iyi, ancak bazı ciddi kusurları var.
animatedgif

6

Bu sürüm ios üzerinde çalışır ve ayrıca Windows kromundaki standart sürükle-seç özelliğini düzeltir

var srcEvent = null;

$("input[type=text],input[type=number]")

    .mousedown(function (event) {
        srcEvent = event;
    })

    .mouseup(function (event) {
        var delta = Math.abs(event.clientX - srcEvent.clientX) 
                  + Math.abs(event.clientY - srcEvent.clientY);

        var threshold = 2;
        if (delta <= threshold) {
                   try {
                        // ios likes this but windows-chrome does not on number fields
                        $(this)[0].selectionStart = 0;
                        $(this)[0].selectionEnd = 1000;
                    } catch (e) {
                        // windows-chrome likes this
                        $(this).select();
                    }
        }
    });

http://jsfiddle.net/Zx2sc/2/


Çirkin denemek / yakalamak için tarayıcıları yatıştırmak için düzenlendi
Anihilnine

5

Bu çözümlerin çoğundaki sorun, giriş alanındaki imleç konumunu değiştirirken doğru çalışmaz olmalarıdır.

onmouseupOlay sonrasında tetiklenir alanda, içinde imleç konumunu değiştirir onfocus(en azından Chrome ve FF içinde). Koşulsuz olarak atarsanız mouseup, kullanıcı imleç konumunu fare ile değiştiremez.

function selectOnFocus(input) {
    input.each(function (index, elem) {
        var jelem = $(elem);
        var ignoreNextMouseUp = false;

        jelem.mousedown(function () {
            if (document.activeElement !== elem) {
                ignoreNextMouseUp = true;
            }
        });
        jelem.mouseup(function (ev) {
            if (ignoreNextMouseUp) {
                ev.preventDefault();
                ignoreNextMouseUp = false;
            }
        });
        jelem.focus(function () {
            jelem.select();
        });
    });
}
selectOnFocus($("#myInputElement"));

mouseupAlanın şu anda odağı yoksa, kod koşullu olarak varsayılan davranışı önler . Bu durumlar için çalışır:

  • alan odaklanmadığında tıklama
  • alan odaklandığında tıklayın
  • sahaya sekme

Bunu Chrome 31, FF 26 ve IE 11'de test ettim.


Bu, tıklama etkinlikleri için mükemmel çalışır, ancak bir sonraki giriş alanına geçmek için sekmeyi kullanırsam, içeriğin daha sonra seçildiğini ve seçilmesinin
kaldırıldığını

4

Bu konuyu okurken harika bir çözüm buldum

$(function(){

    jQuery.selectText('input:text');
    jQuery.selectText('input:password');

});

jQuery.extend( {
    selectText: function(s) { 
        $(s).live('focus',function() {
            var self = $(this);
            setTimeout(function() {self.select();}, 0);
        });
    }
});


diğer tüm HTML5 metin türlerini unutmayın, örneğin 'input [type = email]'
jamiebarrow

3

2016'nın sonlarından geliyorum ve bu kod sadece jquery'nin (jquery-2.1.3.js bu durumda) son sürümlerinde çalışır.

if ($(element).is("input")) {
    $(element).focus(function () {
        $(element).select();
    });
}

2

i FF 16.0.2 ve jquery 1.8.3 kullanarak, cevaptaki tüm kod çalışmadı.
Ben böyle kod kullanın ve iş.

$("input[type=text]").focus().select();

4
Bu , kullanıcı alana odaklandığında bir giriş kutusunun içeriğinin nasıl seçileceği sorusuna cevap vermez . Bu, kullanıcı girişi olmadan hemen kodu odaklar ve seçer.
saluce

@ saluce ne demek istediğini anlamıyorum? sorgulayıcının istediği alanı seçtiğinde, mevcut metnin tamamı seçilir. Ve kodum bunu yapmalı. Hatta bu cevabı yazdığım zaman projem için bile kullanıyorum.
GusDeCooL

1
Bu kod, çalıştığında her şeyi odaklar ve seçer, ancak kod, kendi başına, metin kutusunu tıklamak gibi kullanıcı tarafından oluşturulan bir etkinliğe bağlı değildir . Örneğin $("input[type=text]").on('click', function () { $(this).focus.select(); }), odağa neden oluyor ve kullanıcı kutuyu tıklattığında gerçekleşiyor, çünkü kullanıcı kutuyu tıklattığında yürütülüyor. Olay işleyicisi olmadan, kod soruyu cevaplamaz, dolayısıyla aşağı oy ve yorum. Temel olarak, "mevcut metnin tamamı seçildi", ancak "alanı seçtiğinde" bölümüne sahip değilsiniz.
saluce

1
@GusDeCooL yeterince komik (bu tam olarak sorduğu gibi olmasa bile) Ben bunu yaptığınız gibi aynı sonucu istedim :)
Robbie Averill

2
var timeOutSelect;
$("input[type=text]").focus(function() { 
        var save_this = $(this);
        clearTimeout(timeOutSelect);
        timeOutSelect = window.setTimeout (function(){ 
                save_this.select(); 
        }, 100);
});

İki giriş arasında hızlıca geçiş yaparsanız daha fazla güvenlik için clearTimeout kullanın. ClearTimeout eski zaman aşımını temizle ...


Lütfen daha fazla bilgi ile düzenleyin. Yalnızca kod ve "bunu dene" yanıtları önerilmez çünkü bunlar aranabilir içerik içermez ve birisinin neden "bunu denemesi" gerektiğini açıklamaz. Burada bilgi kaynağı olmak için gayret gösteriyoruz.
Brian Tompsett - 莱恩 莱恩

2

Yerel JavaScript ile harika çalışıyor select().

$("input[type=text]").focus(function(event) {
   event.currentTarget.select();
});

veya genel olarak:

$("input[type=text]")[0].select()

1

Veya <input onclick="select()">Works'ü mükemmel kullanabilirsiniz .


hayır değil. bütünü seçmek için çalışır. ancak metnin bir kısmını manuel olarak seçmeyi deneyin, bunu yapamazsınız.
Sujay Phadke


0
<script>$.ready( $("input[type=text]").attr("onclick" , "this.select()"));<script>

Bu muhtemelen düşük kaliteli bir cevap olarak işaretlenecektir, çünkü neler olduğuna dair herhangi bir açıklaması yoktur.
tumultous_rooster

Sizin $.readydoğru değil. attrBelge hazır olana kadar gecikmesini sağlamak için bir işlevi iletmeniz gerekir . Daha sonra hiç eleman toplama geçen hemen bunu yapıyor $.ready.
doug65536

Ayrıca, özellikle bu şekilde 'onclick' ifadesinden kaçının. Kullanın addEventListener.
doug65536

0

Her zaman requestAnimationFrame()iç olay sonrası mekanizmaların üzerinden atlamak için kullanıyorum ve bu Firefox'ta mükemmel çalışıyor. Chrome'da test etmedim.

$("input[type=text]").on('focus', function() {
    requestAnimationFrame(() => $(this).select());
});
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.