Tıklandığında HTML metin girişindeki tüm metni seçme


554

Bir HTML web sayfasında bir metin kutusu görüntülemek için aşağıdaki kodu var.

<input type="text" id="userid" name="userid" value="Please enter the user ID" />

Sayfa görüntülendiğinde, metin Lütfen kullanıcı kimliği girin mesajını içerir. Ancak, kullanıcının tüm metni seçmek için 3 kez tıklaması gerektiğini buldum (bu durumda lütfen kullanıcı kimliğini girin ).

Metnin tamamını tek bir tıklama ile seçmek mümkün müdür?

Düzenle:

Maalesef şunu söylemeyi unuttum: Girişi kullanmalıyım type="text"


6
Daha iyi bir yaklaşım, <label>etiket için değil, etiket için a kullanmaktır value. Semantik değilken aynı görünmesini sağlamak için JS ve CSS kullanabilirsiniz. dorward.me.uk/tmp/label-work/example.html , jQuery kullanan bir örneğe sahiptir.
Quentin

12
Modern, HTML5 projelerinde çalışıyorsanız yer tutucu da kullanabilirsiniz.
Léo Lam

1
placeholder = "Lütfen kullanıcı kimliğini girin"
Marcelo Bonus

Yanıtlar:


908

Bu javascript snippet'ini kullanabilirsiniz:

<input onClick="this.select();" value="Sample Text" />

Ancak görünüşe göre mobil Safari'de çalışmıyor. Bu gibi durumlarda şunları kullanabilirsiniz:

<input onClick="this.setSelectionRange(0, this.value.length)" value="Sample Text" />

9
Bunu daha genel hale getirmek this.idiçin, tıklama işleyicisinin argümanı olarak kullanabilirsiniz . Daha da iyisi, getElementByIdtamamen ortadan kaldırabilir ve thisbir argüman olarak geçebilirsiniz .
Asad Saeeduddin

12
Mobil Safari'de çalışmıyor. Bunun yerine this.setSelectionRange (0, 9999) öğesini çağırmayı deneyin.
Dean Radcliffe

43
@DeanRadcliffe Güzel biri! Onun this.setSelectionRange(0, this.value.length)yerine kullanırdım.
tane


8
Tarayıcı desteğinde güncelleme var mı? w3schools.com/jsref/met_text_select.asp tüm tarayıcılar tarafından desteklendiğini iddia ediyor
Ayyash

65

Önceden gönderilen çözümlerin iki tuhaflığı vardır:

  1. Chrome'da .select () yoluyla seçim yapışmaz - hafif bir zaman aşımı eklemek bu sorunu çözer.
  2. Odaktan sonra imleci istenen bir noktaya yerleştirmek imkansızdır.

İşte odaktaki tüm metni seçen ancak odaktan sonra belirli bir imleç noktası seçmeye izin veren eksiksiz bir çözüm.

        $(function () {
            var focusedElement;
            $(document).on('focus', 'input', function () {
                if (focusedElement == this) return; //already focused, return so user can now place cursor at specific point in input.
                focusedElement = this;
                setTimeout(function () { focusedElement.select(); }, 100); //select all text in any field on focus for easy re-entry. Delay sightly to allow focus to "stick" before selecting.
            });
        });

7
Kullanıcının alandan uzaklaşıp tekrar geri döndüğü durumu ele almak için, ekleyin.on('blur', 'input', function(){focusedElement = null;})
Tamlyn

1
0chrome ve firefox'ta benim için zaman aşımına uğradı . zaman 50aşımınızın nereden geldiğinden emin değilim .
thejoshwolfe

1
Çözüm, onFocus yerine onClick kullanmaktır. Mükemmel çalışır ve karmaşık kodlara ihtiyaç duymaz.
Ismael

4
@CoryHouse önemli değil, çünkü sekme yoluyla odaklan yerel olarak metni seçer! Javascript gerekmez.
Ismael

1
@CoryHouse 4 yıl sonra bile kodlarınız bir cazibe gibi çalışır. Adamım, bir yay atın. Bu küçük kirli kesmek için teşekkürler. Bunu bulana kadar 2-3 gün aradım. : +1:
Rutvij Kothari

47

Html (onclick niteliğini, sayfada çalışmasını istediğiniz her girdiye koymanız gerekir)

 <input type="text" value="click the input to select" onclick="this.select();"/>

VEYA DAHA İYİ BİR SEÇENEK

