$ .focus () non funziona


155

L' ultimo esempio deglifocus() stati della documentazione di jQuery

$('#id').focus()

dovrebbe rendere l'input focalizzato (attivo). Non riesco a farlo funzionare.

Anche nella console di questo sito, lo sto provando per la casella di ricerca

$('input[name="q"]').focus()

e non ricevo niente. Qualche idea?


2
Puoi mostrarci il tuo codice?
Adil,

Dovremo saperne di più, perché funziona bene per me: jsfiddle.net/G7hwR/1 basta fare clic in un punto qualsiasi del riquadro destro e si concentra ...
Rob G

L'attenzione su questa pagina non dovrebbe funzionare, però? Lo snippet che ho fornito?
Sam Selikoff

Dipende da cosa è contenuto; se non è all'interno di qualcosa, è probabile che venga eseguito prima che la pagina venga visualizzata anche ...
Rob G

Per chi viene qui dalla ricerca: gli strumenti di sviluppo integrati nel browser potrebbero interferire con la focus()funzionalità. Maggiori informazioni
aexl

Risposte:


392

In realtà l'esempio che hai dato per concentrarti su questo sito funziona bene, purché non ti concentri sulla console. Il motivo per cui non funziona è semplicemente perché non sta rubando il focus dalla console di sviluppo. Se esegui il seguente codice nella tua console e fai clic rapidamente nella finestra del browser dopo, vedrai che focalizza la casella di ricerca:

setTimeout(function() { $('input[name="q"]').focus() }, 3000);

Per quanto riguarda l'altro, l'unica cosa che mi ha dato problemi in passato è l'ordine degli eventi. Non puoi chiamare focus () su un elemento che non è stato associato al DOM. L'elemento che stai tentando di mettere a fuoco è già stato collegato al DOM?


1
Grande! Ti ha aiutato con entrambi i tuoi problemi? In tal caso, potresti contrassegnarlo come la risposta corretta? Lo apprezzerei molto: D
Justin Warkentin il

4
non usare gli strumenti di sviluppo quando usano solo $ ('input [name = "q"]'). focus (); o non funziona
Amitābha,

12
Caspita, ho lottato su e giù per questo per mesi, ho appena visto che questo è causato dall'apertura della console per sviluppatori. Il mio lo è sempre. Grazie!
Alex Turpin,

20
+1 per "Non puoi chiamare focus () su un elemento che non è stato associato al DOM." Inoltre, sembra che non puoi chiamarlo su elementi nascosti.
tandrewnichols,

1
L'uso setTimeoutper risolvere i problemi relativi all'ordine delle operazioni lo rende un enorme dolore da mantenere. Se viene visualizzato un bug, è davvero difficile eseguire il debug. Ovunque si inserisca l'elemento nel DOM, dovrebbe chiamarlo .focus()lì.
Kevin Beal,

55

Ho trovato una soluzione altrove in rete ...

$('#id').focus();

non ha funzionato.

$('#id').get(0).focus();

ha funzionato.


4
Ho votato a favore di questa soluzione semplicemente perché ha funzionato per me quando la soluzione più popolare in questa pagina non ha funzionato. ;-)
chriv

La seconda opzione sembra semplicemente afferrare l'elemento dom e utilizzare la normale versione javascript invece della versione jquery.
danielson317,

7
Potrebbe essere che tu abbia più elementi con ID "id" sulla tua pagina? In questo caso il DOM non si interromperà, ma non puoi nemmeno assegnare lo stato
attivo

Ho scoperto che dovevo farlo con un window.setTimeout con un ritardo di 0, e poi tutto va bene. Grazie. Tutto il resto che ho provato è fallito in un bootstrap modale.
Wade Hatler,

23

Alcune delle risposte qui suggeriscono di utilizzare setTimeoutper ritardare il processo di concentrazione sull'elemento target. Uno di questi menziona che l'obiettivo è all'interno di una finestra di dialogo modale. Non posso commentare ulteriormente la correttezza della setTimeoutsoluzione senza conoscere i dettagli specifici di dove è stata utilizzata. Tuttavia, ho pensato che avrei dovuto fornire una risposta qui per aiutare le persone che si imbattono in questo thread proprio come ho fatto io

Il semplice fatto è che non puoi concentrarti su un elemento che non è ancora visibile . Se riscontri questo problema, assicurati che l'obiettivo sia effettivamente visibile quando viene effettuato il tentativo di mettere a fuoco. Nel mio caso stavo facendo qualcosa di simile

$('#elementid').animate({left:0,duration:'slow'});
$('#elementid').focus();

