J'ai lu les articles ici, le site Bootstrap et Googled comme un fou - mais je ne trouve pas que je suis sûr que c'est une réponse facile ...
J'ai un modal Bootstrap que j'ouvre à partir d'un assistant link_to comme celui-ci:
<%= link_to "New Contact", new_contact_path, {remote: true, 'data-toggle' => 'modal', 'data-target' => "#myModal", class: "btn btn-primary"} %>
Dans mon ContactsController.create
action, j'ai du code qui crée Contact
puis passe à create.js.erb
. Dans create.js.erb
, j'ai du code de gestion des erreurs (un mélange de rubis et de javascript). Si tout se passe bien, je veux fermer le modal.
C'est là que j'ai des problèmes. Je n'arrive pas à rejeter le modal quand tout va bien.
J'ai essayé $('#myModal').modal('hide');
et cela n'a aucun effet. J'ai également essayé $('#myModal').hide();
ce qui provoque le rejet du modal mais laisse la toile de fond.
Des conseils sur la façon de fermer le modal et / ou de supprimer le fond de l'intérieur create.js.erb
?
Éditer
Voici le balisage pour myModal:
<div class="modal hide" id="myModal" >
<div class="modal-header">
<a class="close" data-dismiss="modal">×</a>
<h3>Add Contact</h3>
<div id="errors_notification">
</div>
</div>
<div class="modal-body">
<%= form_for :contact, url: contacts_path, remote: true do |f| %>
<%= f.text_field :first_name, placeholder: "first name" %>
<%= f.text_field :last_name, placeholder: "last name" %>
<br>
<%= f.submit "Save", name: 'save', class: "btn btn-primary" %>
<a class="close btn" data-dismiss="modal">Cancel</a>
<% end %>
</div>
<div class="modal-footer">
</div>
</div>
la source
$('#myModal').modal('hide');
est la syntaxe correcte pour fermer / masquer le modal avec idmyModal
(vous pouvez le tester sur la page de documentation Bootstrap ). Êtes-vous sûr d'avoir un élément avec cet identifiant sur votre page? Aussi, qu'essayez-vous d'accomplir avec cet appel? Votre implémentation actuelle exécute une requête Ajax pournew_contact_path
et en même temps ouvre le modal avec le contenu de#myModal
- est-ce ce que vous voulez?myModal
. J'ai réessayé$('myModal').modal('hide')
et toujours pas bon. HM. En termes de ce que j'essaie d'accomplir, je pense qu'il peut être incorrect d'utiliser l'aide link_to. J'ai remplacé cela par:<a data-toggle="modal" href="#myModal" class="btn btn-primary">Add Contact</a>
puisque je n'ai pas vraiment besoin d'un appel ànew_contact_path
. Je veux juste que le modal s'ouvre, puis traite les entrées utilisateur. Merci de prendre le temps de répondre. Je vais voir si je ne peux pas régler ça.$('#myModal').modal('hide');
(il#
manque un commentaire).$('#myModal').modal('hide')
. JRéponses:
Avec le modal ouvert dans la fenêtre du navigateur, utilisez la console du navigateur pour essayer
Si cela fonctionne (et que le modal se ferme), vous savez que votre Javascript proche n'est pas envoyé correctement du serveur au navigateur.
Si cela ne fonctionne pas, vous devez enquêter davantage sur le client. Par exemple, assurez-vous qu'il n'y a pas deux éléments avec le même identifiant. Par exemple, cela fonctionne-t-il la première fois après le chargement de la page mais pas la deuxième fois?
Console du navigateur: firebug pour firefox, la console de débogage pour Chrome ou Safari, etc.
la source
pour fermer bootstrap modal, vous pouvez passer 'hide' comme option à la méthode modale comme suit
Veuillez jeter un œil au violon de travail ici
bootstrap fournit également des événements que vous pouvez connecter à la fonctionnalité modale , comme si vous souhaitez déclencher un événement lorsque le modal a fini d'être masqué à l'utilisateur, vous pouvez utiliser l' événement hidden.bs.modal , vous pouvez en savoir plus sur les méthodes et événements modaux ici dans Documentation
Si aucune des méthodes ci-dessus ne fonctionne, donnez un identifiant à votre bouton de fermeture et déclenchez un clic sur le bouton de fermeture.
la source
J'utilise Bootstrap 3.4 Pour moi, cela ne fonctionne pas
$('#myModal').modal('hide')
En désespoir de cause, je l'ai fait:
Ce n'est peut-être pas élégant, mais ça marche
la source
La meilleure forme pour cacher et montrer un modal avec bootstrap c'est
la source
Je rencontrais cette même erreur et cette ligne de code m'aide vraiment.
la source
la source
J'ai trouvé la bonne solution, vous pouvez utiliser ce code
la source
Je suis tombé sur ce que je pense être un problème similaire. Le
$('#myModal').modal('hide');
passe probablement par cette fonction et atteint la ligneLe problème est que la valeur isShown peut être indéfinie même si le modal est affiché et que la valeur doit être vraie. J'ai légèrement modifié le code d'amorçage comme suit
Cela semblait résoudre le problème pour la plupart. Si la toile de fond persiste, vous pouvez toujours ajouter un appel pour le supprimer manuellement après l'appel masqué
$('.modal-backdrop').remove();
. Pas idéal du tout mais fonctionne.la source
( Se référant à Bootstrap 3), Pour masquer l'utilisation modale:
$('#modal').modal('hide')
. Mais la raison pour laquelle la toile de fond traînait (pour moi) était parce que je détruisais le DOM pour le modal avant la fin de la «dissimulation».Pour résoudre ce problème, j'ai enchaîné l'événement masqué avec la suppression DOM. Dans mon cas:
this.render()
la source
this.render()
son affichageundefined is not a function
dans ma console chromée.J'ai eu plus de chance de passer l'appel après le rappel "affiché":
Cela a permis de s'assurer que le modal était terminé avant l'appel de hide ().
la source
Nous avons constaté qu'il y avait juste un léger délai entre l'appel à notre code serveur et le retour au succès. Si nous encapsulions l'appel au serveur dans le
$("#myModal").on('hidden.bs.modal', function (e)
gestionnaire, puis appelions la$("#myModal").modal("hide");
méthode, le navigateur masquerait le modal, puis invoquerait le code côté serveur.Encore une fois, pas élégant mais fonctionnel.
Comme vous pouvez le voir, lorsque
myFunc
est invoqué, il masquera le modal, puis invoquera le code côté serveur.la source
Je rencontrais le même problème et après un peu d'expérimentation, j'ai trouvé une solution. Dans mon gestionnaire de clics, je devais empêcher l'événement de se propager, comme ceci:
la source
Voici le doc: http://getbootstrap.com/javascript/#modals-methods
Voici la méthode: $ ('# myModal'). Modal ('hide')
Si vous avez besoin d'ouvrir plusieurs fois le modal avec un contenu différent, je vous suggère d'ajouter (en vous js principaux):
Vous nettoierez donc le contenu pour la prochaine ouverture et éviterez une sorte de mise en cache
la source
la source
Même moi, j'ai le même genre de problèmes. Cela m'a beaucoup aidé
la source
J'ai utilisé ce code simple:
la source
$('#modal').modal('hide');
et ses variantes ne fonctionnaient pas pour moi, sauf si j'avaisdata-dismiss="modal"
comme attribut sur le bouton Annuler. Comme vous, mes besoins étaient probablement de fermer / éventuellement de ne pas fermer en fonction d'une logique supplémentaire, donc cliquer sur un lien avecdata-dismiss="modal"
carrément ne ferait pas l'affaire. J'ai fini par avoir un bouton caché avecdata-dismiss="modal"
lequel je pouvais invoquer par programme le gestionnaire de clics, doncpuis à l'intérieur des gestionnaires de clic pour annuler lorsque vous devez fermer le modal que vous pouvez avoir
la source
Nous devons nous occuper du bouillonnement des événements. Besoin d'ajouter une ligne de code
la source
Je me rends compte que c'est une vieille question, mais j'ai trouvé qu'aucun de ceux-ci n'était vraiment ce que je cherchais exactement. Cela semble provenir de la tentative de fermeture du modal avant qu'il ne soit terminé.
Ma solution était basée sur la réponse de @ schoonie23 mais j'ai dû changer certaines choses.
Tout d'abord, j'ai déclaré une variable globale en haut de mon script:
Puis dans mon code modal:
Ensuite, ceci: (Notez le nom 'shown.bs.modal' indiquant que le modal s'est affiché complètement par opposition à 'show' qui se déclenche lorsque l'événement show est appelé. (J'ai essayé à l'origine juste 'montré' mais cela n'a pas fonctionné. )
J'espère que cela épargnera à quelqu'un la recherche supplémentaire un jour. J'ai passé un peu de temps à chercher une solution avant d'en arriver là.
la source
J'ai utilisé ce code -
Masquer le modal avec un effet lisse à l'aide de Fade Out.
la source
Si vous utilisez la classe close dans vos modaux, ce qui suit fonctionnera. En fonction de votre cas d'utilisation, je recommande généralement de filtrer uniquement le modal visible s'il y a plus d'un modal avec la classe proche.
la source
document.getElementById ('closeButton'). click (); // ajoute un attribut data-disable = "modal" à un élément du modal et lui donne cet id
la source
C'est la mauvaise pratique mais vous pouvez utiliser cette technique pour fermer le modal en appelant le bouton de fermeture en javascript. Cela fermera modal après 3 secondes.
la source
cela peut être fait en HTML:
la source