Cómo establecer el enfoque en la primera entrada de texto en un modal de arranque después de mostrarse

116

Cargué un modal de arranque dinámico y contiene pocas entradas de texto. El problema al que me enfrento es que quiero que el cursor se enfoque en la primera entrada en este modal, y esto no sucede de forma predeterminada.
Así que escribí este código para hacerlo:

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

Pero ahora se enfoca en la entrada por un momento y luego desaparece automáticamente, ¿por qué sucede esto y cómo resolverlo?

Amr Elgarhy
fuente
2
¿Puede proporcionar una demostración en jsfiddle.net ?
indefinido
Intente establecer un tiempo de espera para ello, algo más podría estar interfiriendo. setTimeout(function() { /* Your code */ }, 100);
qwerty
puedes probar esto por mí ... var index = 0; $ ('# modalContainer'). on ('mostrar', función () {índice = 1;}); if (índice) {$ ('input: text: visible: first'). focus (); }
chirag ghiyad
Posible duplicado del foco del campo de entrada modal de bootstrap
Muhammad Rehan Saeed

Respuestas:

187

@scumah tiene la respuesta para usted: Twitter bootstrap - Concéntrese en el área de texto dentro de un modal al hacer clic

Para Bootstrap 2

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

Actualización: para Bootstrap 3

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

========== Actualizar ======

En respuesta a una pregunta, puede usar esto con múltiples modales en la misma página si especifica diferentes objetivos de datos, cambie el nombre de sus ID de modales para que coincidan y actualice los ID de los campos de entrada del formulario y, finalmente, actualice su JS para que coincida con estos nuevos ID:
consulte 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();
})
David Taiaroa
fuente
esto funciona solo si hay un modal en la página? ¿y si más de uno?
Ramesh Pareek
gran respuesta rápida! Cometí un error tonto, ¡funciona ahora!
Ramesh Pareek
+1 Cambiando mi código de "mostrar" a "mostrado" como leí en su respuesta después de casi una hora tratando de que esto funcione.
Exel Gamboa
Esto da un error máximo de pila de llamadas cuando se activa la validación de jquery. Por tanto, esto no me sirve de nada.
Vandita
@Vandita, si quieres iniciar un bolígrafo en codepen.io que ilustre el problema que describes, estaré feliz de verlo por ti.
David Taiaroa
80

Encontré la mejor manera de hacer esto, sin jQuery.

<input value="" autofocus>

funciona perfectamente.

Este es un atributo html5. Compatible con todos los principales navegadores.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input

tmarois
fuente
Después de pasar un par de horas tratando de que esto funcione como debería (haga clic en o en los controladores), encontré solo un método que funciona, que es el atributo de enfoque automático html5:<input type="text" class="form-control" placeholder="" autofocus>
lots0logs
1
Así es como puede hacerlo en un control MVC3: @Html.TextBoxFor(m => m.UserName, new { @autofocus="" })
Flea
19
No me ha funcionado ... después de mostrar el modo de arranque, la entrada pierde el enfoque
Diego Cotini
Yo también veo el enfoque de ganancia de entrada por un momento después de que aparece el modal de arranque cuando se usa el enfoque automático. Sin embargo, la entrada pierde el enfoque. Tuve que implementar el controlador .on ().
raddevus
7
Esto funciona si lo quitas tabdindex="-1"de tu modal, sin embargo, solo funciona una vez. El cierre y la reapertura no se enfocan.
Memet Olsen
42

