Comment définir le focus sur la première entrée de texte dans un modal bootstrap après l'affichage


116

Je charge un modal bootstrap dynamique et il contient peu d'entrées de texte. Le problème auquel je suis confronté est que je veux que le curseur se concentre sur la première entrée de ce modal, et cela ne se produit pas par défaut.
J'ai donc écrit ce code pour le faire:

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

Mais maintenant, il se concentre sur l'entrée pendant un moment, puis disparaît automatiquement, pourquoi cela se produit et comment résoudre?


2
Pouvez-vous fournir une démo sur jsfiddle.net ?
undefined

Essayez de définir un délai pour cela, quelque chose d'autre pourrait interférer. setTimeout(function() { /* Your code */ }, 100);
qwerty

pouvez-vous essayer ceci pour moi ... var index = 0; $ ('# modalContainer'). on ('show', function () {index = 1;}); if (index) {$ ('input: text: visible: first'). focus (); }
chirag ghiyad

Réponses:


187

@scumah a la réponse pour vous: Bootstrap Twitter - Focus sur textarea à l'intérieur d'un modal sur clic

Pour Bootstrap 2

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

Mise à jour: pour Bootstrap 3

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

========== Mise à jour ======

En réponse à une question, vous pouvez l'utiliser avec plusieurs modaux sur la même page si vous spécifiez différentes cibles de données, renommez vos identifiants modaux pour qu'ils correspondent et mettez à jour les identifiants des champs de saisie du formulaire, et enfin mettez à jour votre JS pour qu'il corresponde à ces nouveaux ID:
voir 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();
})

cela ne fonctionne que s'il y a un modal sur la page? et si plus d'un?
Ramesh Pareek

super réponse rapide! J'ai fait une erreur stupide, ça marche maintenant!
Ramesh Pareek

+1 Modification de mon code de "afficher" à "affiché" comme je l'ai lu dans votre réponse après presque une heure à essayer de faire fonctionner cela.
Exel Gamboa

Cela donne une erreur de pile d'appels maximale lorsque la validation jquery se déclenche !. Par conséquent, cela ne me sert à rien.
Vandita

@Vandita, si vous voulez créer un stylo sur codepen.io qui illustre le problème que vous décrivez, je serais heureux de l'examiner pour vous.
David Taiaroa

80

J'ai trouvé le meilleur moyen de le faire, sans jQuery.

<input value="" autofocus>

fonctionne parfaitement.

Il s'agit d'un attribut html5. Pris en charge par tous les principaux navigateurs.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input


Après avoir passé quelques heures à essayer d'obtenir ce travail comme il se doit (cliquez sur ou sur les gestionnaires), je n'ai trouvé qu'une seule méthode qui fonctionne, à savoir l'attribut autofocus html5:<input type="text" class="form-control" placeholder="" autofocus>
lots0logs

1
Voici comment vous pouvez le faire sur un contrôle MVC3: @Html.TextBoxFor(m => m.UserName, new { @autofocus="" })
Flea

19
Cela n'a pas fonctionné pour moi ... après avoir montré le mode bootstrap, l'entrée perd le focus
Diego Cotini

Je vois aussi la mise au point du gain d'entrée pendant un moment après l'apparition du mode d'amorçage lors de l'utilisation de la mise au point automatique. Cependant, l'entrée perd alors le focus. J'ai dû implémenter le gestionnaire .on ().
raddevus

7
Cela fonctionne si vous supprimez tabdindex="-1"de votre modal, mais cela ne fonctionne qu'une seule fois. La fermeture et la réouverture ne se concentrent pas.
Memet Olsen

42

La réponse de David Taiaroa est correcte, mais ne fonctionne pas parce que le temps de "fondre" le modal ne vous permet pas de vous concentrer sur l'entrée. Vous devez créer un retard:

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

})

