input jquery selezionare tutto a fuoco


327

Sto usando questo codice per provare a selezionare tutto il testo nel campo quando un utente si concentra sul campo. Quello che succede è che seleziona tutto per un secondo, quindi viene deselezionato e il cursore di digitazione viene lasciato dove ho fatto clic ...

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

Voglio che tutto rimanga selezionato.


Quale browser, sembra funzionare bene per me in FF?
R0MANARMY,

8
Chrome = fallito per questo
wowo_999

1
Stavo usando Chrome, ma .click () risolve il problema :)
Tim

4
Nota: la risposta accettata qui risolve solo metà del problema. Fa funzionare la selezione, ma rende difficile poi deselezionarla con i clic successivi. Una soluzione migliore è disponibile qui: stackoverflow.com/questions/3380458/…
DSC

Risposte:


481

Prova a usare clickinvece di focus. Sembra funzionare sia per gli eventi del mouse che per quelli chiave (almeno su Chrome / Mac):

jQuery <versione 1.7:

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

jQuery versione 1.7+:

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

Ecco una demo


62
il problema è che non è più possibile selezionare parte del testo con il mouse, una volta che si fa clic, viene selezionato il testo completo.
Helin Wang,

6
Non è una soluzione praticabile per me. Questo crea il problema descritto da Wang.
Marquez,

1
Di seguito c'è una soluzione di Nianpeng che funziona anche con la selezione del testo del mouse.
Philibert Perusse,

4
@AwQiruiGuo $ .fn.on ('click', ..) può usare meno memoria e lavorare per elementi figlio aggiunti dinamicamente.
Ricky Boyce,

7
Questo non funziona per mettere a fuoco un campo durante la tabulazione.
Colin Breame,

65

Penso che ciò che accade sia questo:

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

Una soluzione alternativa potrebbe essere chiamare select () in modo asincrono, in modo che venga eseguito completamente dopo focus ():

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

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

@etienne: Oh, buon punto: la gestione di thisè un po 'inaspettata in tali ambiti. Aggiornerò il codice.
Piskvor lasciò l'edificio il

3
un valore di timeout di 0 sembra ok e anche la funzione "focusin ()" funziona con questo metodo.
Tanguy,

4
sì, non è nemmeno necessario impostare un periodo. 0 andrà bene poiché i timeout vengono eseguiti alla fine dello stack di chiamate corrente. questo significa che gli eventi focus e click si attivano e quindi la tua funzione viene eseguita
Joshua Bambrick,

1
Timeout 0 sembra avere il problema che l'evento 'click' può attivarsi in un frame successivo, deselezionando nuovamente la casella. Trovo che il timeout 10 sembra funzionare abbastanza bene - nessun ritardo evidente, ma più affidabile di 0.
phil

57

Penso che questa sia la soluzione migliore. A differenza della semplice selezione nell'evento onclick, non impedisce la selezione / modifica del testo con il mouse. Funziona con i principali motori di rendering tra cui IE8.

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

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


4
Funziona solo con i campi esistenti, ecco un aggiornamento per associarlo a nuovi campi di input: jsfiddle.net
adriaan,

A volte il focus può essere dato senza un clic, e questo lo gestisce bene. Per questo
motivo

Ciò non consente un secondo clic all'interno degli input numerici per selezionare un'altra parte del testo con il mouse. La rimozione del secondo select()sembra funzionare però.
dperish

Ancora meglio con un altro$('input[autofocus]').select();
Daniel Bleisteiner

38

