Selezione di tutto il testo nell'input di testo HTML quando si fa clic


555

Ho il seguente codice per visualizzare una casella di testo in una pagina Web HTML.

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

Quando viene visualizzata la pagina, il testo contiene il messaggio Inserire l'ID utente . Tuttavia, ho scoperto che l'utente deve fare clic 3 volte per selezionare tutto il testo (in questo caso si prega di inserire l'ID utente ).

È possibile selezionare l'intero testo con un solo clic?

Modificare:

Scusa, ho dimenticato di dire: devo usare l'input type="text"


6
Un approccio migliore è utilizzare a <label>per l'etichetta e non per value. Puoi usare JS e CSS per renderlo uguale, pur non essendo così antisemantico. dorward.me.uk/tmp/label-work/example.html ha un esempio usando jQuery.
— Quentin,

12
O anche usare un segnaposto se stai lavorando in un moderno progetto HTML5.
— Léo Lam,

1
placeholder = "Inserisci l'ID utente"
— Bonus Marcelo

Risposte:


910

Puoi utilizzare questo frammento javascript:

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

Ma a quanto pare non funziona su Safari mobile. In questi casi puoi usare:

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

9
Per renderlo più generale, è possibile utilizzare this.idcome argomento per il gestore di clic. Meglio ancora, potresti eliminare del getElementByIdtutto e passare thiscome argomento.
— Asad Saeeduddin,

12
Su Safari per dispositivi mobili che non funziona. Prova invece a chiamare this.setSelectionRange (0, 9999).
— Dean Radcliffe,

43
@DeanRadcliffe Nice one! Userei this.setSelectionRange(0, this.value.length)invece.
— 2grit


8
Eventuali aggiornamenti sul supporto del browser? w3schools.com/jsref/met_text_select.asp afferma che è supportato da tutti i browser
— Ayyash

65

Le soluzioni precedentemente pubblicate hanno due stranezze:

  1. In Chrome la selezione tramite .select () non si attacca - l'aggiunta di un leggero timeout risolve questo problema.
  2. È impossibile posizionare il cursore nel punto desiderato dopo la messa a fuoco.

Ecco una soluzione completa che seleziona tutto il testo attivo, ma consente di selezionare un punto cursore specifico dopo lo stato attivo.

        $(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
Per gestire il caso in cui l'utente fa clic lontano dal campo e poi di nuovo indietro, aggiungi.on('blur', 'input', function(){focusedElement = null;})
— Tamlyn,

1
un timeout di 0lavori per me in Chrome e Firefox. non sono sicuro da dove 50provenga il timeout .
— thejoshwolfe il

1
La soluzione è utilizzare onClick anziché onFocus. Funziona perfettamente e non ha bisogno di codici complicati.
— Ismael,

4
@CoryHouse non importa, perché Focus tramite tab seleziona nativamente il testo! Nessun javascript richiesto.
— Ismael,

1
@CoryHouse anche dopo 4 anni i tuoi codici funzionano come un fascino. Amico, inchinati. Grazie per questo piccolo trucco sporco. Stavo cercando 2-3 giorni fino a quando non ho trovato questo. : +1:
— Rutvij Kothari il

47

HTML (dovrai mettere l'attributo onclick su ogni input per cui vuoi che funzioni sulla pagina)

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

O UN'OPZIONE MIGLIORE

jQuery (funzionerà per ogni input di testo sulla pagina, non è necessario modificare il codice HTML):

<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
Probabilmente sarebbe meglio associarsi all'evento focus piuttosto che fare clic per coloro che passano in rassegna gli elementi del modulo.
— Andrew Ensley,

7
@Andrew Non è necessario in quanto il testo è sempre selezionato se si sfogliano gli elementi di input. ;-)
— nietonfir,

gli eventi di messa a fuoco sono glitch, l'evento di sfocatura invece è utile per innescare la convalida e il salvataggio automatico dei moduli, funziona anche quando si passa al tab!
— oLinkWebSevelopment

Dovrebbe funzionare bene, assicurati di utilizzare una versione aggiornata di jQuery o di utilizzare $ (document) .live () su versioni precedenti.
— oLinkWebDevelopment

2
A meno che l'utente non abbia già jQuery, un'opzione migliore non comporta l'aggiunta di una dipendenza da una libreria di terze parti.
— Ross,

37

So che questo è vecchio, ma l'opzione migliore è ora utilizzare il nuovo placeholderattributo HTML, se possibile:

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

Ciò farà apparire il testo a meno che non venga inserito un valore, eliminando la necessità di selezionare il testo o cancellare gli input.


2
Si noti che il segnaposto è consentito solo con il doctype html.
— dogawaf,

12

Le risposte elencate sono parziali secondo me. Ho collegato di seguito due esempi di come eseguire questa operazione in Angular e con JQuery.

Questa soluzione ha le seguenti funzionalità:

  • Funziona con tutti i browser che supportano JQuery, Safari, Chrome, IE, Firefox, ecc.
  • Funziona per Phonegap / Cordova: Android e IO.
  • Seleziona tutto solo una volta dopo che l'input viene messo a fuoco fino alla sfocatura successiva e quindi alla messa a fuoco
  • È possibile utilizzare più ingressi e non si verificano anomalie.
  • La direttiva angolare ha un grande riutilizzo semplicemente aggiungendo la direttiva select-all-on-click
  • JQuery può essere modificato facilmente

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

Angolare: 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;
      });
    }
  };
}]);

