Come impostare lo stato attivo sul primo input di testo in una modalità bootstrap dopo la visualizzazione


116

Carico un modal bootstrap dinamico e contiene pochi input di testo. Il problema che devo affrontare è che voglio che il cursore si concentri sul primo input in questo modale, e questo non accade per impostazione predefinita.
Quindi ho scritto questo codice per farlo:

$('#modalContainer').on('show', function () {
   $('input:text:visible:first').focus();
});

Ma ora si concentra sull'input per un attimo poi scompare automaticamente, perché sta succedendo e come risolverlo?


2
Potete fornire una demo su jsfiddle.net ?
undefined

Prova a impostare un timeout, qualcos'altro potrebbe interferire. setTimeout(function() { /* Your code */ }, 100);
qwerty

puoi provare questo per me ... var index = 0; $ ('# modalContainer'). on ('show', function () {index = 1;}); if (indice) {$ ('input: text: visible: first'). focus (); }
chirag ghiyad

Risposte:


187

@scumah ha la risposta per te: Bootstrap di Twitter - Concentrati sulla textarea all'interno di una modale al clic

Per Bootstrap 2

modal.$el.on('shown', function () {
$('input:text:visible:first', this).focus();
});  

Aggiornamento: per Bootstrap 3

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

========== Aggiorna ======

In risposta a una domanda, puoi usarlo con più modali sulla stessa pagina se specifichi diversi target di dati, rinomina i tuoi ID modali per abbinare e aggiornare gli ID dei campi di input del modulo e infine aggiorna il tuo JS in modo che corrisponda a questi nuovi ID:
vedere http://jsfiddle.net/panchroma/owtqhpzr/5/

HTML

...
<button ... data-target="#myModal1"> ... </button> 
... 
<!-- Modal 1 -->
<div class="modal fade" id="myModal1" ...>
... 

<div class="modal-body"> <textarea id="textareaID1" ...></textarea></div>

JS

$('#myModal1').on('shown.bs.modal', function() {
  $('#textareaID1').focus();
})

funziona solo se c'è un modale sulla pagina? e se più di uno?
Ramesh Pareek

ottima, rapida risposta! Ho fatto uno stupido errore, ora funziona!
Ramesh Pareek

+1 Cambiando il mio codice da "mostra" a "mostrato" come ho letto nella tua risposta dopo quasi un'ora cercando di farlo funzionare.
Exel Gamboa

Questo fornisce il massimo errore di stack di chiamate quando si attiva la convalida di jquery !. Quindi questo non mi serve.
Vandita

@Vandita, se vuoi avviare una penna su codepen.io che illustri il problema che descrivi sarei felice di esaminarlo per te.
David Taiaroa

80

Ho trovato il modo migliore per farlo, senza jQuery.

<input value="" autofocus>

funziona perfettamente.

Questo è un attributo html5. Supportato da tutti i principali browser.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input


Dopo aver trascorso un paio d'ore cercando di ottenere questo lavoro come dovrebbe (fare clic o su gestori) ho trovato solo un metodo che funziona che è l'attributo autofocus html5:<input type="text" class="form-control" placeholder="" autofocus>
lots0logs

1
Ecco come puoi farlo su un controllo MVC3: @Html.TextBoxFor(m => m.UserName, new { @autofocus="" })
Flea

19
Non ha funzionato per me ... dopo aver mostrato il modal bootstrap l'input perde il focus
Diego Cotini

Anch'io vedo il focus del guadagno di input per un momento dopo che il modale bootstrap appare quando si usa l'autofocus. Tuttavia, l'input perde quindi il focus. Ho dovuto implementare il gestore .on ().
raddevus

7
Funziona se rimuovi tabdindex="-1"dal tuo modale, tuttavia funziona solo una volta. Chiudere e riaprire non si concentra.
Memet Olsen

42

La risposta di David Taiaroa è corretta, ma non funziona perché il tempo per "sfumare" il modale non ti consente di concentrarti sull'input. Devi creare un ritardo:

$('#myModal').on('shown.bs.modal', function () {
    ...
    setTimeout(function (){
        $('#textareaID').focus();
    }, 1000);

})

