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?


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

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();
})

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


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);

})

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í


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


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();
});

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')


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();

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();
    });
});

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();
})

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();
});

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

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 .


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 .


0

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

$('.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();
    })
  });
});
  • Es "#button" el que llama a la forma modal,

  • "#mimodal" es la forma modal,

  • "#myinput" es la entrada que desea enfocar

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.