348 votes

Comment masquer la modale Bootstrap avec javascript ?

J'ai lu les messages ici, le site Bootstrap et j'ai fait des recherches sur Google, mais je n'arrive pas à trouver ce que je pense être une réponse facile...

J'ai une modale Bootstrap que j'ouvre à partir d'une aide link_to comme ceci :

<%= link_to "New Contact", new_contact_path, {remote: true, 'data-toggle' => 'modal', 'data-target' => "#myModal",  class: "btn btn-primary"} %>

Dans mon ContactsController.create j'ai du code qui crée Contact puis passe à create.js.erb . Sur create.js.erb J'ai un code de gestion des erreurs (un mélange de ruby et de javascript). Si tout se passe bien, je veux fermer la modale.

C'est là que j'ai des problèmes. Je ne parviens pas à rejeter la modale lorsque tout va bien.

J'ai essayé $('#myModal').modal('hide'); et cela n'a aucun effet. J'ai également essayé $('#myModal').hide(); qui fait disparaître la modale mais laisse le fond d'écran.

Des conseils sur la manière de fermer la modale et/ou de rejeter la toile de fond depuis l'intérieur. create.js.erb ?

Modifier

Voici le balisage de 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>

2 votes

$('#myModal').modal('hide'); est la syntaxe correcte pour fermer/masquer la modale avec id myModal (vous pouvez tester cela sur le Page de documentation sur Bootstrap ). Êtes-vous sûr d'avoir un élément avec cet id sur votre page ? En outre, qu'essayez-vous d'accomplir avec cet appel ? Votre implémentation actuelle effectue une requête Ajax vers new_contact_path et en même temps ouvre la modale avec le contenu de #myModal - C'est ce que vous voulez ?

0 votes

Salut, Julian. J'ai posté mon balisage duodal ci-dessus et il y a, en effet, une div avec id myModal . J'ai réessayé $('myModal').modal('hide') et toujours rien de bon. HM. En ce qui concerne ce que j'essaie d'accomplir, je pense qu'il était peut-être incorrect d'utiliser l'aide link_to. Je l'ai remplacé 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 simplement que la modale s'ouvre et traite ensuite les entrées de l'utilisateur. Merci d'avoir pris le temps de répondre. Je vais voir si je ne peux pas résoudre ce problème.

0 votes

Je suppose que c'est juste une faute de frappe, mais l'appel devrait être $('#myModal').modal('hide'); (il existe un # manquant dans votre commentaire).

582voto

Larry K Points 16266

Avec la modale ouverte dans la fenêtre du navigateur, utilisez la console du navigateur pour essayer de

$('#myModal').modal('hide');

Si cela fonctionne (et que la modale se ferme), vous savez alors que votre Javascript de fermeture est pas sont envoyés correctement du serveur au navigateur.

Si cela ne fonctionne pas, vous devez examiner de plus près ce qui se passe sur le client. Par exemple, vérifiez 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 ?

La console du navigateur : firebug pour firefox, la console de débogage pour Chrome ou Safari, etc.

0 votes

Le deuxième paragraphe était ce que je cherchais. Les ID en double faisaient que mes modales ne s'affichaient pas correctement la deuxième fois.

0 votes

Cela a réglé le problème pour moi. Merci.

86voto

Subodh Ghulaxe Points 2346

pour fermer le bootstrap modal vous pouvez passer "cacher en option de la méthode modale comme suit

$('#modal').modal('hide');

Veuillez jeter un coup d'œil sur le travail tripoter ici

bootstrap fournit également des événements auxquels vous pouvez vous accrocher. modal par exemple, si vous souhaitez déclencher un événement lorsque la modale a fini d'être masquée à l'utilisateur, vous pouvez utiliser la fonction caché.bs.modal vous pouvez en savoir plus sur les méthodes et les événements modaux dans le document suivant Documentation

Si aucune des méthodes ci-dessus ne fonctionne, donnez un identifiant à votre bouton de fermeture et déclenchez le clic sur le bouton de fermeture.

1 votes

Cette fonction est particulièrement utile lorsque vous savez exactement à quel moment la boîte de dialogue modale est censée se fermer. Par exemple, à la fin d'une fonction de réussite. De cette façon, s'il y a une erreur, le dialogue peut l'afficher.

11voto

Richard Handley Points 61

J'ai rencontré ce que je crois être un problème similaire. Le site $('#myModal').modal('hide'); est probablement en train d'exécuter cette fonction et frappe la ligne

if (!this.isShown || e.isDefaultPrevented()) return

Le problème est que la valeur isShown peut être indéfinie même si la modale est affichée et que la valeur devrait être vraie. J'ai légèrement modifié le code bootstrap pour obtenir ce qui suit

if (!(typeof this.isShown == 'undefined') && (!this.isShown || e.isDefaultPrevented())) return

Cela a semblé résoudre le problème en grande partie. Si l'arrière-plan persiste, vous pouvez toujours ajouter un appel pour le supprimer manuellement après l'appel de masquage. $('.modal-backdrop').remove(); . Ce n'est pas du tout l'idéal, mais cela fonctionne.

11voto

Nathan Points 424

(Se référant à Bootstrap 3), Pour cacher la modale utiliser : $('#modal').modal('hide') . Mais la raison pour laquelle la toile de fond est restée en place (pour moi) est que je détruisais le DOM de la modale avant la fin de la fonction 'hide'.

Pour résoudre ce problème, j'ai enchaîné l'événement caché avec le retrait du DOM. Dans mon cas : this.render()

var $modal = $('#modal');

//when hidden
$modal.on('hidden.bs.modal', function(e) { 
  return this.render(); //DOM destroyer
});

$modal.modal('hide'); //start hiding

2 votes

mais pouvez-vous me parler de this.render() son exposition undefined is not a function dans ma console chromée.

10voto

Dan Schoonmaker Points 51

J'ai eu plus de chance de passer l'appel après que le rappel "montré" ait eu lieu :

$('#myModal').on('shown', function () {
      $('#myModal').modal('hide');
})

Cela permet de s'assurer que le chargement de la modale est terminé avant que l'appel à hide() ne soit effectué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X