2
Sei l'unico qui. La tua soluzione è l'unica che funziona. Ho provato a impostare un valore inferiore per timeOut ma non ha funzionato. Sembra modale che "termini il caricamento" a 1000 ms :(
Enrique

1
sì, ma oggi, nel mio nuovo progetto, ho usato <input value="" autofocus>e lavorato bene per me questa volta, strano
Marcos Furquim

3
Il corretto è utilizzare l'evento shows.bs.modal
Akhorus

2
Invece di usare setTimeout (), puoi usare delay () come segue ... $ ('# textareaID'). Delay (1000) .focus (). Select ();
Tony

Sicuramente la soluzione di correzione.
Frank Thomas

18

Il solito codice (sotto) non funziona per me:

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

Ho trovato la soluzione :

$('body').on('shown.bs.modal', '#myModal', function () {
    $('input:visible:enabled:first', this).focus();
})

vedere di più qui


9

Ho ricevuto quel bootstrap che ha aggiunto le seguenti informazioni sulla loro pagina:

A causa del modo in cui HTML5 definisce la sua semantica, l'attributo HTML autofocus non ha effetto nelle modali Bootstrap. Per ottenere lo stesso effetto, utilizza un JavaScript personalizzato:

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

http://getbootstrap.com/javascript/#modals


7

Questo è il codice semplice che funzionerà meglio su tutti i popup che hanno un campo di input con messa a fuoco

$(".modal").on('shown.bs.modal', function () {
    $(this).find("input:visible:first").focus();
});

4

Penso che la risposta più corretta, ipotizzando l'uso di jQuery, sia un consolidamento di aspetti di tutte le risposte in questa pagina, più l'uso dell'evento che Bootstrap passa:

$(document).on('shown.bs.modal', function(e) {
  $('input:visible:enabled:first', e.target).focus();
});

E sarebbe anche lavorare cambiando $(document)per $('.modal')o per aggiungere una classe al modale che i segnali che dovrebbero verificarsi questa attenzione, come$('.modal.focus-on-first-input')


2
Questa è la soluzione migliore e più generale che ho visto qui :)
Martin T.

Se vuoi anche che ignori le caselle di testo di sola lettura, modifica la riga in modo che legga: $ ('input: visible: enabled: not ([readonly]): first', e.target) .focus ();
Douglas Timms

3

prova questo codice, potrebbe funzionare per te

$(this).find('input:text')[0].focus();

1
Ecco cosa uso:$(this).find('input:text').first().focus()
Jimmy

1

Primo passaggio, devi impostare il tuo autofocusattributo sull'input del modulo.

<input name="full_name" autofocus/>

E poi devi aggiungere la dichiarazione per impostare l'autofocus del tuo input dopo che il tuo modale è mostrato.
Prova questo codice:

$(document).on('ready', function(){
    // Set modal form input to autofocus when autofocus attribute is set
    $('.modal').on('shown.bs.modal', function () {
        $(this).find($.attr('autofocus')).focus();
    });
});

ho usato $ (this) .find ('[autofocus]'). focus (); e funziona
SummerRain

0

Se vuoi solo mettere a fuoco automaticamente qualsiasi modale che era aperto, puoi inserire modelli o funzioni lib in questo frammento che si concentrerà sul primo input:

$('.modal').on('shown.bs.modal', function () {
  $(this).find('input:first').focus();
})

0

se stai cercando uno snippet che funzioni per tutti i tuoi modali e cerchi automaticamente il primo testo di input in quello aperto, dovresti usare questo:

$('.modal').on('shown.bs.modal', function () {
    $(this).find( 'input:visible:first').focus();
});

Se il tuo modale viene caricato usando ajax, usa questo invece:

$(document).on('shown.bs.modal', '.modal', function() {
    $(this).find('input:visible:first').focus();
});

0

questa è la soluzione più generale

$('body').on('shown.bs.modal', '.modal', function () {
    $(this).find(":input:not(:button):visible:enabled:not([readonly]):first").focus();
});
  • funziona con le modali aggiunte al DOM dopo il caricamento della pagina
  • funziona con input, textarea, select e non con il pulsante
  • Impegna nascosto, disabilitato, sola lettura
  • funziona con modali sbiaditi, non necessita di setInterval

0

Prova a rimuovere la proprietà tabIndex del modal , quando la tua casella di testo / input è aperta. Riportalo a quello che era mai stato , quando chiudi input / textbox. Ciò risolverebbe il problema indipendentemente dalla versione bootstrap e senza compromettere il flusso dell'esperienza utente .


0

Secondo i documenti di Bootstrap 4:

A causa del modo in cui HTML5 definisce la sua semantica, l'attributo HTML autofocus non ha effetto nelle modali Bootstrap. Per ottenere lo stesso effetto, utilizza JavaScript personalizzato.

Per esempio:

$('#idOfMyModal').on('shown.bs.modal', function () {
    $('input:first').trigger('focus')
});

Link .


0

Usa l'autofocus per cercare l'elemento corretto del modulo:

$('.modal').on('shown.bs.modal', function() {
  $(this).find('[autofocus]').focus();
});

-1
$(document).ready(function() {
  $("#button").click(function() {
    $('#mymodal').on('shown.bs.modal', function() {
      $('#myinput').focus();
    })
  });
});
  • È "#button" che chiama il modulo modale,

  • "#mymodal" è la forma modale,

  • "#myinput" è l'input su cui vuoi mettere a fuoco

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.