Como definir o foco para a primeira entrada de texto em um modal de bootstrap após mostrado


116

Eu carrego um modal de bootstrap dinâmico e contém algumas entradas de texto. O problema que enfrento é que quero que o cursor se concentre na primeira entrada neste modal, e isso não está acontecendo por padrão.
Então, escrevi este código para fazer isso:

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

Mas agora ele se concentra na entrada por um momento e depois desaparece automaticamente, por que isso está acontecendo e como resolver?


2
Você pode fornecer uma demonstração em jsfiddle.net ?
— indefinido

Tente definir um tempo limite para isso, outra coisa pode estar interferindo. setTimeout(function() { /* Your code */ }, 100);
— qwerty

você pode tentar isso para mim ... var index = 0; $ ('# modalContainer'). on ('mostrar', função () {índice = 1;}); if (index) {$ ('input: text: visible: first'). focus (); }
— chirag ghiyad

Respostas:


186

@scumah tem a resposta para você: Twitter bootstrap - concentre-se na textarea dentro de um modal com um clique

Para Bootstrap 2

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

Atualização: Para Bootstrap 3

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

========== Atualizar ======

Em resposta a uma pergunta, você pode usar isso com vários modais na mesma página se especificar diferentes destinos de dados, renomear seus IDs modais para corresponder e atualizar os IDs dos campos de entrada do formulário e, finalmente, atualizar seu JS para corresponder a esses novos IDs:
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();
})

isso funciona apenas se houver um modal na página? e se mais de um?
— Ramesh Pareek

ótima resposta rápida! Cometi um erro bobo, funciona agora!
— Ramesh Pareek

+1 Mudando meu código de "show" para "mostrado" conforme li em sua resposta, depois de quase uma hora tentando fazer isso funcionar.
— Exel Gamboa

Isso dá erro máximo de pilha de chamadas quando a validação do jquery é acionada. Portanto, isso é inútil para mim.
— Vandita

@Vandita, se você quiser começar uma caneta no codepen.io que ilustre o problema que você descreve, ficarei feliz em olhar para você.
— David Taiaroa

80

Achei a melhor maneira de fazer isso, sem jQuery.

<input value="" autofocus>

funciona perfeitamente.

Este é um atributo html5. Suportado por todos os principais navegadores.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input


Depois de passar algumas horas tentando fazer este trabalho como deveria (clique ou nos manipuladores), encontrei apenas um método que funciona, que é o atributo autofocus html5:<input type="text" class="form-control" placeholder="" autofocus>
— lot0logs

1
Aqui está como você pode fazer isso em um controle MVC3: @Html.TextBoxFor(m => m.UserName, new { @autofocus="" })
— Flea

19
Não funcionou para mim ... depois de mostrar o modal de bootstrap a entrada perde o foco
— Diego Cotini

Eu também vejo o foco de ganho de entrada por um momento após o modal bootstrap aparecer ao usar o foco automático. No entanto, a entrada perde o foco. Tive que implementar o manipulador .on ().
— raddevus

7
Isso funciona se você remover tabdindex="-1"do modal, mas só funciona uma vez. Fechar e reabrir não tem foco.
— Memet Olsen

42

A resposta de David Taiaroa está correta, mas não funciona porque o tempo de "fade in" do modal não permite que você defina o foco na entrada. Você precisa criar um atraso:

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

})

2
Você é o único certo aqui. Sua solução é a única que funciona. Tentei definir um valor menor para timeOut, mas não funcionou. Parece que o modal "termina de carregar" em 1000 ms :(
— Enrique

1
sim, mas hoje, no meu novo projeto, usei <input value="" autofocus>e funcionei bem pra mim dessa vez, estranho
— Marcos Furquim

3
O correto é usar o evento mostrado.bs.modal
— Akhorus

2
Em vez de usar setTimeout (), você pode usar delay () como segue ... $ ('# textareaID'). Delay (1000) .focus (). Select ();
— Tony

Definitivamente, a solução de correção.
— Frank Thomas

18

O código usual (abaixo) não funciona para mim:

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

Encontrei a solução :

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

veja mais aqui


9

Recebi que o bootstrap adicionou as seguintes informações na página:

Devido à forma como o HTML5 define sua semântica, o atributo autofocus HTML não tem efeito nos modais do Bootstrap. Para obter o mesmo efeito, use algum JavaScript personalizado:

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

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


7

Este é o código simples que funcionará melhor para você em todos os pop-ups que tenham qualquer campo de entrada com foco

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

4

Acho que a resposta mais correta, assumindo o uso de jQuery, é uma consolidação de aspectos de todas as respostas desta página, mais o uso do evento que o Bootstrap passa:

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

Igualmente trabalharia mudando $(document)para $('.modal')ou para adicionar uma classe para o modal que os sinais de que esse foco deve ocorrer, como$('.modal.focus-on-first-input')


2
Esta é a melhor solução mais geral que já vi aqui :)
— Martin T.

Se você também deseja que ele ignore as caixas de texto somente leitura, modifique a linha para ler: $ ('input: visible: enabled: not ([readonly]): first', e.target) .focus ();
— Douglas Timms

3

tente este código, pode funcionar para você

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

1
Aqui está o que eu uso:$(this).find('input:text').first().focus()
— Jimmy

1

Primeiro passo, você deve definir seu autofocusatributo na entrada do formulário.

<input name="full_name" autofocus/>

E então você tem que adicionar uma declaração para definir o foco automático de sua entrada depois que seu modal for mostrado.
Experimente 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();
    });
});

usei $ (this) .find ('[autofocus]'). focus (); e funciona
— SummerRain

0

Se você deseja focar automaticamente qualquer modal que foi aberto, você pode colocar em seus padrões ou funções lib este trecho que se concentrará na primeira entrada:

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

0

se você estiver procurando por um snippet que funcione para todos os seus modais e procurar automaticamente pelo primeiro texto de entrada no aberto, você deve usar isto:

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

Se o seu modal for carregado usando ajax, use este:

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

0

esta é a solução mais geral

$('body').on('shown.bs.modal', '.modal', function () {
    $(this).find(":input:not(:button):visible:enabled:not([readonly]):first").focus();
});
  • funciona com modais adicionados ao DOM após o carregamento da página
  • funciona com input, textarea, select e não com o botão
  • omite oculto, desativado, somente leitura
  • funciona com modais desbotados, sem necessidade de setInterval

0

Tente remover a propriedade tabIndex do modal , quando sua caixa de entrada / texto estiver aberta. Volte ao que sempre foi , quando você fecha a caixa de entrada / texto. Isso resolveria o problema independentemente da versão do bootstrap e sem comprometer o fluxo de experiência do usuário .


0

De acordo com a documentação do Bootstrap 4:

Devido à forma como o HTML5 define sua semântica, o atributo autofocus HTML não tem efeito nos modais do Bootstrap. Para obter o mesmo efeito, use algum JavaScript personalizado.

Por exemplo:

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

Link .


0

Use o foco automático para pesquisar o elemento de formulário correto:

$('.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();
    })
  });
});
  • É o "#button" que chama o formulário modal,

  • "#mymodal" é a forma modal,

  • "#myinput" é a entrada que você deseja obter foco

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.