2
Vous êtes le seul ici. Votre solution est la seule qui fonctionne. J'ai essayé de définir une valeur plus petite pour timeOut mais je n'ai pas fonctionné. Semble modal "termine le chargement" à 1000ms :(
Enrique

1
ouais, mais aujourd'hui, dans mon nouveau projet, j'ai bien utilisé <input value="" autofocus>et travaillé pour moi cette fois, étrange
Marcos Furquim

3
Le correct est d'utiliser l'événement shown.bs.modal
Akhorus

2
Au lieu d'utiliser setTimeout (), vous pouvez utiliser delay () comme suit ... $ ('# textareaID'). Delay (1000) .focus (). Select ();
Tony

Certainement la solution de correction.
Frank Thomas le

18

Le code habituel (ci-dessous) ne fonctionne pas pour moi:

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

J'ai trouvé la solution :

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

voir plus ici


9

J'ai eu ce bootstrap ajouté les informations suivantes sur leur page:

En raison de la façon dont HTML5 définit sa sémantique, l'attribut HTML autofocus n'a aucun effet dans les modaux Bootstrap. Pour obtenir le même effet, utilisez du JavaScript personnalisé:

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

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


7

C'est le code simple qui fonctionnera le mieux pour vous sur tous les popups qui ont un champ de saisie avec le focus

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

4

Je pense que la réponse la plus correcte, en supposant l'utilisation de jQuery, est une consolidation des aspects de toutes les réponses de cette page, plus l'utilisation de l'événement que Bootstrap passe:

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

Il travaillerait aussi changer $(document)à $('.modal')ou pour ajouter une classe au modal que les signaux que cette focalisation devrait se produire, comme$('.modal.focus-on-first-input')


2
C'est la meilleure solution, la plus générale que j'ai vue ici :)
Martin T.

Si vous voulez également qu'il ignore les zones de texte en lecture seule, modifiez la ligne pour lire: $ ('input: visible: enabled: not ([readonly]): first', e.target) .focus ();
Douglas Timms

3

essayez ce code, cela pourrait fonctionner pour vous

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

1
Voici ce que j'utilise:$(this).find('input:text').first().focus()
Jimmy

1

Première étape, vous devez définir votre autofocusattribut lors de la saisie du formulaire.

<input name="full_name" autofocus/>

Et puis vous devez ajouter une déclaration pour définir l'autofocus de votre entrée après l'affichage de votre modal.
Essayez ce code:

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

j'ai utilisé $ (this) .find ('[autofocus]'). focus (); et ça marche
SummerRain

0

Si vous voulez simplement mettre au point automatiquement n'importe quel modal qui était ouvert, vous pouvez mettre dans vos modèles ou fonctions lib cet extrait de code qui se concentrera sur la première entrée:

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

0

si vous recherchez un extrait de code qui fonctionnerait pour tous vos modaux et recherchez automatiquement le premier texte d'entrée dans celui ouvert, vous devez utiliser ceci:

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

Si votre modal est chargé en utilisant ajax, utilisez plutôt ceci:

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

0

c'est la solution la plus générale

$('body').on('shown.bs.modal', '.modal', function () {
    $(this).find(":input:not(:button):visible:enabled:not([readonly]):first").focus();
});
  • fonctionne avec les modaux ajoutés au DOM après le chargement de la page
  • fonctionne avec l'entrée, la zone de texte, sélectionnez et non avec le bouton
  • ommits masqués, désactivés, en lecture seule
  • fonctionne avec les modaux fanés, pas besoin de setInterval

0

Essayez de supprimer la propriété tabIndex du modal , lorsque votre entrée / zone de texte est ouverte. Remettez-le à ce qu'il était , lorsque vous fermez l'entrée / la zone de texte. Cela résoudrait le problème quelle que soit la version de bootstrap , et sans compromettre le flux d'expérience utilisateur .


0

Selon la documentation de Bootstrap 4:

En raison de la façon dont HTML5 définit sa sémantique, l'attribut HTML autofocus n'a aucun effet dans les modaux Bootstrap. Pour obtenir le même effet, utilisez du JavaScript personnalisé.

Par exemple:

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

Lien .


0

Utilisez l'autofocus pour rechercher le bon élément de formulaire:

$('.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();
    })
  });
});
  • C'est "#button" qui appelle la forme modale,

  • "#mymodal" est la forme modale,

  • "#myinput" est l'entrée sur laquelle vous souhaitez vous concentrer

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.