jQuery (bu, sayfadaki her metin girişi için çalışır, html'nizi değiştirmenize gerek yoktur):

<script  type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script>  
<script type="text/javascript">
    $(function(){
        $(document).on('click','input[type=text]',function(){ this.select(); });
    });
</script>

22
Form öğeleri arasında sekme yapanlar için tıklamak yerine odak olayına bağlanmak daha iyi olur.
Andrew Ensley

7
@Andrew Giriş öğelerinde sekmeler yaparsanız metin her zaman seçildiğinden bu gerekli değildir. ;-)
nietonfir

odak olayları aksaklık, diğer yandan bulanıklık olayı formları doğrulama ve otomatik kaydetme tetiklemek için kullanışlı geliyor, sekme de zaman çalışır!
oLinkWebDevelopment

İyi çalışıyorsa, jQuery'nin güncel bir sürümünü kullandığınızdan emin olun veya eski sürümlerde $ (document) .live () kullanın.
oLinkWebDevelopment

2
Kullanıcının zaten jQuery'si yoksa, daha iyi bir seçenek üçüncü taraf kitaplığına bağımlılık eklemeyi içermez.
Ross

37

Bu eski olduğunu biliyorum, ama en iyi seçenek şimdi placeholdermümkünse yeni HTML özelliğini kullanmaktır :

<input type="text" id="userid" name="userid" placeholder="Please enter the user ID" />

Bu, bir değer girilmedikçe metnin gösterilmesine neden olarak metin seçme veya girişleri temizleme ihtiyacını ortadan kaldırır.


2
Yer tutucunun yalnızca doctype html ile izin verildiğini lütfen unutmayın.
dogawaf

12

Listelenen cevaplar bana göre kısmi. Aşağıda bunu Angular ve JQuery ile nasıl yapacağınıza dair iki örnek verdim.

Bu çözüm aşağıdaki özelliklere sahiptir:

  • JQuery, Safari, Chrome, IE, Firefox vb. Destekleyen tüm tarayıcılarda çalışır.
  • Phonegap / Cordova için çalışır: Android ve IO'lar.
  • Giriş bir sonraki bulanıklaşmaya ve sonra odaklanana kadar yalnızca bir kez seçim yapar
  • Birden fazla giriş kullanılabilir ve hata yapmaz.
  • Açısal yönerge büyük yeniden kullanıma sahiptir, sadece tıklama üzerine direktif seçin
  • JQuery kolayca değiştirilebilir

JQuery: http://plnkr.co/edit/VZ0o2FJQHTmOMfSPRqpH?p=preview

$("input").blur(function() {
  if ($(this).attr("data-selected-all")) {
  //Remove atribute to allow select all again on focus        
  $(this).removeAttr("data-selected-all");
  }
});

$("input").click(function() {
  if (!$(this).attr("data-selected-all")) {
    try {
      $(this).selectionStart = 0;
      $(this).selectionEnd = $(this).value.length + 1;
      //add atribute allowing normal selecting post focus
      $(this).attr("data-selected-all", true);
    } catch (err) {
      $(this).select();
      //add atribute allowing normal selecting post focus
      $(this).attr("data-selected-all", true);
    }
  }
});

Açısal: http://plnkr.co/edit/llcyAf?p=preview

var app = angular.module('app', []);
//add select-all-on-click to any input to use directive
app.directive('selectAllOnClick', [function() {
  return {
    restrict: 'A',
    link: function(scope, element, attrs) {
      var hasSelectedAll = false;
      element.on('click', function($event) {
        if (!hasSelectedAll) {
          try {
            //IOs, Safari, thows exception on Chrome etc
            this.selectionStart = 0;
            this.selectionEnd = this.value.length + 1;
            hasSelectedAll = true;
          } catch (err) {
            //Non IOs option if not supported, e.g. Chrome
            this.select();
            hasSelectedAll = true;
          }
        }
      });
      //On blur reset hasSelectedAll to allow full select
      element.on('blur', function($event) {
        hasSelectedAll = false;
      });
    }
  };
}]);

güzel angularjs çözümü. Teşekkür. hasSelectedAll bayrağını kullanmama rağmen. Bu, kullanıcının imleci yerleştirmek istediği anlamına gelebilecek ikinci bir tıklama için bir hüküm olduğunu tahmin ediyorum.
dewd

11

Deneyin:

onclick="this.select()"

Benim için harika çalışıyor.


11

Her zaman kullanabilirsiniz document.execCommand( tüm büyük tarayıcılarda desteklenir )

document.execCommand("selectall",null,false);

O anda odaklanılan öğedeki tüm metni seçer.


Bu zarif bir çözüm gibi görünüyor. Kodun tamamı şöyle görünür:<input type="text" onclick="document.execCommand('selectall',null,false);" />
pipepiper