bella soluzione angularjs. grazie. anche se non uso il flag hasSelectedAll. Immagino che questa sia una disposizione per un secondo clic che potrebbe significare che l'utente vuole posizionare il cursore.
— Rugiada

11

Provare:

onclick="this.select()"

Mi va benissimo.


11

Puoi sempre usare document.execCommand( supportato in tutti i principali browser )

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

Seleziona tutto il testo nell'elemento attualmente attivo.


Questa sembra essere una soluzione elegante. Il codice completo sarebbe simile a:<input type="text" onclick="document.execCommand('selectall',null,false);" />
— pipepiper il

Sì, è il mio modo preferito di svolgere questo tipo di attività, esp. come funziona anche per gli contenteditableelementi. Penso che puoi anche renderlo ancora leggermente più elegante, cioè <input type="text" onfocus="document.execCommand('selectall')">abbastanza sicuro che puoi rimuoverlo nulle falsese non li usi.
— Toastrackenigma,

Si. onfocussembra meglio di onclick. e sì, si può eliminare nulle false. Grazie!
— pipepiper,

Concordo sul fatto che questa è la migliore soluzione cross-browser con l'avvertenza che il timeout menzionato nella soluzione @Corey House dovrebbe essere usato per rendere compatibile questo cross-browser.
— Eric Lease,

1
quando si utilizza onfocus, l'intera pagina viene selezionata quando si fa clic sull'input in Chrome. onclickfunziona bene.
— robotik,

8

input autofocus, con evento onfocus:

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

Ciò consente di aprire un modulo con l'elemento desiderato selezionato. Funziona usando l'autofocus per colpire l'input, che quindi si invia un evento onfocus, che a sua volta seleziona il testo.


8

Nota: se prendi in considerazione onclick="this.select()", Al primo clic, verranno selezionati tutti i caratteri, dopodiché potresti voler modificare qualcosa in input e fare nuovamente clic tra i caratteri, ma selezionerà nuovamente tutti i caratteri. Per risolvere questo problema dovresti usare onfocusinvece di onclick.


6

In effetti, usa onclick="this.select();"ma ricorda di non combinarlo con disabled="disabled"- non funzionerà quindi e dovrai selezionare manualmente o fare più clic per selezionare, ancora. Se si desidera bloccare il valore del contenuto da selezionare, combinare con l'attributo readonly.


4

Ecco una versione riutilizzabile della risposta di Shoban:

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

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

In questo modo è possibile riutilizzare lo script trasparente per più elementi.


4

È possibile sostituire

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

Con:

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

Il segnaposto viene utilizzato per sostituire il valore in base al quale si desidera che le persone possano digitare nella casella di testo senza dover fare clic più volte o utilizzando ctrl + a. Il segnaposto lo rende quindi non un valore ma come suggerisce il nome un segnaposto. Questo è ciò che viene utilizzato in più moduli online che dice "Nome utente qui" o "Email" e quando si fa clic su di esso, "Email" scompare e si può iniziare a digitare subito.


