Seleziona tutti i contenuti della casella di testo quando riceve lo stato attivo (Vanilla JS o jQuery)


311

Che cos'è una soluzione Vanilla JS o jQuery che selezionerà tutto il contenuto di una casella di testo quando la casella di testo riceve lo stato attivo?



3
@gdoron per qualche motivo che collega i reindirizzamenti a questa stessa domanda.
Destrictor

@Destrictor, Sì, avrebbe dovuto essere questo: "Selezione del testo
gdoron supporta Monica

Il problema con la maggior parte di queste soluzioni è che non funzionano correttamente quando si modifica la posizione del cursore all'interno del campo di input. Date un'occhiata alla mia risposta qui: stackoverflow.com/a/20826207/641452
Colin Breame

Risposte:


370
$(document).ready(function() {
    $("input:text").focus(function() { $(this).select(); } );
});

23
Anche solo per informazioni extra: "input [tipo = testo]" ora può essere "input: testo" saluti
Ricardo Vega,

8
Questo non sembra funzionare per me su Chrome e il sito Web jQuery dice che dipende dal browser. Qualcun altro può verificare?
Kenny Wyland,

71
Sembra che i browser WebKit interferiscano con questo a causa dell'evento mouseup. Ho aggiunto questo e ha funzionato: $ ('input: text'). Mouseup (function (e) {return false;});
Kenny Wyland,

5
Kenny ha ragione, ma sfortunatamente il "mouseup" influenza anche i controlli di spinner di Chrome. L'attivazione di "click" anziché "focus" sembra risolverlo
Richard Kennard,

24
Uso in questo modo: $ ("input: text"). Select (). Focus ();
Phuong,

227

<input type="text" onfocus="this.select();" onmouseup="return false;" value="test" />


43
+ onmouseup = "return false" per interrompere la deselezione al clic
Anthony Johnston,

2
+1 per un qualche tipo di stopEvent per il mouseup, altrimenti non funziona in modo affidabile. Lo svantaggio di farlo è che una volta che il cursore si trova nel campo, facendo clic in qualche punto all'interno del testo selezionato per posizionare il cursore non funziona; i clic sono effettivamente disabilitati. Tuttavia, per le situazioni in cui è preferibile selezionare l'intero testo in primo piano, è probabilmente il minore dei due mali.
enigment

Sono stato in grado di aggirare il problema sollevato dall'enigment impostando una variabile globale doMouseUp su false, durante l'evento onMouseDown, se questo! = Document.activeElement. Quindi, durante onMouseUp, reimposta doMouseUp su true e restituisce il valore doMouseUp prima di reimpostarlo. Si sta contorcendo e ha bisogno di codice - posterò una risposta per spiegarlo meglio.
Travis,

1
NON aggiungere onmouseup="return false;"se si desidera che l'utente sia in grado di selezionare e modificare liberamente il testo dopo aver messo a fuoco all'interno della casella di testo. Con questo codice, il testo verrà bloccato in una situazione "seleziona tutto" e l'utente non sarà in grado di modificarlo a meno che l'utente non digiti un nuovo testo o utilizzi i tasti freccia per spostarsi. Onestamente, questo sembra un comportamento molto strano e non avrebbe senso se la casella di testo non fosse permanentemente modificabile (e quindi disabilitata).
ADTC

1
Tecnicamente, non è necessario onmouseup="return false;"se si desidera semplicemente che la selezione avvenga quando l'utente fa clic o fa clic per la prima volta . E +1 per il javascript alla vaniglia!
clabe45,

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

3
Confermato. L'attuale risposta più votata / accettata non sembra funzionare per Chrome.
Aron Boyette,

39
$(document).ready(function() {
    $("input:text")
        .focus(function () { $(this).select(); } )
        .mouseup(function (e) {e.preventDefault(); });
});

1
Questo è buono. Grazie! Il commento di enigment alla risposta di Zach fornisce un aspetto negativo della prevenzione del default mouseupdell'evento: "una volta che il cursore si trova nel campo, fare clic in qualche punto all'interno del testo selezionato per posizionare il cursore lì non funziona; i clic sono effettivamente disabilitati. Tuttavia, per situazioni in cui è desiderabile selezionare l'intero testo in primo piano, probabilmente è il minore dei due mali. "
JohnK

25

jQuery non è JavaScript, che in alcuni casi è più facile da usare.

Guarda questo esempio:

