J'ai déjà entendu quelques questions sur les modaux bootstrap, mais aucune ne correspond exactement à cela, je vais donc aller de l'avant.
J'ai un modal que j'appelle onclick comme si ...
$(".modal-link").click(function(event){
$("#modal-content").modal('show');
});
Cela fonctionne bien, mais lorsque je montre le modal, je souhaite me concentrer sur le premier élément d'entrée ... Dans le cas où le premier élément d'entrée a l'identifiant #photo_name.
Alors j'ai essayé
$(".modal-link").click(function(event){
$("#modal-content").modal('show');
$("input#photo_name").focus();
});
Mais c'était en vain. Enfin, j'ai essayé de me lier à l'événement 'show' mais malgré cela, l'entrée ne sera pas centrée. Enfin, juste pour tester, comme j’avais une suspicion, c’est à propos de l’ordre de chargement de js, j’ai mis un setTimeout juste pour voir si je retarde une seconde, le focus fonctionnera-t-il et oui, ça marche! Mais cette méthode est évidemment la merde. Existe-t-il un moyen d'avoir le même effet que ci-dessous sans utiliser setTimeout?
$("#modal-content").on('show', function(event){
window.setTimeout(function(){
$(event.currentTarget).find('input#photo_name').first().focus()
}, 0500);
});
Essaye ça
EDIT: (Voici une démo avec Bootstrap 3 et jQuery 1.8.3)
$(document).ready(function() {
$('#modal-content').modal('show');
$('#modal-content').on('shown', function() {
$("#txtname").focus();
})
});
Le démarrage de bootstrap 3 nécessite l’utilisation de l’événement shown.bs.modal:
$('#modal-content').on('shown.bs.modal', function() {
$("#txtname").focus();
})
Je voulais juste dire que Bootstrap 3 gère cela un peu différemment. Le nom de l'événement est "shown.bs.modal".
$('#themodal').on('shown.bs.modal', function () {
$("#txtname").focus();
});
ou mettez l'accent sur la première entrée visible comme ceci:
.modal('show').on('shown.bs.modal', function ()
{
$('input:visible:first').focus();
})
J'utilise ceci dans ma mise en page pour capturer tous les modaux et me concentrer sur la première entrée
$('.modal').on('shown', function() {
$(this).find('input').focus();
});
J'ai eu le même problème avec bootstrap 3, focus quand je clique sur le lien, mais pas quand déclencher l'événement avec JavaScript. La solution:
$('#myModal').on('shown.bs.modal', function () {
setTimeout(function(){
$('#inputId').focus();
}, 100);
});
C'est probablement quelque chose à propos de l'animation!
J'ai eu un problème pour attraper l'événement "shown.bs.modal" .. Et c'est ma solution qui fonctionne parfaitement ..
Au lieu de cela simple sur ():
$('#modal').on 'shown.bs.modal', ->
Utilisez on () avec un élément délégué:
$('body').on 'shown.bs.modal', '#modal', ->
Cela semble être dû au fait que l'animation modale est activée (fade
dans la classe de la boîte de dialogue). Après avoir appelé .modal('show')
, la boîte de dialogue n'est pas immédiatement visible. Elle ne peut donc pas être active pour l'instant.
Je peux penser à deux façons de résoudre ce problème:
fade
de la classe afin que la boîte de dialogue soit immédiatement visible après l'appel de .modal('show')
. Vous pouvez voir http://codebins.com/bin/4ldqp7x/4 pour une démonstration. (Désolé @keyur, j'ai modifié et enregistré par erreur comme nouvelle version de votre exemple)focus()
dans l'événement shown
comme ce que @keyur a écrit.J'ai créé un moyen dynamique d'appeler chaque événement automatiquement. Il est parfait pour concentrer un champ, car il appelle l'événement une seule fois, en le supprimant après utilisation.
function modalEvents() {
var modal = $('#modal');
var events = ['show', 'shown', 'hide', 'hidden'];
$(events).each(function (index, event) {
modal.on(event + '.bs.modal', function (e) {
var callback = modal.data(event + '-callback');
if (typeof callback != 'undefined') {
callback.call();
modal.removeData(event + '-callback');
}
});
});
}
Il vous suffit d'appeler modalEvents()
sur le document prêt.
Utilisation:
$('#modal').data('show-callback', function() {
$("input#photo_name").focus();
});
Ainsi, vous pouvez utiliser le même mode pour charger ce que vous voulez sans vous soucier de supprimer les événements à chaque fois.
J'ai eu le même problème avec le bootstrap 3 et résolu comme ceci:
$('#myModal').on('shown.bs.modal', function (e) {
$(this).find('input[type=text]:visible:first').focus();
})
$('#myModal').modal('show').trigger('shown');
Bootstrap a ajouté un événement chargé.
https://getbootstrap.com/docs/3.3/javascript/#modals
capturer l'événement 'Load.bs.modal' sur le modal
$('#mymodal').on('loaded.bs.modal', function(e) {
// do cool stuff here all day… no need to change bootstrap
})
Spectacle modal bootstrap
$('#modal-content').on('show.bs.modal', function() {
$("#txtname").focus();
})