Cómo establecer el foco para un campo en particular en un modal de Bootstrap, una vez que aparece


He visto un par de preguntas con respecto a los modales de arranque, pero ninguno exactamente como este, así que voy a seguir adelante.

Tengo un modal que llamo onclick así...

$(".modal-link").click(function(event){
  $("#modal-content").modal('show');
});

Esto funciona bien, pero cuando muestro el modal quiero centrarme en el primer elemento de entrada... En caso de que el primer elemento de entrada tenga un id de # photo_name.

Así que lo intenté

   $(".modal-link").click(function(event){
     $("#modal-content").modal('show');
     $("input#photo_name").focus();
   });

Pero esto fue en vano. Por último, intenté unirme al evento 'show', pero aún así, la entrada no se enfocará. Por último, solo para probar, ya que tenía una suspiscion se trata de la orden de carga js, puse en un setTimeout solo para ver si retraso un segundo, el trabajo de enfoque, y sí, funciona! Pero este método es obviamente una mierda. ¿Hay alguna manera de tener el mismo efecto que se muestra a continuación sin usar un setTimeout?

  $("#modal-content").on('show', function(event){
    window.setTimeout(function(){
      $(event.currentTarget).find('input#photo_name').first().focus()
    }, 0500);
  });
Author: ryanpcmcquen, 2012-08-30

11 answers

Prueba esto

Aquí está el viejo DEMO:

EDITAR: (Aquí está un trabajo DEMO con Bootstrap 3 y jQuery 1.8.3)

$(document).ready(function() {
    $('#modal-content').modal('show');
    $('#modal-content').on('shown', function() {
        $("#txtname").focus();
    })
});

Iniciar bootstrap 3 necesita usar el evento shown.bs.modal:

$('#modal-content').on('shown.bs.modal', function() {
    $("#txtname").focus();
})
 365
Author: gaurang171,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-29 20:44:38

Solo quería decir que Bootstrap 3 maneja esto de manera un poco diferente. El nombre del evento es "shown.bs.modal".

$('#themodal').on('shown.bs.modal', function () {
   $("#txtname").focus();
});

O poner el foco en la primera entrada visible de esta manera:

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

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

 75
Author: David Beck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-07 20:19:48

Estoy usando esto en mi diseño para capturar todos los modales y enfocarme en la primera entrada

  $('.modal').on('shown', function() {
     $(this).find('input').focus();
  });
 9
Author: Joe Beams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-31 15:19:23

Tuve el mismo problema con bootstrap 3, enfocarme cuando hago clic en el enlace, pero no cuando disparo el evento con javascript. La solución:

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

Probablemente es algo acerca de la animación!

 9
Author: Alejandro Fiore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-05 14:19:51

Tuve problemas para capturar el evento "shown.bs.modal".. Y esta es mi solución que funciona perfectamente..

En lugar de simple on ():

$('#modal').on 'shown.bs.modal', ->

Use on () con elemento delegado:

$('body').on 'shown.bs.modal', '#modal', ->
 8
Author: Michal Macejko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-08 22:12:08

Parece que es porque la animación modal está habilitada (fade en la clase del diálogo), después de llamar a .modal('show'), el diálogo no es visible inmediatamente, por lo que no puede obtener el enfoque en este momento.

Se me ocurren dos maneras de resolver este problema:

  1. Remove fade from class, por lo que el diálogo es visible inmediatamente después de llamar a .modal('show'). Puedes ver http://codebins.com/bin/4ldqp7x/4 para demo. (Lo siento @ keyur, por error edité y guardé como nueva versión de su ejemplo)
  2. Llama a focus() en el evento shown como lo que escribió @keyur.
 6
Author: SAPikachu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-30 06:08:18

He creado una forma dinámica de llamar a cada evento automáticamente. Es perfecto para enfocar un campo, ya que llama al evento solo una vez, quitándolo después de su uso.

function modalEvents() {
    var modal = $('#modal');
    var events = ['show', 'shown', 'hide', 'hidden'];

    $(events).each(function (index, event) {
        modal.on(event + '.bs.modal', function (e) {
            var callback = modal.data(event + '-callback');
            if (typeof callback != 'undefined') {
                callback.call();
                modal.removeData(event + '-callback');
            }
        });
    });
}

Solo tiene que llamar a modalEvents() en el documento listo.

Uso:

$('#modal').data('show-callback', function() {
    $("input#photo_name").focus();
});

Por lo tanto, puede usar el mismo modal para cargar lo que desea sin preocuparse por eliminar eventos cada vez.

 3
Author: Danilo Colasso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-19 20:19:05

Tuve el mismo problema con el bootstrap 3 y resuelto así:

$('#myModal').on('shown.bs.modal', function (e) {
    $(this).find('input[type=text]:visible:first').focus();
})

$('#myModal').modal('show').trigger('shown');
 2
Author: edercortes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-24 02:20:54

Bootstrap ha añadido un evento cargado.

Https://getbootstrap.com/docs/3.3/javascript/#modals

Captura el evento' loaded.bs.modal ' en el modal

$('#mymodal').on('loaded.bs.modal', function(e) {
  // do cool stuff here all day… no need to change bootstrap
})
 0
Author: bharat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-20 11:39:20

Bootstrap modal show event

$('#modal-content').on('show.bs.modal', function() {
$("#txtname").focus();

})

 0
Author: AdminDev826,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-21 14:23:09

Una solución un poco más limpia y modular podría ser:

$(document).ready(function(){
    $('.modal').success(function() { 
        $('input:text:visible:first').focus();
    });  
});

O usando su ID como ejemplo en su lugar:

$(document).ready(function(){
    $('#modal-content').modal('show').success(function() {
        $('input:text:visible:first').focus();
    });  
});

Espero que eso ayude..

 -1
Author: revive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 19:43:20