<textarea rows="10" cols="50" onclick="this.focus();this.select()">Text is here</textarea>

Fonte: trucchi CSS , MDN


7
Forse va bene se non ti dispiace ottenere il markup e il codice tutti confusi; molte persone cercano di mantenere la loro sceneggiatura "discreta" al giorno d'oggi. Oh ... e jQuery è Javascript.
Andrew Barber,

2
Grazie per il suggerimento di onclick, funziona benissimo. Non tutti usano jQuery così contenti di vedere un'altra opzione.
Lukus,

questo presuppone che gli utenti utilizzino il mouse
pcnate solo il

può usare onfocus = "this.focus (); this.select ()" per tastiera
Muhammad Nadeem,

21

Questo non è solo un problema di Chrome / Safari, ho riscontrato un comportamento abbastanza simile con Firefox 18.0.1. La parte divertente è che questo non accade su MSIE! Il problema qui è il primo evento del mouse che forza a deselezionare il contenuto di input, quindi ignora solo la prima occorrenza.

$(':text').focus(function(){
    $(this).one('mouseup', function(event){
        event.preventDefault();
    }).select();
});

L'approccio timeOut provoca uno strano comportamento e bloccando ogni evento del mouse non è possibile rimuovere la selezione facendo nuovamente clic sull'elemento di input.


1
+1 per l'utilizzo di uno per impedire un singolo passaggio del mouse. Non mi è davvero piaciuto non poter selezionare il testo con il mouse dopo il clic iniziale.
Pluc

13

HTML:

Enter Your Text : <input type="text" id="text-filed" value="test">

Utilizzando JS:

var textFiled = document.getElementById("text-filed");
textFiled.addEventListener("focus", function() { this.select(); });

Utilizzando JQuery:

$("#text-filed").focus(function() { $(this).select(); } );

Utilizzando React JS:

Nel rispettivo componente all'interno della funzione di rendering -

<input
  type="text"
  value="test"
  onFocus={e => e.target.select()}
/>

2
Questo funziona per me in React:onFocus={(e) => e.target.select()}
Paito,

11

la mia soluzione è usare un timeout. Sembra funzionare bene

$('input[type=text]').focus(function() {
    var _this = this;
    setTimeout(function() {
        _this.select();
    }, 10);
});

Questa è la soluzione che uso e preferisco. Uso un valore di timeout pari a 0 poiché ciò causerà l'aggiunta alla fine della coda degli eventi corrente, il che significa che verrà eseguito dopo l'evento "mouseup".
DavidM,


4

So che il codice inline ha uno stile scadente, ma non volevo inserirlo in un file .js. Funziona senza jQuery!

<input type="text" value="blah blah" onfocus="this.select(); this.selAll=1;" onmouseup="if(this.selAll==0) return true; this.selAll=0; return false;"></input>

3

Le risposte qui mi hanno aiutato fino a un certo punto, ma ho avuto un problema con i campi di input Numero HTML5 quando ho fatto clic sui pulsanti su / giù in Chrome.

Se si fa clic su uno dei pulsanti e si lascia il mouse sul pulsante, il numero continuerebbe a cambiare come se si stesse tenendo premuto il pulsante del mouse perché il mouse veniva gettato via.

Ho risolto questo problema rimuovendo il gestore del mouse non appena è stato attivato come di seguito:

    $("input:number").focus(function () {
        var $elem = $(this);
        $elem.select().mouseup(function (e) {
            e.preventDefault();
            $elem.unbind(e.type);
        });
    });

Spero che questo aiuti le persone in futuro ...


Nopes. stai fornendo una soluzione a un problema auto-generato. Se osservi correttamente la risposta, sono vincolanti solo mouseupper i campi di immissione testo e non per numbers. Questo problema non dovrebbe quindi presentarsi
Om Shankar