Evet, bu tür işleri yapmanın en sevdiğim yolu, esp. contenteditableelemanlar için de çalışır . Ben de biraz daha zarif yapabilirsiniz düşünüyorum, yani <input type="text" onfocus="document.execCommand('selectall')">- emin olabilirsiniz nullve falsebunları kullanmazsanız.
Toastrackenigma

Evet. onfocusdaha iyi görünüyor onclick. ve evet, nullve ile başarabilir false. Teşekkürler!
pipepiper

Bunun, @Corey House çözümünde belirtilen zaman aşımının bu çapraz tarayıcıyı uyumlu hale getirmek için kullanılması gereken uyarıyla en iyi çapraz tarayıcı çözümü olduğunu kabul ediyorum.
Eric Lease

1
kullanırken onfocusChrome'da giriş tıklandığında tüm sayfa seçilir. onclickiyi çalışıyor.
robotik

8

onfocus olayıyla otomatik odaklama girişi:

<INPUT onfocus="this.select()" TYPE="TEXT" NAME="thing" autofocus>

Bu, istenen öğe seçiliyken bir form açmanızı sağlar. Girişe vurmak için otomatik netleme kullanarak çalışır, daha sonra kendisine bir onfocus olayı gönderir ve bu da metni seçer.


8

Not: Eğer dikkate aldığımızda onclick="this.select()", belki girmek düzenlemek şey istedim sonra ilk basarak, tüm karakterler, seçilir ve tekrar karakterler arasında tıklayarak ama yine tüm karakterleri seçecektir. Bu sorunu gidermek için onfocusyerine kullanmalısınız onclick.


6

Gerçekten, kullanın onclick="this.select();"ama ile birleştirmemeyi unutmayın disabled="disabled"- o zaman işe yaramaz ve yine de seçmek için manuel olarak seçmeniz veya çoklu tıklamanız gerekir. Seçilecek içerik değerini kilitlemek istiyorsanız, özellik ile birleştirin readonly.


4

İşte Shoban'ın cevabının yeniden kullanılabilir bir versiyonu:

<input type="text" id="userid" name="userid"
 value="Please enter the user ID" onfocus="Clear(this);"
/>

function Clear(elem)
{
elem.value='';
}

Bu şekilde, açık komut dosyasını birden çok öğe için yeniden kullanabilirsiniz.


4

Değiştirebilirsiniz

<input type="text" id="userid" name="userid" value="Please enter the user ID" />

İle:

<input type="text" id="userid" name="userid" placeholder="Please enter the user ID" />

Yer tutucu, değeri, kullanıcıların birden fazla kez tıklamak zorunda kalmadan veya ctrl + a kullanarak metin kutusuna Yazmalarını istediğiniz şekilde değiştirmek için kullanılır. Yer tutucu bunu bir değer değil, adın bir yer tutucu önerdiği şekilde yapar. Buradaki "Kullanıcı adı burada" veya "E-posta" yazan birden çok çevrimiçi formda kullanılır ve üzerine tıkladığınızda "E-posta" kaybolur ve hemen yazmaya başlayabilirsiniz.


3

Sorduğunuza kesin çözüm:

<input type="text" id="userid" name="userid" value="Please enter the user ID" onClick="this.setSelectionRange(0, this.value.length)"/>

Ancak herhalde girişte yer tutucu veya ipucu olarak "Lütfen kullanıcı kimliğini girin" i göstermeye çalışıyorsunuz . Böylece, aşağıdakileri daha verimli bir çözüm olarak kullanabilirsiniz:

<input type="text" id="userid" name="userid" placeholder="Please enter the user ID" />

3

İşte React'te bir örnek, ancak isterseniz vanilya JS'de jQuery'ye çevrilebilir:

class Num extends React.Component {

    click = ev => {
        const el = ev.currentTarget;
        if(document.activeElement !== el) {
            setTimeout(() => {
                el.select();    
            }, 0);
        }
    }

    render() {
        return <input type="number" min={0} step={15} onMouseDown={this.click} {...this.props} />
    }
}

Buradaki hileyi kullanmaktır, onMouseDownçünkü "click" olayı başladığında öğe zaten odaklanmıştır (ve böylece activeElementkontrol başarısız olacaktır).

activeElementÇek bunlar kullanıcı sürekli tüm giriş-seçmeden yeniden olmadan istediğiniz imlecini konumlandırabilmesidir gerekli böyledir.

Zaman aşımı gereklidir, çünkü aksi takdirde metin seçilecek ve hemen seçilmeyecektir, çünkü sanırım tarayıcı imleç konumlandırma kontrolünden sonra kelimeleri yapar.