Questo non ha funzionato. Ho solo capito che cosa stava succedendo quando ho eseguito $ ( '# elementID'). Messa a fuoco () `dalla console, che ha fatto il lavoro. La differenza: nel mio codice sopra l'obiettivo non si ha la certezza che l'obiettivo sarà visibile poiché l'animazione potrebbe non essere completa . E qui sta l'indizio

$('#elementid').animate({left:0,duration:'slow',complete:focusFunction});

function focusFunction(){$('#elementid').focus();}

funziona esattamente come previsto. Anch'io avevo inizialmente messo una setTimeoutsoluzione e ha funzionato anche. Tuttavia, un timeout scelto arbitrariamente è destinato a interrompere la soluzione prima o poi a seconda di quanto lentamente il dispositivo host procede nel processo per garantire che l'elemento di destinazione sia visibile.


Il suggerimento rilevante per me era "assicurarsi che l'obiettivo sia effettivamente visibile". questo diventa rilevante quando si cerca di focalizzarsi su elementi resi condizionatamente.
charlie carver,

O quando l'elemento da mettere a fuoco visibility:hidden- non si focalizzerà.
Bakrall,

`non puoi concentrarti su un elemento che non è ancora visibile` - Ti amo. Aggiungendo semplicemente un timeout di 100 ms ho potuto attivare la messa a fuoco sulla mia casella di ricerca nascosta. Grazie!
LuBre,

Attenzione ai timeout. Ciò che funziona sulla tua macchina di sviluppo potrebbe non funzionare su un'altra.
DroidOS

15

se usi bootstrap + modal, questo ha funzionato per me:

  $(myModal).modal('toggle');
  $(myModal).on('shown.bs.modal', function() {
    $('#modalSearchBox').focus()
  });

8

Nel caso in cui qualcun altro si imbattesse in questa domanda e avesse la stessa situazione che avevo - stavo cercando di impostare la messa a fuoco dopo aver fatto clic su un altro elemento, ma la messa a fuoco non sembrava funzionare. Si scopre che avevo solo bisogno di un e.preventDefault();- ecco un esempio:

$('#recipients ul li').mousedown(function(e) {
    // add recipient to list
    ...
    // focus back onto the input
    $('#message_recipient_input').focus();
    // prevent the focus from leaving
    e.preventDefault();
});

Questo ha aiutato:

Se si chiama HTMLElement.focus () da un gestore eventi mousedown, è necessario chiamare event.preventDefault () per evitare che lo stato attivo lasci HTMLElement. Fonte: https://developer.mozilla.org/en/docs/Web/API/HTMLElement/focus


2
L'unico funziona! Il trigger è un div popup, fare clic su nasconde il div e inserire un valore in una casella di testo (non è necessario focalizzare quello). Senza preventDefault, quella casella di testo è sempre focalizzata indipendentemente da
-__-

4

Mi rendo conto che questo è vecchio, ma l'ho trovato oggi. Nessuna delle risposte ha funzionato per me, quello che ho scoperto che ha funzionato era setTimeout. Volevo che il mio focus fosse posto sull'input archiviato di un modale, usando setTimeout funzionava. Spero che questo ti aiuti!


Anch'io! E la durata del timeout ha fatto davvero la differenza. Stupido IE.
eaglei22,

1
Ma non funziona su dispositivi mobili. I browser per dispositivi mobili ignorano nella maggior parte dei casi tutto ciò che è dentro setTimeout
Kosmonaft

1
Come regola generale, l'utilizzo setTimeoutè una cattiva soluzione. Non è possibile garantire i tempi di esecuzione sulla macchina dell'utente, quindi le cose dipendenti dal tempo sono estremamente fragili.
Nathan,

3

Ho avuto anche questo problema. La soluzione che ha funzionato nel mio caso è stata l'utilizzo della proprietà tabindex sull'elemento HTML.

Stavo usando ng-repeatalcuni elementi li all'interno di un elenco e non ero in grado di mettere a fuoco il primo li usando .focus (), quindi ho semplicemente aggiunto l'attributo tabindex a ciascun li durante il ciclo.

così ora <li ng-repeat="user in users track by $index" tabindex="{{$index+1}}"></li>

Quel +1 era indice inizia da 0. Assicurati anche che l'elemento sia presente in DOM prima di chiamare la funzione .focus ()

Spero che aiuti.


2

Per quelli con il problema di non funzionare perché hai usato "$ (element) .show ()". L'ho risolto nel modo seguente:

 var textbox = $("#otherOption");
 textbox.show("fast", function () {
    textbox[0].focus();
  });

Quindi non hai bisogno di un timer, verrà eseguito dopo che il metodo show è stato completato.


Questo vale per qualsiasi altro passaggio: slideDown(), fadeIn(), ecc
Álvaro González

2

Aggiungi un ritardo prima di focus (). 200 ms sono sufficienti

function focusAndCursor(selector){
  var input = $(selector);
  setTimeout(function() {
    // this focus on last character if input isn't empty
    tmp = input.val(); input.focus().val("").blur().focus().val(tmp);
  }, 200);
}

0

Ho avuto di nuovo questo problema proprio ora, e ci crediate o no, tutto quello che dovevo fare era chiudere gli strumenti di sviluppo. Apparentemente la scheda Console ha la priorità sul contenuto della pagina.


0

Assicurati che l'elemento e i suoi genitori siano visibili. Non è possibile utilizzare lo stato attivo su elementi nascosti



-1

Per il mio caso ho dovuto specificare un indice di tabulazione ( -1se focalizzabile solo tramite script)

<div tabindex='-1'>
<!-- ... -->
</div>
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.