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?

Amr Elgarhy
la source
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
Copie possible du focus du champ de saisie modale de bootstrap
Muhammad Rehan Saeed

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();
})
David Taiaroa
la source
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

Tmarois
la source
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);

})
Marcos Furquim
la source
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

Éderson T. Szlachta
la source
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

Amr Elgarhy
la source
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();
});
Junaid Anwar
la source
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')

Phil Hodgson
la source
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();
Jitesh Tukadiya
la source
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();
    });
});
Fendi Septiawan
la source
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();
})
Gabriel Rodrigues
la source
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();
});
Hassan ALAMI
la source
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
DanCZ
la source
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 .

Pathik
la source
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 .

haineux
la source
0

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

$('.modal').on('shown.bs.modal', function() {
  $(this).find('[autofocus]').focus();
});
gal007
la source
-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

Jenrry Leguia
la source