Il problema con l'associazione del mouseup è che interferisce quando si sposta il cursore all'interno del campo. Questa è una soluzione migliore, ma se si accede al campo, il mouse successivo verrà perso (e l'utente non sarà in grado di spostare il cursore con il mouse). È meglio che perdere tutte le trappole per topi!
Colin Breame,

3

Funzionerà, prova questo -

<input id="textField1" onfocus="this.select()" onmouseup="return false" /> 

Funziona in Safari / IE 9 e Chrome, ma non ho avuto la possibilità di testare in Firefox.


3

So che ci sono già molte risposte qui - ma questa manca finora; una soluzione che funziona anche con contenuti generati da Ajax:

$(function (){
    $(document).on("focus", "input:text", function() { 
        $(this).select(); 
    });
});

2

Sono stato in grado di migliorare leggermente la risposta di Zach incorporando alcune chiamate di funzione. Il problema con quella risposta è che disabilita completamente onMouseUp, impedendo così di fare clic nella casella di testo una volta che è attivo.

Ecco il mio codice:

<input type="text" onfocus="this.select()" onMouseUp="javascript:TextBoxMouseUp();" onMouseDown="javascript:TextBoxMouseDown();" />

<script type="text/javascript">
    var doMouseUp = true;
    function TextBoxMouseDown() {
        doMouseUp = this == document.activeElement;
        return doMouseUp;
    }
    function TextBoxMouseUp() {
        if (doMouseUp)
        { return true; }
        else {
            doMouseUp = true;
            return false;
        }
    }
</script>

Questo è un leggero miglioramento rispetto alla risposta di Zach. Funziona perfettamente in IE, non funziona affatto in Chrome e funziona con successo alternato in FireFox (letteralmente ogni altra volta). Se qualcuno ha un'idea di come farlo funzionare in modo affidabile in FF o Chrome, ti preghiamo di condividere.

Comunque, ho pensato di condividere ciò che potevo per renderlo un po 'più bello.


Si è verificato un errore nel codice: il secondo metodo deve essere chiamato "TextBoxMouseUp". Dai un'occhiata alla mia risposta che utilizza un approccio simile.
Colin Breame,

1
Va notato che onMouseUp=""e onMouseDown=""non sono lo standard w3 corretto. Dovrebbero essere onmouseup=""e onmousedown="". Come con altri attributi html, dovrebbero essere scritti in minuscolo e non in maiuscolo.
Estratto il

2

Come @Travis e @Mari, volevo selezionare automaticamente quando l'utente ha fatto clic, il che significa impedire il comportamento predefinito di un mouseupevento, ma non impedire all'utente di fare clic. La soluzione che mi è venuta in mente, che funziona in IE11, Chrome 45, Opera 32 e Firefox 29 (questi sono i browser che ho attualmente installato), si basa sulla sequenza di eventi coinvolti in un clic del mouse.

Quando si fa clic su un input di testo che non ha lo stato attivo, si ottengono questi eventi (tra gli altri):

  • mousedown: In risposta al tuo clic. La gestione predefinita aumenta focusse necessario e imposta l'inizio della selezione.
  • focus: Come parte della gestione predefinita di mousedown.
  • mouseup: Il completamento del clic, la cui gestione predefinita imposta la fine della selezione.

Quando si fa clic su un input di testo già attivo, l' focusevento viene ignorato. Come hanno notato entrambi @Travis e @Mari, la gestione predefinita di mouseupdeve essere prevenuta solo se focussi verifica l' evento. Tuttavia, poiché non esiste un focusevento "non accaduto", dobbiamo dedurlo, cosa che possiamo fare all'interno del mousedowngestore.

La soluzione di @ Mari richiede l'importazione di jQuery, che desidero evitare. La soluzione di @ Travis lo fa ispezionando document.activeElement. Non so perché esattamente la sua soluzione non funziona tutti i browser, ma c'è un altro modo per tenere traccia se l'input di testo è attivo: è sufficiente seguire il suo focuseblur eventi eventi.

Ecco il codice che funziona per me:

    var blockMouseUp = false;
    var customerInputFocused = false;

    txtCustomer.onfocus =
      function ()
      {
        try
        {
          txtCustomer.selectionStart = 0;
          txtCustomer.selectionEnd = txtCustomer.value.length;
        }
        catch (error)
        {
          txtCustomer.select();
        }

        customerInputFocused = true;
      };

    txtCustomer.onblur =
      function ()
      {
        customerInputFocused = false;
      };

    txtCustomer.onmousedown =
      function ()
      {
        blockMouseUp = !customerInputFocused;
      };

    txtCustomer.onmouseup =
      function ()
      {
        if (blockMouseUp)
          return false;
      };

Spero che questo sia di aiuto a qualcuno. :-)


+1 Grazie, ma come può essere riscritto in modo da non codificare il controllo "txtCustomer" nello script? C'è un modo per tramandare un oggetto "questo"?
Fandango68,