La respuesta de David Taiaroa es correcta, pero no funciona porque el tiempo para "aparecer" en el modal no le permite establecer el enfoque en la entrada. Necesitas crear un retraso:

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

})
Marcos Furquim
fuente
2
Eres el único aquí. Tu solución es la única que funciona. Traté de establecer un valor más pequeño para timeOut pero no funcionó. Parece que el modo "termina de cargarse" a las 1000 ms :(
Enrique
1
sí, pero hoy, en mi nuevo proyecto, usé <input value="" autofocus>y funcionó bien para mí esta vez, extraño
Marcos Furquim
3
Lo correcto es usar el evento shown.bs.modal
Akhorus
2
En lugar de usar setTimeout (), puede usar delay () como sigue ... $ ('# textareaID'). Delay (1000) .focus (). Select ();
Tony
Definitivamente la solución correctora.
Frank Thomas
18

El código habitual (a continuación) no me funciona:

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

Encontré la solución :

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

ver más aquí

Éderson T. Szlachta
fuente
9

Conseguí que bootstrap agregara la siguiente información en su página:

Debido a cómo HTML5 define su semántica, el atributo HTML de enfoque automático no tiene ningún efecto en los modales de Bootstrap. Para lograr el mismo efecto, use JavaScript personalizado:

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

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

Amr Elgarhy
fuente
7

Este es el código simple que funcionará mejor para usted en todas las ventanas emergentes que tengan cualquier campo de entrada con el enfoque

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

Creo que la respuesta más correcta, asumiendo el uso de jQuery, es una consolidación de aspectos de todas las respuestas en esta página, más el uso del evento que pasa Bootstrap:

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

También trabajaría cambiar $(document)a $('.modal')o para agregar una clase a la modal que las señales que deben producirse este enfoque, al igual$('.modal.focus-on-first-input')

Phil Hodgson
fuente
2
Esta es la mejor y más general solución que he visto aquí :)
Martin T.
Si también desea que ignore los cuadros de texto de solo lectura, modifique la línea para que lea: $ ('input: visible: enabled: not ([readonly]): first', e.target) .focus ();
Douglas Timms
3

prueba este código, podría funcionar para ti

$(this).find('input:text')[0].focus();
Jitesh Tukadiya
fuente
1
Esto es lo que yo uso:$(this).find('input:text').first().focus()
Jimmy
1

El primer paso, debe establecer su autofocusatributo en la entrada del formulario.

<input name="full_name" autofocus/>

Y luego debe agregar una declaración para establecer el enfoque automático de su entrada después de que se muestre su modal.
Prueba este código:

$(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();
    });
});
Fendi Septiawan
fuente
utilicé $ (this) .find ('[autofocus]'). focus (); y funciona
SummerRain
0

Si solo desea enfocar automáticamente cualquier modal que estaba abierto, puede colocar sus patrones o funciones de biblioteca en este fragmento que se enfocará en la primera entrada:

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

Si está buscando un fragmento que funcione para todos sus modales y busque automáticamente el primer texto de entrada en el abierto, debe usar esto:

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

Si su modal se carga usando ajax, use esto en su lugar:

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

esta es la solución más general

$('body').on('shown.bs.modal', '.modal', function () {
    $(this).find(":input:not(:button):visible:enabled:not([readonly]):first").focus();
});
  • funciona con modales agregados a DOM después de la carga de la página
  • funciona con entrada, área de texto, seleccionar y no con botón
  • omite oculto, deshabilitado, solo lectura
  • funciona con modales descoloridos, sin necesidad de setInterval
DanCZ
fuente
0

Intente eliminar la propiedad tabIndex del modal , cuando su input / textbox esté abierto. Vuelva a configurarlo como antes , cuando cierre la entrada / cuadro de texto. Esto resolvería el problema independientemente de la versión de arranque y sin comprometer el flujo de experiencia del usuario .

Pathik
fuente
0

Según los documentos de Bootstrap 4:

Debido a cómo HTML5 define su semántica, el atributo HTML de enfoque automático no tiene ningún efecto en los modales de Bootstrap. Para lograr el mismo efecto, utilice JavaScript personalizado.

P.ej:

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

Enlace .

odio
fuente
0

Utilice el enfoque automático para buscar el elemento de formulario correcto:

$('.modal').on('shown.bs.modal', function() {
  $(this).find('[autofocus]').focus();
});
gal007
fuente
-1
$(document).ready(function() {
  $("#button").click(function() {
    $('#mymodal').on('shown.bs.modal', function() {
      $('#myinput').focus();
    })
  });
});
  • Es "#button" el que llama a la forma modal,

  • "#mimodal" es la forma modal,

  • "#myinput" es la entrada que desea enfocar

Jenrry Leguia
fuente