Ve son olarak, el = ev.currentTargetgerekli tepki de çünkü yeniden kullanımları olay nesneleri tepki ve zaman setTimeout yangınları ile sentetik olayı kaybedersiniz.


yeni jQuery nedir?
vpzomtrrfrt

@vpzomtrrfrt Elbette: DJ / K. Bunu React'ta yazmıştım ve sadece bazı SO puanları için Reaksiyonu iptal etmek üzereydim. Al ya da bırak :-)
mpen

Bu React'ta nasıl bir örnek ?! Bu daha çok yerli javascript örneğidir.
Cesar

2

Click olayını yakalamadaki sorun, metin içindeki sonraki her tıklamanın tekrar seçmesi ve kullanıcı muhtemelen imleci yeniden konumlandırmayı beklemesidir.

Benim için işe yarayan bir değişkeni bildirmekti, SelectSearchTextOnClick ve varsayılan olarak true olarak ayarlıyordu. Tıklama işleyicisi değişkenin hala doğru olup olmadığını kontrol eder: öyleyse, false olarak ayarlar ve select () işlemini gerçekleştirir. Sonra onu geri true olarak ayarlayan bir bulanıklık olay işleyicisi var.

Sonuçlar şimdiye kadar beklediğim davranış gibi görünüyor.

(Düzenleme: Birinin önerdiği gibi odak olayını yakalamaya çalıştığımı söylemeyi ihmal ettim, ancak bu işe yaramadı: odak olayı tetiklendikten sonra, tıklama olayı hemen metnin seçimini kaldırarak tetiklenebilir).



2

Html bunu beğendi <input type="text" value="click the input to select" onclick="javascript:textSelector(this)"/>

ve bağlama olmadan javascript kodu

function textSelector(ele){
    $(ele).select();
}

4
"javascript:" yalnızca href içinde kullanılır ve bundan kaçınılmalıdır.
user1133275

1

Bu bir TextBox için normal bir etkinliktir.

1 - Odağı ayarla'yı tıklayın

Tıkla 2/3 (çift tıklama) - Metin seç

"Seç" i tek bir çift tıklama olayına indirgemek için sayfa ilk yüklendiğinde TextBox'a odaklanmayı ayarlayabilirsiniz .


1
Ayrıca kelime seçimi için 2, satır seçimi için 3 tıklama.
Arthur

1

Giriş alanınızda "değer" yerine "yer tutucu" kullanın.


0

AngularJS kullanıyorsanız, kolay erişim için özel bir yönerge kullanabilirsiniz:

define(['angular'], function () {
    angular.module("selectionHelper", [])
    .directive('selectOnClick', function () {
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {                
                element.on('click', function () {
                    this.select();
                });
            }
        };
    });
});

Şimdi sadece şöyle kullanabilirsiniz:

<input type="text" select-on-click ... />

Örnek requirjs ile - başka bir şey kullanılırsa ilk ve son satır atlanabilir.


0

Herkes bunu sayfa yük w / jQuery (arama alanları için tatlı) w / yapmak istiyorum İşte benim çözüm

jQuery.fn.focusAndSelect = function() {
    return this.each(function() {
        $(this).focus();
        if (this.setSelectionRange) {
            var len = $(this).val().length * 2;
            this.setSelectionRange(0, len);
        } else {
            $(this).val($(this).val());
        }
        this.scrollTop = 999999;
    });
};

(function ($) {
    $('#input').focusAndSelect();
})(jQuery);

Bu gönderiye dayanarak . CSS-Tricks.com'a teşekkürler


0

Bir kullanıcı öğeyi seçtiğinde değiştirilen yer tutucu metne sahip olmaya çalışıyorsanız, placeholdergünümüzde özniteliği kullanmak en iyi uygulamadır . Ancak, bir alan odak kazandığında geçerli değerin tümünü seçmek istiyorsanız, @Cory House ve @Toastrackenigma cevaplarının bir kombinasyonu en standarttır. Geçerli odak öğesini ayarlayan / serbest bırakan işleyicileri olan focusve focusoutolayları kullanın ve odaklandığında tümünü seçin. Bir açısal2 / daktilo örneği aşağıdaki gibidir (ancak vanilya js'ye dönüştürmek önemsiz olacaktır):

Şablon:

<input type="text" (focus)="focus()" (focusout)="focusout()" ... >

Bileşen:

private focused = false;

public focusout = (): void => {
    this.focused = false;
};

public focus = (): void => {
    if(this.focused) return;
    this.focused = true;

    // Timeout for cross browser compatibility (Chrome)
    setTimeout(() => { document.execCommand('selectall', null, false); });
};
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.