Un modo sarebbe quello di creare una funzione di utilità per applicare il comportamento a qualsiasi elemento, passato come parametro. All'interno di quella funzione, il riferimento all'elemento sarebbe codificato in modo rigido - al parametro. Potresti quindi chiamarlo su qualsiasi numero di elementi di input, identificato con qualsiasi mezzo tu abbia a tua disposizione. :-)
Jonathan Gilbert il

Scusa, sono un noob. Potresti aggiornare la tua risposta con un esempio? Grazie
Fandango68 il

1
Basta racchiudere il codice che ho scritto in una dichiarazione di funzione che accetta un parametro chiamato "txtCustomer". Consiglio di rinominare "txtCustomer" in qualcos'altro, ma se non si è sicuri di farlo, funzionerà tecnicamente con la variabile denominata "txtCustomer". Vale a dire: funzione MakeTextBoxAutoSelect (txtCustomer) { cosa ho scritto sopra }
Jonathan Gilbert


1

Che cosa è una soluzione JavaScript o jQuery che seleziona tutto il contenuto di una casella di testo quando la casella di testo riceve attenzione ?

Devi solo aggiungere il seguente attributo:

onfocus="this.select()"

Per esempio:

<input type="text" value="sometext" onfocus="this.select()">

(Onestamente non ho idea del perché tu abbia bisogno di qualcos'altro.)


1

Questo ha funzionato per me (pubblicare poiché non è nelle risposte ma in un commento)

 $("#textBox").focus().select();

0
$('input').focus(function () {
    var self = $(this);
    setTimeout(function () {
        self.select();
    }, 1);        
});

Modifica: per la richiesta di @ DavidG, non posso fornire dettagli perché non sono sicuro del perché funzioni, ma credo che abbia qualcosa a che fare con l'evento focus che si propaga su o giù o qualunque cosa faccia e l'elemento di input che riceve la notifica ha ricevuto il focus. L'impostazione del timeout dà all'elemento un momento per rendersi conto che è stato fatto.


Spiega la tua risposta anziché incollarla in qualche codice.
DavidG,

0

Se concatenate gli eventi insieme credo che elimini la necessità di usare .onecome suggerito altrove in questo thread.

Esempio:

$('input.your_element').focus( function () {
    $(this).select().mouseup( function (e) {
        e.preventDefault();
    });
});

0

Nota: se si sta programmando in ASP.NET, è possibile eseguire lo script utilizzando ScriptManager.RegisterStartupScript in C #:

ScriptManager.RegisterStartupScript(txtField, txtField.GetType(), txtField.AccessKey, "$('#MainContent_txtField').focus(function() { $(this).select(); });", true );

Oppure digita semplicemente lo script nella pagina HTML suggerita nelle altre risposte.


La domanda non ha ASP.NET da nessuna parte. : |
Mohamed Thaufeeq,

È vero, l'ho pubblicato nel caso in cui il programmatore stia utilizzando ASP.NET. Può essere utile per chi cerca una risposta utilizzando il framework (poiché questo mi ha aiutato). Sto solo condividendo e spero che qualcuno lo troverà utile.
Exel Gamboa,

Nel caso in cui il programmatore stia utilizzando ASP.NET, aggiungerà il tag 'asp.net' alla domanda. : |
Mohamed Thaufeeq,

0

Ho seminato questo da qualche parte, funziona perfettamente!

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

0

Sono un po 'in ritardo alla festa, ma funziona perfettamente in IE11, Chrome, Firefox, senza confondere il mouseup (e senza JQuery).

inputElement.addEventListener("focus", function (e) {
    var target = e.currentTarget;
    if (target) {
        target.select();
        target.addEventListener("mouseup", function _tempoMouseUp(event) {
            event.preventDefault();
            target.removeEventListener("mouseup", _tempoMouseUp);
        });
    }
});

sì, ma se focuseffettui la tabulazione nel campo, troverai più ascoltatori di eventi mouseup collegati ...
Sebastian Scholle

-1

La mia soluzione è la prossima:

var mouseUp;
$(document).ready(function() {
    $(inputSelector).focus(function() {
        this.select();
    }) 
    .mousedown(function () {
        if ($(this).is(":focus")) {
          mouseUp = true;
        }
        else {
          mouseUp = false;
        }
     })
     .mouseup(function () {
        return mouseUp;
     });
});

Quindi il mouseup funzionerà normalmente, ma non farà deselezionare dopo aver ottenuto lo stato attivo per input

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.