Ci sono alcune risposte decenti qui e quella di @ user2072367 è la mia preferita, ma ha un risultato inaspettato quando ti concentri tramite la scheda anziché tramite il clic. (risultato imprevisto: per selezionare il testo normalmente dopo lo stato attivo tramite la scheda, è necessario fare clic un'altra volta)

Questo violino risolve quel piccolo bug e memorizza inoltre $ (questo) in una variabile per evitare la selezione DOM ridondante. Controlla! (:

Testato in IE> 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 Le tue soluzioni @ e user2072367 sono le più pulite in tutto questo thread e vorrei che ci fosse un modo per ottenere il massimo più velocemente.
KyleMit,

1
Funziona anche se l'utente prova a selezionare tutto il testo da solo, bravo.
Vitani,

Per me questo non funziona su ie11 su Windows 8.1. Funziona in ie11 su Windows 7 e Windows 10
Lars Thomas Bredland,

1
@LarsThomasBredland Ho appena provato a vincere 8.1 + ie11 e funziona come previsto. Cosa "non funziona" al riguardo per te?
animatedgif l'

Semplicemente non seleziona nulla. (Ho provato su un'altra Win8 e funziona lì - stesso livello di sistema operativo e cioè versione)
Lars Thomas Bredland

21

Dopo un'attenta revisione, propongo questo come una soluzione molto più pulita all'interno di questo thread:

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

Demo in jsFiddle

Il problema:

Ecco un po 'di spiegazione:

Innanzitutto, diamo un'occhiata all'ordine degli eventi quando si passa con il mouse o la scheda in un campo.
Possiamo registrare tutti gli eventi rilevanti come questo:

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

eventi di messa a fuoco

Nota : ho modificato questa soluzione per usarla clickpiuttosto che mouseupcome accade più tardi nella pipeline degli eventi e sembra che stia causando alcuni problemi in Firefox come da commento di @ Jocie

Alcuni browser tentano di posizionare il cursore durante gli eventi mouseupo click. Questo ha senso poiché potresti voler avviare il cursore in una posizione e trascinare per evidenziare del testo. Non può fare una designazione sulla posizione del cursore fino a quando non si è effettivamente sollevato il mouse. Quindi le funzioni che gestiscono focussono destinate a rispondere troppo presto, lasciando che il browser prevalga sul posizionamento.

Ma il problema è che vogliamo davvero gestire l'evento focus. Ci fa sapere la prima volta che qualcuno è entrato nel campo. Successivamente, non vogliamo continuare a ignorare il comportamento di selezione dell'utente.

La soluzione:

Invece, all'interno del focusgestore eventi, possiamo collegare rapidamente listener per gli eventi click(clic in) e keyup(tab in) che stanno per essere attivati.

Nota : il keyup di un evento tab verrà effettivamente attivato nel nuovo campo di input, non in quello precedente

Vogliamo lanciare l'evento una volta sola. Potremmo usare .one("click keyup), ma questo chiamerebbe il gestore eventi una volta per ogni tipo di evento . Invece, non appena si preme il mouse o il keyup chiameremo la nostra funzione. La prima cosa che faremo è rimuovere i gestori per entrambi. In questo modo, non importa se abbiamo inserito il tab o ci siamo sistemati. La funzione dovrebbe essere eseguita esattamente una volta.

Nota : la maggior parte dei browser seleziona naturalmente tutto il testo durante un evento di tabulazione, ma come sottolineato da animatedgif , vogliamo ancora gestire l' keyupevento, altrimenti l' mouseupevento continuerà a persistere ogni volta che abbiamo inserito il tab. Ascoltiamo entrambi in modo da poter girare dagli ascoltatori non appena abbiamo elaborato la selezione.

Ora possiamo chiamare select()dopo che il browser ha effettuato la sua selezione, quindi siamo sicuri di ignorare il comportamento predefinito.

Infine, per una maggiore protezione, possiamo aggiungere spazi dei nomi degli eventi alle funzioni mouseupe in keyupmodo che il .off()metodo non rimuova altri ascoltatori che potrebbero essere in riproduzione.


Testato in IE 10+, FF 28+ e Chrome 35+


In alternativa, se si desidera estendere jQuery con una funzione chiamata onceche si attiverà esattamente una volta per qualsiasi numero di eventi :

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

Quindi puoi semplificare ulteriormente il codice in questo modo:

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

Demo in violino


In Firefox 31 su Windows il tuo codice seleziona il testo su ogni altro clic quando fai clic tra le due caselle di testo
Vitani,

1
@Jocie, non sono sicuro del motivo per cui si sta alternando, ma sembra che FF gestisca la selezione del testo clicknell'evento che è più in basso della pipeline di mouseup. Dal momento che vogliamo gestire la fine della selezione il più tardi possibile per darci la maggior possibilità di sovrascrivere il browser, usare il clic anziché il mouse dovrebbe fare il trucco. Testato in FF, Chrome e IE.
KyleMit,

1
Grazie! Finalmente una soluzione che funziona davvero e in tutti i browser!
Vincent,

1
Sì! Questo ha funzionato anche per me! Grazie. Questa avrebbe dovuto essere la risposta ufficiale
Fandango68,

1
@RiZKiT, onenon lo taglierà come "Il gestore viene eseguito una volta per elemento per tipo di evento . Disattiverà automaticamente l'evento che lo ha generato, ma l'altro continuerà a persistere e si offprenderà cura di entrambi comunque. Vedi il mio domanda: funzione che si attiverà esattamente una volta per qualsiasi numero di eventi
KyleMit,

13

Ciò farebbe il lavoro ed eviterebbe il problema che non è più possibile selezionare parte del testo con il mouse.

$("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
Importante per mantenere la capacità di selezionare parte del testo con il mouse. Sto usando questo e il suo A1
Philibert Perusse il

2
Troppe cose qui, usa la soluzione focus / mouseup di user2072367
George

@George user2072367 è abbastanza buono, ma ha alcuni gravi difetti. Scopri la mia soluzione (:
animatedgif

6

Questa versione funziona su iOS e corregge anche il trascinamento per selezionare standard su Windows Chrome

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/


Modificato per aggiungere brutti tentativi / catture per placare i browser
anihilnine

5

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.

L' onmouseupevento cambia la posizione del cursore all'interno del campo, che viene attivato dopo onfocus(almeno all'interno di Chrome e FF). Se lo elimini incondizionatamente, mouseupl'utente non può modificare la posizione del cursore con il mouse.

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

Il codice impedirà in modo condizionale il mouseupcomportamento predefinito se il campo non è attualmente attivo. Funziona per questi casi:

  • facendo clic quando il campo non è attivo
  • facendo clic su quando il campo è attivo
  • tab nel campo

Ho provato questo in Chrome 31, FF 26 e IE 11.


Funziona perfettamente per gli eventi click, ma se uso tab per passare al campo di input successivo vedo che il contenuto viene selezionato e
deselezionato

4

Ho trovato un'ottima soluzione leggendo questa discussione

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

... che è essenzialmente la stessa risposta di Piskvor .
Oliver,

non dimenticare tutti gli altri tipi di testo HTML5, ad esempio "input [type = email]"
jamiebarrow,

3

Vengo dalla fine del 2016 e questo codice funziona solo nelle versioni recenti di jquery (jquery-2.1.3.js in questo caso).

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

2

usando FF 16.0.2 e jquery 1.8.3, tutto il codice nella risposta non ha funzionato.
Uso il codice in questo modo e lavoro.

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

4
Questo non risponde alla domanda, ovvero come selezionare il contenuto di una casella di input quando l'utente focalizza il campo . Questo focalizzerà immediatamente e selezionerà il codice, senza input dell'utente.
salsiccia

@saluce non capisco cosa intendi? ciò che l'interrogante desidera è quando seleziona il campo, viene selezionato tutto il testo corrente. E il mio codice dovrebbe farlo. Lo uso persino per il mio progetto, come quando scrivo questa risposta.
GusDeCooL,

1
Questo codice si concentrerà e selezionerà tutto quando viene eseguito, ma il codice, in sé e per sé, non è legato a un evento generato dall'utente , come fare clic sulla casella di testo. Ad esempio, $("input[type=text]").on('click', function () { $(this).focus.select(); })sta causando lo stato attivo e selezionando l'esecuzione quando l'utente fa clic sulla casella, poiché viene eseguito quando l'utente fa clic sulla casella. Senza il gestore eventi, il codice non risponde alla domanda, quindi il downvote e il commento. Fondamentalmente, hai ottenuto la parte "tutto il testo corrente è selezionato" ma non la parte "quando seleziona il campo".
salsiccia

1
@GusDeCooL abbastanza stranamente (anche se non è esattamente quello che ha chiesto) Volevo lo stesso risultato che hai fatto su questo :)
Robbie Averill

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

Utilizzare clearTimeout per maggiore sicurezza se si passa rapidamente tra due input. ClearTimeout pulisce il vecchio timeout ...


Modifica con ulteriori informazioni. Le risposte di solo codice e "prova questo" sono scoraggiate, perché non contengono contenuti ricercabili e non spiegano perché qualcuno dovrebbe "provare questo". Facciamo uno sforzo qui per essere una risorsa per la conoscenza.
Brian Tompsett - 莱恩 莱恩

2

Funziona alla grande con JavaScript nativo select().

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

o in generale:

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

1

Oppure puoi semplicemente usare <input onclick="select()">Works perfetto.


no non lo fa. funziona per selezionare il tutto. ma prova a selezionare manualmente una parte del testo, non sarai in grado di farlo.
Sujay Phadke,


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

Probabilmente questa sarà contrassegnata come una risposta di bassa qualità perché non ha alcuna spiegazione di ciò che sta accadendo.
tumultous_rooster

Il tuo $.readynon è corretto. È necessario passargli una funzione per ritardare il completamento attrdel documento. Lo stai facendo immediatamente, quindi passando la raccolta di elementi a $.ready.
doug65536,

Inoltre, evitare "onclick", in particolare in questo modo. Usa addEventListener.
doug65536,

0

Uso sempre requestAnimationFrame()per saltare i meccanismi interni post-evento e questo funziona perfettamente in Firefox. Non ho testato in Chrome.

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