Voici mon code html modal:
<div class="modal fade" id="delete-file-modal" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<form class="form-horizontal" method="post" id="delete_file_form">
<div class="modal-body">
Are you sure you want to delete this file?
</div>
<div class="modal-footer">
<button data-dismiss="modal" class="btn btn-danger" name="in_confirm_insert" id="confirm-delete-button">Delete</button>
<button data-dismiss="modal" class="btn btn-default" name="in_confirm_insert" id="cancel-delete-button">Cancel</button>
</div>
</form>
</div>
</div>
</div>
et voici mon code javascript:
$('#delete-file-modal').on('hidden.bs.modal', function (e) {
var delete_button = $(e.target).is("#confirm-delete-button");
if(delete_button === true) {
//delete file
alert("file deleted.");
} else {
alert("delete failed.");
};
});
Je dois être en mesure de vérifier si le bouton Supprimer est cliqué lorsque le fichier de suppression-modal est fermé. Est-ce qu'il manque quelque chose d'autre dans mon code javascript?
Dans l'écouteur d'événement hidden.bs.modal
, event.target
Fait référence à l'élément modal qui est masqué, pas l'élément cliqué qui a déclenché l'événement.
Si vous souhaitez déterminer quel bouton a déclenché la fermeture du modal, une option consiste à ajouter des écouteurs d'événements aux éléments du bouton à l'intérieur du modal. Ensuite, à l'intérieur de l'écouteur d'événements de bouton, vous pouvez écouter l'événement hidden.bs.modal
Sur l'élément parent #modal
Afin de déterminer si le modal a été fermé. Étant donné que l'écouteur d'événement hidden.bs.modal
Se trouve à l'intérieur du bouton écouteur d'événement click
, vous avez toujours une référence à l'élément qui a déclenché l'événement click
.
$('#delete-file-modal .modal-footer button').on('click', function(event) {
var $button = $(event.target); // The clicked button
$(this).closest('.modal').one('hidden.bs.modal', function() {
// Fire if the button element
console.log('The button that closed the modal is: ', $button);
});
});
Il convient également de mentionner que la méthode .one()
ne déclenchera l'événement qu'une fois à chaque fois qu'il est attaché (ce qui est exactement ce que nous voulons). Sinon, si vous avez utilisé .on()
ou .click()
pour attacher l'événement, l'événement pourrait se déclencher plusieurs fois car il est réattaché chaque fois que l'écouteur d'événement click
est déclenché.
Selon la documentation Bootstrap pertinente , les événements show.bs.modal
/shown.bs.modal
Ont une propriété relatedTarget
attachée à l'événement.
S'il est provoqué par un clic, l'élément cliqué est disponible en tant que propriété
relatedTarget
de l'événement.
Ainsi, vous pouvez déterminer l'élément qui a déclenché l'événement modal à ouvrir en accédant à event.relatedTarget
À l'intérieur de l'écouteur d'événement show modal:
$('#delete-file-modal').on('show.bs.modal', function (event) {
console.log(event.relatedTarget);
});
Gardez à l'esprit que la propriété relatedTarget
n'est associée qu'aux événements show modaux. Ce serait bien s'ils avaient une propriété comme celle associée aux événements hide.bs.modal
/hidden.bs.modal
. Au moment d'écrire ces lignes, il n'y a actuellement pas.
Comme Andrew l'a souligné dans les commentaires sous cette réponse, vous pouvez également vérifier quel élément de la page est ciblé en accédant à document.activeElement
.
Dans l'extrait ci-dessous, un écouteur d'événement est attaché à l'élément modal pour les événements d'affichage et de masquage. Lorsque l'événement est déclenché, une vérification est effectuée pour voir si l'élément actuellement concentré sur possède un attribut [data-toggle]
Ou [data-dismiss]
(Ce qui implique qu'il a effectivement déclenché l'événement).
$('#delete-file-modal').on('hide.bs.modal show.bs.modal', function(event) {
var $activeElement = $(document.activeElement);
if ($activeElement.is('[data-toggle], [data-dismiss]')) {
console.log($activeElement);
}
});
Si vous écoutez les deux événements afficher/masquer, comme dans l'exemple ci-dessus, et que vous souhaitez différencier les événements, vous pouvez cocher event.type
:
$('#delete-file-modal').on('hide.bs.modal show.bs.modal', function(event) {
var $activeElement = $(document.activeElement);
if ($activeElement.is('[data-toggle], [data-dismiss]')) {
if (event.type === 'hide') {
// Do something with the button that closed the modal
console.log('The button that closed the modal is: ', $activeElement);
}
if (event.type === 'show') {
// Do something with the button that opened the modal
console.log('The button that opened the modal is: ', $activeElement);
}
}
});
Cela fonctionne aussi:
$('#myModal').on('hide.bs.modal', function (e) {
var tmpid = $(document.activeElement).attr('id'); alert(tmpid);
});
Il n'obtiendra pas l'identifiant du "X" sur le modal à moins que vous ne l'identifiiez. Renvoie l'identifiant de l'élément qui déclenche la fermeture du modal ....
Pour prolonger la réponse de @ JoshCrozier:
Ce serait bien s'ils avaient une propriété comme celle associée aux événements hide.bs.modal/hidden.bs.modal. Au moment d'écrire ces lignes, il n'y a actuellement pas
Cela émulera un comportement similaire, qui attache le bouton cliqué comme relatedTarget pour les auditeurs ultérieurs:
$( '.modal-footer .btn[data-dismiss="modal"]' ).on( 'click', function() {
var target = this
$( target ).closest( '.modal' )
.one( 'hide.bs.modal hidden.bs.modal', function( event ) {
event.relatedTarget = target
} )
} )
Le sélecteur et l'écouteur peuvent être optimisés en fonction de la façon dont les modaux sont utilisés dans un projet. Par exemple: si vous savez que vous n'utiliserez pas hide.bs.modal
, Vous pouvez simplement modifier l'événement de hidden.bs.modal
À la place.
La réponse @ JoshCrozier est bonne et utile mais parfois nous devons Déterminer l'élément de sorcière a déclenché le modal à ouvrir/fermer APRÈS qu'il a été fermé . ( @ Nomad l'a mentionné dans les commentaires ci-dessous le @ JoshCrozier réponse).
Parfois aussi, nous devons déterminer quel lien ou bouton dans le body
ou header
a déclenché la fermeture du modal (pas seulement les boutons dans le footer
).
Alors j'écris cette solution à mix @ JoshCrozier and @ Katia répond à ma façon et améliore la solution finale:
$('body').on('click','.modal .dismiss-modal', function() {
var closeRelatedTarget = this;
var $modal = $(closeRelatedTarget).closest('.modal');
$modal.one('hide.bs.modal hidden.bs.modal', function(event) {
$modal.data('closeRelatedTarget',closeRelatedTarget);
});
$modal.data('closeRelatedTarget','wait');
$modal.modal('hide');
});
$('body').on('show.bs.modal','.modal', function(event){
$(this).data('closeRelatedTarget','anElement');
$(this).data('showRelatedTarget',event.relatedTarget);
});
● Déterminer que l'élément de sorcière a déclenché le modal pour afficher sur show
et shown
(An embed Bootstrap feature) :
$('#MyModal').on('show.bs.modal', function (event) {
console.log(event.relatedTarget);
});
et
$('#MyModal').on('shown.bs.modal', function (event) {
console.log(event.relatedTarget);
});
● Déterminer que l'élément de sorcière a déclenché le modal pour fermer sur hidden
$('#BuyModal').on('hidden.bs.modal', function (event) {
if($(this).data('closeRelatedTarget')=='wait')
{return;}
console.log($('#MyModal').data('closeRelatedTarget'));
});
● Déterminer que l'élément de sorcière a déclenché le modal pour afficher même après la fermeture du modal
console.log($('#MyModal').data('showRelatedTarget'));
● Déterminer que l'élément de sorcière a déclenché le modal pour fermer même après la fermeture du modal
console.log($('#MyModal').data('closeRelatedTarget'));
Remarque: Au lieu de
data-dismiss="modal"
propriété utilise monmodal-dismiss
classe à chaque élément du modèle que vous pouvez fermer le modèle et vous voulez le déterminer (N'utilisez pas les deuxmodal-dismiss
classe etdata-dismiss="modal"
ensemble).Exemple:
<a href="/more_info.html" class="dismiss-modal">More info</a>
Pourquoi? Parce que
data-dismiss="modal"
fermez le modèle et déclenchez hide et hidden avant de définircloseRelatedTarget
.
Nous y pensons trop. C'est aussi simple qu'un gestionnaire de boutons standard. La donnée-rejeter = "modal" fera disparaître la boîte de dialogue, et nous saurons toujours que le bouton qui nous intéressait a été cliqué.
$('#delete-file-modal').on('click','#delete-file-modal #confirm-delete-button', function (e) {
e.preventDefault();
console.log('confirmed delete');
return false;
});