Come impostare il focus sul campo di input utilizzando JQuery


106

Data la seguente struttura HTML:

<div class="wrapper">
    <div class="top">
        <a href="http://example.com" class="link">click here</a>
    </div>
    <div class="middle">
        some text
    </div>
    <div class="bottom">
        <form>
            <input type="text" class="post">
            <input type="submit">
        </form>
    </div>
<div>

che verrà ripetuto più volte nella pagina, come imposto il focus sul campo di input nel file .bottom div quando un utente fa clic sul link nel .topdiv?

Attualmente sto realizzando il .bottom apparire correttamente div al clic utilizzando il codice JQuery di seguito, ma non riesco a capire come impostare lo stato attivo sul campo di input allo stesso tempo.

$('.link').click(function() {
    $(this).parent().siblings('div.bottom').show();
});

Grazie!


La tua domanda ha avuto risposta, ma anche: presumo che tu stia eseguendo anche return false;alla fine della richiamata dell'evento? Oppure function(e) { e.preventDefault(); ..... }? In caso contrario, il browser passerà a quella pagina dopo aver eseguito la richiamata.
simshaun

@simshaun vai a quale pagina?
Rolling Stone

Bene, nel tuo esempio, quando fai clic su quel link, verrebbe indirizzato a example.com .
simshaun

oh, è vero, grazie per l'avviso!
Rolling Stone

Risposte:


135

Prova questo per impostare lo stato attivo sul primo campo di input:

$(this).parent().siblings('div.bottom').find("input.post").focus();

1
Spazio tra input& :first. JQuery lo unisce automaticamente? Ho sempre pensato che dovrebbe essere così input:first.
simshaun

Sì, puoi scriverlo in entrambi i modi. Suppongo che input:firstpotrebbe essere il modo più formale per scriverlo, anche se sembra più facile leggerlo nell'altro modo. Ma forse sono solo io :)
Justin Ethier

Immagino che, poiché ci sono così abituato, quando vedo lo spazio penso automaticamente "elemento figlio" e ci vuole un secondo per liberarmi dalla confusione. Ma hey, sono solo io. È bello che funzioni in entrambi i casi.
simshaun

@justin in realtà ho dovuto modificarlo un po 'per farlo funzionare: $(this).parent().siblings('div.bottom').find("input.post").focus();ma .find()è il selettore che stavo cercando. È interessante notare che input :firstné ha input:firstfunzionato.
Rolling Stone

Interessante, probabilmente perché l'input è all'interno di un formtag. Comunque, sono contento che tu vada a lavorare!
Justin Ethier


7

La risposta di Justin non ha funzionato per me (Chromium 18, Firefox 43.0.1). jQuery di.focus() crea visiva, ma il cursore del testo non appare nel campo (jquery 3.1.0).

Ispirato da https://www.sitepoint.com/jqueryhtml5-input-focus-cursor-positions/ , ho aggiunto l' attributo autofocus al campo di input e voilà!

function addfield() {
    n=$('table tr').length;
    $('table').append('<tr><td><input name=field'+n+' autofocus></td><td><input name=value'+n+'></td></tr>');
    $('input[name="aa"'+n+']').focus();
}

1
Ha funzionato per me. La versione più semplice è così: $ ('. Class input'). Focus (); $ ('. class input'). prop ('autofocus');
raison
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.