Recette GET
Pour cette tâche, vous pouvez utiliser les plugins et les extensions bootstrap déjà disponibles. Ou vous pouvez créer votre propre popup de confirmation avec seulement 3 lignes de code. Vérifiez-le.
Disons que nous avons ces liens (note data-href
au lieu de href
) ou les boutons pour lesquels nous voulons avoir une confirmation de suppression :
<a href="#" data-href="delete.php?id=23" data-toggle="modal" data-target="#confirm-delete">Delete record #23</a>
<button class="btn btn-default" data-href="http://stackoverflow.com/delete.php?id=54" data-toggle="modal" data-target="#confirm-delete">
Delete record #54
</button>
Ici #confirm-delete
pointe vers un div modal popup dans votre HTML. Elle doit comporter un bouton "OK" configuré comme ceci :
<div class="modal fade" id="confirm-delete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
...
</div>
<div class="modal-body">
...
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<a class="btn btn-danger btn-ok">Delete</a>
</div>
</div>
</div>
</div>
Maintenant, vous n'avez besoin que de ce petit javascript pour rendre une action de suppression confirmable :
$('#confirm-delete').on('show.bs.modal', function(e) {
$(this).find('.btn-ok').attr('href', $(e.relatedTarget).data('href'));
});
Ainsi de suite show.bs.modal
bouton de suppression d'événement href
est fixé à l'URL avec l'id d'enregistrement correspondant.
Démonstration : http://plnkr.co/edit/NePR0BQf3VmKtuMmhVR7?p=preview
Recette POST
Je me rends compte que dans certains cas, il peut être nécessaire d'effectuer des requêtes POST ou DELETE plutôt que GET. Cela reste assez simple sans trop de code. Jetez un coup d'oeil à la démo ci-dessous avec cette approche :
// Bind click to OK button within popup
$('#confirm-delete').on('click', '.btn-ok', function(e) {
var $modalDiv = $(e.delegateTarget);
var id = $(this).data('recordId');
$modalDiv.addClass('loading');
$.post('/api/record/' + id).then(function() {
$modalDiv.modal('hide').removeClass('loading');
});
});
// Bind to modal opening to set necessary data properties to be used to make request
$('#confirm-delete').on('show.bs.modal', function(e) {
var data = $(e.relatedTarget).data();
$('.title', this).text(data.recordTitle);
$('.btn-ok', this).data('recordId', data.recordId);
});
// Bind click to OK button within popup
$('#confirm-delete').on('click', '.btn-ok', function(e) {
var $modalDiv = $(e.delegateTarget);
var id = $(this).data('recordId');
$modalDiv.addClass('loading');
setTimeout(function() {
$modalDiv.modal('hide').removeClass('loading');
}, 1000);
// In reality would be something like this
// $modalDiv.addClass('loading');
// $.post('/api/record/' + id).then(function() {
// $modalDiv.modal('hide').removeClass('loading');
// });
});
// Bind to modal opening to set necessary data properties to be used to make request
$('#confirm-delete').on('show.bs.modal', function(e) {
var data = $(e.relatedTarget).data();
$('.title', this).text(data.recordTitle);
$('.btn-ok', this).data('recordId', data.recordId);
});
.modal.loading .modal-content:before {
content: 'Loading...';
text-align: center;
line-height: 155px;
font-size: 20px;
background: rgba(0, 0, 0, .8);
position: absolute;
top: 55px;
bottom: 0;
left: 0;
right: 0;
color: #EEE;
z-index: 1000;
}
<script data-require="jquery@*" data-semver="2.0.3" src="//code.jquery.com/jquery-2.0.3.min.js"></script>
<script data-require="bootstrap@*" data-semver="3.1.1" src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<link data-require="bootstrap-css@3.1.1" data-semver="3.1.1" rel="stylesheet" href="http://stackoverflow.com//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" />
<div class="modal fade" id="confirm-delete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" id="myModalLabel">Confirm Delete</h4>
</div>
<div class="modal-body">
<p>You are about to delete <b><i class="title"></i></b> record, this procedure is irreversible.</p>
<p>Do you want to proceed?</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-danger btn-ok">Delete</button>
</div>
</div>
</div>
</div>
<a href="#" data-record-id="23" data-record-title="The first one" data-toggle="modal" data-target="#confirm-delete">
Delete "The first one", #23
</a>
<br />
<button class="btn btn-default" data-record-id="54" data-record-title="Something cool" data-toggle="modal" data-target="#confirm-delete">
Delete "Something cool", #54
</button>
Démonstration : http://plnkr.co/edit/V4GUuSueuuxiGr4L9LmG?p=preview
Bootstrap 2.3
Voici une version originale du code que j'ai réalisé lorsque je répondais à cette question pour la modale Bootstrap 2.3.
$('#modal').on('show', function() {
var id = $(this).data('id'),
removeBtn = $(this).find('.danger');
removeBtn.attr('href', removeBtn.attr('href').replace(/(&|\?)ref=\d*/, '$1ref=' + id));
});
Démo : http://jsfiddle.net/MjmVr/1595/
5 votes
jsfiddle.net/MjmVr/363
3 votes
Ayant rencontré cette question, j'ai voulu apporter ma contribution en proposant (ce qui me semble) une solution très simple et plus rationnelle à ce problème. Je me suis débattu avec ce problème pendant un moment, puis j'ai réalisé à quel point cela pouvait être simple : il suffit de placer le bouton de soumission du formulaire dans la boîte de dialogue modale, et le bouton de soumission du formulaire lui-même ne fait rien d'autre que d'ouvrir la boîte de dialogue... problème résolu.
0 votes
@jonijones cet exemple ne fonctionne pas pour moi (le message de confirmation ne s'affiche pas lors du clic sur le premier bouton) - testé dans chrome