3

La soluzione esatta a ciò che hai chiesto è:

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

Ma suppongo che tu stia provando a mostrare "Inserisci l'ID utente" come segnaposto o suggerimento nell'input. Quindi, è possibile utilizzare quanto segue come soluzione più efficiente:

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

3

Ecco un esempio in React, ma può essere tradotto in jQuery su Vanilla JS se preferisci:

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

Il trucco qui è usare onMouseDownperché l'elemento ha già ricevuto lo stato attivo quando viene attivato l'evento "click" (e quindi il activeElementcontrollo fallirà).

Il activeElementcontrollo è necessario affinché l'utente possa posizionare il cursore dove desidera senza selezionare nuovamente l'intero input.

Il timeout è necessario perché altrimenti il ​​testo verrà selezionato e quindi immediatamente deselezionato, poiché immagino che il browser esegua le parole di controllo del posizionamento del cursore.

Infine, el = ev.currentTargetè necessario in React perché React riutilizza gli oggetti evento e perderai l'evento sintetico quando il setTimeout si attiva.


è React il nuovo jQuery?
— vpzomtrrfrt

@vpzomtrrfrt Sicuro: DJ / K. Avevo scritto questo in React e non avevo intenzione di non reagire solo per alcuni punti SO. Prendilo o lascialo :-)
— mpen

Come è un esempio in React ?! Questo è più un esempio in javascript nativo.
— Cesar,

2

Il problema con la cattura dell'evento click è che ogni clic successivo all'interno del testo lo selezionerà di nuovo, mentre l'utente probabilmente si aspettava di riposizionare il cursore.

Ciò che ha funzionato per me è stato dichiarare una variabile, selezionare SearchTextOnClick e impostarla su true per impostazione predefinita. Il gestore di clic verifica che la variabile sia ancora vera: se lo è, la imposta su false ed esegue select (). Ho quindi un gestore di eventi di sfocatura che lo riporta su true.

I risultati finora sembrano il comportamento che mi aspetto.

(Modifica: ho trascurato di dire che avevo provato a catturare l'evento focus come suggerito da qualcuno, ma non funziona: dopo che l'evento focus è stato attivato, l'evento clic può attivarsi, deselezionando immediatamente il testo).



2

HTML come questo <input type="text" value="click the input to select" onclick="javascript:textSelector(this)"/>

e codice javascript senza bind

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

4
"javascript:" è usato solo in href e dovrebbe essere evitato.
— user1133275

1

Bene, questa è un'attività normale per un TextBox.

Fai clic su 1 - Imposta lo stato attivo

Fare clic su 2/3 (doppio clic) - Seleziona testo

È possibile impostare concentrarsi sul TextBox quando la pagina viene caricata per ridurre la "select" per un singolo evento doppio clic.


1
Anche 2 clic è per la selezione della parola e 3 per la selezione della linea.
— Arthur,

1

Utilizzare "segnaposto" anziché "valore" nel campo di input.


0

Se si utilizza AngularJS, è possibile utilizzare una direttiva personalizzata per un facile accesso:

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

Ora si può semplicemente usarlo in questo modo:

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

L'esempio è con requestjs - quindi la prima e l'ultima riga possono essere saltate se si utilizza qualcos'altro.


0

Se qualcuno vuole farlo al caricamento della pagina con jQuery (dolce per i campi di ricerca) ecco la mia soluzione

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

Sulla base di questo post. Grazie a CSS-Tricks.com


0

Se stai solo cercando di avere un testo segnaposto che viene sostituito quando un utente seleziona l'elemento, è ovviamente consigliabile utilizzare l' placeholderattributo al giorno d'oggi. Tuttavia, se si desidera selezionare tutto il valore corrente quando un campo ottiene lo stato attivo, una combinazione di risposte @Cory House e @Toastrackenigma sembra essere la più canonica. Uso focused focusouteventi, con gestori che impostano / rilasciano l'elemento di messa a fuoco corrente e selezionano tutti quando sono focalizzati. Un esempio di angular2 / dattiloscritto è il seguente (ma sarebbe banale da convertire in vanilla js):

Modello:

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

Componente:

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); });
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.