Confirmer la suppression dans modal / dialogue en utilisant Twitter Bootstrap?

285

J'ai un tableau HTML de lignes liées aux lignes de la base de données. Je voudrais avoir un lien "supprimer la ligne" pour chaque ligne, mais je voudrais confirmer avec l'utilisateur au préalable.

Existe-t-il un moyen de le faire en utilisant la boîte de dialogue modale Twitter Bootstrap?

SWL
la source
4
jsfiddle.net/MjmVr/363
joni jones
3
Après avoir traversé cette question, je voulais mettre en place (ce qui me semble) un "correctif" aussi simple et plus rationalisé pour ce problème. J'ai lutté pendant un certain temps et 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, puis le bouton de soumission sur le formulaire lui-même ne fait que déclencher la fenêtre de dialogue ... problème résolu.
Michael Doleman
@jonijones cet exemple ne fonctionne pas pour moi (le message de confirmation ne s'affiche pas en cliquant sur le premier bouton) - testé en chrome
egmfrs

Réponses:

397

OBTENIR la recette

Pour cette tâche, vous pouvez utiliser des plugins et des extensions d'amorçage déjà disponibles. Ou vous pouvez créer votre propre fenêtre de confirmation avec seulement 3 lignes de code. Vérifiez-le.

Supposons que nous ayons ces liens (notez data-hrefplutôt que href) ou des 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="/delete.php?id=54" data-toggle="modal" data-target="#confirm-delete">
    Delete record #54
</button>

Ici #confirm-deletepointe vers une div popup modale dans votre HTML. Il devrait avoir 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 confirmer une action de suppression:

$('#confirm-delete').on('show.bs.modal', function(e) {
    $(this).find('.btn-ok').attr('href', $(e.relatedTarget).data('href'));
});

Ainsi, le show.bs.modalbouton de suppression d'événement hrefest défini sur URL avec l'ID d'enregistrement correspondant.

Démo: http://plnkr.co/edit/NePR0BQf3VmKtuMmhVR7?p=preview


Recette POST

Je me rends compte que dans certains cas, il peut être nécessaire d'effectuer une requête POST ou DELETE plutôt que GET. C'est quand même assez simple sans trop de code. Jetez un œil à 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);
});

Démo: http://plnkr.co/edit/V4GUuSueuuxiGr4L9LmG?p=preview


Bootstrap 2.3

Voici une version originale du code que j'ai fait quand je répondais à cette question pour Bootstrap 2.3 modal.

$('#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/

dfsq
la source
1
Cela fonctionne presque parfaitement mais même dans la version violon (comme sur mon site), l'identifiant n'est pas transmis au bouton Oui dans le modal. J'ai remarqué que vous essayez de remplacer & ref au lieu de ? Ref , j'ai donc essayé de changer cela, mais cela ne fonctionne toujours pas. Suis-je en train de manquer autre chose ici? C'est génial sinon TIA pour votre aide!
SWL
Merci @dfsq - cela a fonctionné magnifiquement. La boîte de dialogue ne se cache pas en cliquant sur le bouton 'non', j'ai donc changé le href en # plutôt que le masquage modal et cela fonctionne aussi. Merci encore pour votre aide.
SWL
22
Un ajustement est que la demande de suppression finale devrait aboutir à une publication, pas à un GEt comme vous le feriez avec un lien. Si vous autorisez la suppression sur un GET, des tiers malveillants peuvent facilement créer des liens sur des sites ou des e-mails qui amènent votre utilisateur à supprimer involontairement des éléments. Cela peut sembler idiot, mais il existe des scénarios où ce serait un grave problème de sécurité.
AaronLS
2
Vous voudrez peut-être jeter un œil à Vex . Tellement plus simple de faire ce que vous demandez: jsfiddle.net/adamschwartz/hQump .
Adam
3
Tenté de voter pour l'utilisation d'un GET pour effectuer une action destructrice. Il y a de très nombreuses raisons différentes pour lesquelles vous ne devriez jamais faire cela.
NickG
158

http://bootboxjs.com/ - derniers travaux avec Bootstrap 3.0.0

L'exemple le plus simple possible:

bootbox.alert("Hello world!"); 

Depuis le site:

La bibliothèque expose trois méthodes conçues pour imiter leurs équivalents JavaScript natifs. Leurs signatures de méthode exactes sont flexibles car chacune peut prendre divers paramètres pour personnaliser les étiquettes et spécifier les valeurs par défaut, mais elles sont le plus souvent appelées ainsi:

bootbox.alert(message, callback)
bootbox.prompt(message, callback)
bootbox.confirm(message, callback)

Voici un extrait de celui-ci en action (cliquez sur "Exécuter l'extrait de code" ci-dessous):

$(function() {
  bootbox.alert("Hello world!");
});
<!-- required includes -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>

<!-- bootbox.js at 4.4.0 -->
<script src="https://rawgit.com/makeusabrew/bootbox/f3a04a57877cab071738de558581fbc91812dce9/bootbox.js"></script>

Rifat
la source
2
Malheureusement, au moment où vous avez besoin d'un texte non anglais sur le titre et les boutons, vous devez soit modifier le JS ou commencer à paramétrer presque autant que simplement ajouter le bootstrap html et JS vous-même. :)
Johncl
31
  // ---------------------------------------------------------- Generic Confirm  

  function confirm(heading, question, cancelButtonTxt, okButtonTxt, callback) {

    var confirmModal = 
      $('<div class="modal hide fade">' +    
          '<div class="modal-header">' +
            '<a class="close" data-dismiss="modal" >&times;</a>' +
            '<h3>' + heading +'</h3>' +
          '</div>' +

          '<div class="modal-body">' +
            '<p>' + question + '</p>' +
          '</div>' +

          '<div class="modal-footer">' +
            '<a href="#" class="btn" data-dismiss="modal">' + 
              cancelButtonTxt + 
            '</a>' +
            '<a href="#" id="okButton" class="btn btn-primary">' + 
              okButtonTxt + 
            '</a>' +
          '</div>' +
        '</div>');

    confirmModal.find('#okButton').click(function(event) {
      callback();
      confirmModal.modal('hide');
    });

    confirmModal.modal('show');     
  };

  // ---------------------------------------------------------- Confirm Put To Use

  $("i#deleteTransaction").live("click", function(event) {
    // get txn id from current table row
    var id = $(this).data('id');

    var heading = 'Confirm Transaction Delete';
    var question = 'Please confirm that you wish to delete transaction ' + id + '.';
    var cancelButtonTxt = 'Cancel';
    var okButtonTxt = 'Confirm';

    var callback = function() {
      alert('delete confirmed ' + id);
    };

    confirm(heading, question, cancelButtonTxt, okButtonTxt, callback);

  });
jousby
la source
1
C'est un ancien article mais je veux la même chose mais quand j'utilise le code ci-dessus, la boîte de dialogue modale s'affiche?
Saurabh
28

Je me rendrais compte que c'est une très vieille question, mais puisque je me suis demandé aujourd'hui une méthode plus efficace pour gérer les modaux de bootstrap. J'ai fait quelques recherches et trouvé quelque chose de mieux que les solutions présentées ci-dessus, qui peuvent être trouvées sur ce lien:

http://www.petefreitag.com/item/809.cfm

Chargez d'abord le jquery

$(document).ready(function() {
    $('a[data-confirm]').click(function(ev) {
        var href = $(this).attr('href');

        if (!$('#dataConfirmModal').length) {
            $('body').append('<div id="dataConfirmModal" class="modal" role="dialog" aria-labelledby="dataConfirmLabel" aria-hidden="true"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button><h3 id="dataConfirmLabel">Please Confirm</h3></div><div class="modal-body"></div><div class="modal-footer"><button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button><a class="btn btn-primary" id="dataConfirmOK">OK</a></div></div>');
        } 
        $('#dataConfirmModal').find('.modal-body').text($(this).attr('data-confirm'));
        $('#dataConfirmOK').attr('href', href);
        $('#dataConfirmModal').modal({show:true});
        return false;
    });
});

Il suffit ensuite de poser toute question / confirmation à href:

<a href="/any/url/delete.php?ref=ID" data-confirm="Are you sure you want to delete?">Delete</a>

De cette façon, le modal de confirmation est beaucoup plus universel et peut donc être facilement réutilisé sur d'autres parties de votre site Web.

Arjan
la source
4
Veuillez ne pas publier de code provenant d'autres sources sans attribution: petefreitag.com/item/809.cfm .
A. Webb
4
Même si l'op a d'abord oublié l'attribution, c'était la chose parfaite pour moi. Fonctionne comme un charme.
Janis Peisenieks
3
Je pense que ce n'est pas une bonne idée de supprimer des éléments avec une demande http GET
Miguel Prz
7
Maman m'a dit de ne cliquer sur aucun lien de fusion froide
Mike Purcell
3
@BenY Il ne s'agit pas de savoir si l'utilisateur a la permission de faire des choses ou non, il s'agit des utilisateurs malveillants qui ont déjà la permission de faire des choses incités à cliquer sur des liens sur d'autres sites, des e-mails, etc. afin que l'utilisateur malveillant puisse profiter des autorisations de cet utilisateur.
Brett
17

Grâce à la solution de @ Jousby , j'ai réussi à faire fonctionner la mienne également, mais j'ai constaté que je devais améliorer un peu le balisage modal Bootstrap de sa solution pour le rendre correctement, comme le montrent les exemples officiels .

Alors, voici ma version modifiée de la confirmfonction générique qui fonctionnait bien:

/* Generic Confirm func */
  function confirm(heading, question, cancelButtonTxt, okButtonTxt, callback) {

    var confirmModal = 
      $('<div class="modal fade">' +        
          '<div class="modal-dialog">' +
          '<div class="modal-content">' +
          '<div class="modal-header">' +
            '<a class="close" data-dismiss="modal" >&times;</a>' +
            '<h3>' + heading +'</h3>' +
          '</div>' +

          '<div class="modal-body">' +
            '<p>' + question + '</p>' +
          '</div>' +

          '<div class="modal-footer">' +
            '<a href="#!" class="btn" data-dismiss="modal">' + 
              cancelButtonTxt + 
            '</a>' +
            '<a href="#!" id="okButton" class="btn btn-primary">' + 
              okButtonTxt + 
            '</a>' +
          '</div>' +
          '</div>' +
          '</div>' +
        '</div>');

    confirmModal.find('#okButton').click(function(event) {
      callback();
      confirmModal.modal('hide');
    }); 

    confirmModal.modal('show');    
  };  
/* END Generic Confirm func */
nemesisfixx
la source
3
Grande solution ici. J'ai apporté quelques légères modifications pour gérer un rappel pour le lien d'annulation. Une petite recommandation, utilisez #! au lieu de # dans votre href pour empêcher la page de défiler vers le haut.
Domenic
Si je pouvais doubler ce vote, je le ferais. Agréable et élégant. Je vous remercie.
Nigel Johnson
Très belle solution. Une autre amélioration que je peux suggérer consiste à ajouter un autre argument: btnType = "btn-primary"puis à modifier le code du bouton OK à contenir class="btn ' + btnType + '". De cette façon, on peut passer un argument facultatif pour changer l'apparence du bouton OK, comme btn-dangerpour une suppression.
IamNaN
Je vous remercie. J'ai dû permuter les balises <h3> et <a> (h3 en premier) pour que le rendu soit correct.
Dave Dawkins
10

J'ai trouvé cela utile et facile à utiliser, en plus il a l'air joli: http://maxailloud.github.io/confirm-bootstrap/ .

Pour l'utiliser, incluez le fichier .js dans votre page puis exécutez:

$('your-link-selector').confirmModal();

Il existe différentes options que vous pouvez lui appliquer, pour le rendre plus joli lorsque vous le faites pour confirmer une suppression, j'utilise:

$('your-link-selector').confirmModal({
    confirmTitle: 'Please confirm',
    confirmMessage: 'Are you sure you want to delete this?',
    confirmStyle: 'danger',
    confirmOk: '<i class="icon-trash icon-white"></i> Delete',
    confirmCallback: function (target) {
         //perform the deletion here, or leave this option
         //out to just follow link..
    }
});
Mark Rhodes
la source
c'est une belle lib
loretoparisi
4

Je peux facilement gérer ce type de tâche en utilisant la bibliothèque bootbox.js. Au début, vous devez inclure le fichier bootbox JS. Ensuite, dans votre fonction de gestionnaire d'événements, écrivez simplement le code suivant:

    bootbox.confirm("Are you sure to want to delete , function(result) {

    //here result will be true
    // delete process code goes here

    });

Site officiel de bootboxjs

karim_fci
la source
2

La solution suivante est meilleure que bootbox.js , car

  • Il peut faire tout ce que bootbox.js peut faire;
  • La syntaxe d'utilisation est plus simple
  • Il vous permet de contrôler avec élégance la couleur de votre message en utilisant "erreur", "avertissement" ou "info"
  • Bootbox a 986 lignes de long, le mien seulement 110 lignes de long

digimango.messagebox.js :

const dialogTemplate = '\
    <div class ="modal" id="digimango_messageBox" role="dialog">\
        <div class ="modal-dialog">\
            <div class ="modal-content">\
                <div class ="modal-body">\
                    <p class ="text-success" id="digimango_messageBoxMessage">Some text in the modal.</p>\
                    <p><textarea id="digimango_messageBoxTextArea" cols="70" rows="5"></textarea></p>\
                </div>\
                <div class ="modal-footer">\
                    <button type="button" class ="btn btn-primary" id="digimango_messageBoxOkButton">OK</button>\
                    <button type="button" class ="btn btn-default" data-dismiss="modal" id="digimango_messageBoxCancelButton">Cancel</button>\
                </div>\
            </div>\
        </div>\
    </div>';


// See the comment inside function digimango_onOkClick(event) {
var digimango_numOfDialogsOpened = 0;


function messageBox(msg, significance, options, actionConfirmedCallback) {
    if ($('#digimango_MessageBoxContainer').length == 0) {
        var iDiv = document.createElement('div');
        iDiv.id = 'digimango_MessageBoxContainer';
        document.getElementsByTagName('body')[0].appendChild(iDiv);
        $("#digimango_MessageBoxContainer").html(dialogTemplate);
    }

    var okButtonName, cancelButtonName, showTextBox, textBoxDefaultText;

    if (options == null) {
        okButtonName = 'OK';
        cancelButtonName = null;
        showTextBox = null;
        textBoxDefaultText = null;
    } else {
        okButtonName = options.okButtonName;
        cancelButtonName = options.cancelButtonName;
        showTextBox = options.showTextBox;
        textBoxDefaultText = options.textBoxDefaultText;
    }

    if (showTextBox == true) {
        if (textBoxDefaultText == null)
            $('#digimango_messageBoxTextArea').val('');
        else
            $('#digimango_messageBoxTextArea').val(textBoxDefaultText);

        $('#digimango_messageBoxTextArea').show();
    }
    else
        $('#digimango_messageBoxTextArea').hide();

    if (okButtonName != null)
        $('#digimango_messageBoxOkButton').html(okButtonName);
    else
        $('#digimango_messageBoxOkButton').html('OK');

    if (cancelButtonName == null)
        $('#digimango_messageBoxCancelButton').hide();
    else {
        $('#digimango_messageBoxCancelButton').show();
        $('#digimango_messageBoxCancelButton').html(cancelButtonName);
    }

    $('#digimango_messageBoxOkButton').unbind('click');
    $('#digimango_messageBoxOkButton').on('click', { callback: actionConfirmedCallback }, digimango_onOkClick);

    $('#digimango_messageBoxCancelButton').unbind('click');
    $('#digimango_messageBoxCancelButton').on('click', digimango_onCancelClick);

    var content = $("#digimango_messageBoxMessage");

    if (significance == 'error')
        content.attr('class', 'text-danger');
    else if (significance == 'warning')
        content.attr('class', 'text-warning');
    else
        content.attr('class', 'text-success');

    content.html(msg);

    if (digimango_numOfDialogsOpened == 0)
        $("#digimango_messageBox").modal();

    digimango_numOfDialogsOpened++;
}

function digimango_onOkClick(event) {
    // JavaScript's nature is unblocking. So the function call in the following line will not block,
    // thus the last line of this function, which is to hide the dialog, is executed before user
    // clicks the "OK" button on the second dialog shown in the callback. Therefore we need to count
    // how many dialogs is currently showing. If we know there is still a dialog being shown, we do
    // not execute the last line in this function.
    if (typeof (event.data.callback) != 'undefined')
        event.data.callback($('#digimango_messageBoxTextArea').val());

    digimango_numOfDialogsOpened--;

    if (digimango_numOfDialogsOpened == 0)
        $('#digimango_messageBox').modal('hide');
}

function digimango_onCancelClick() {
    digimango_numOfDialogsOpened--;

    if (digimango_numOfDialogsOpened == 0)
        $('#digimango_messageBox').modal('hide');
}

Pour utiliser digimango.messagebox.js :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>A useful generic message box</title>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />

    <link rel="stylesheet" type="text/css" href="~/Content/bootstrap.min.css" media="screen" />
    <script src="~/Scripts/jquery-1.10.2.min.js" type="text/javascript"></script>
    <script src="~/Scripts/bootstrap.js" type="text/javascript"></script>
    <script src="~/Scripts/bootbox.js" type="text/javascript"></script>

    <script src="~/Scripts/digimango.messagebox.js" type="text/javascript"></script>


    <script type="text/javascript">
        function testAlert() {
            messageBox('Something went wrong!', 'error');
        }

        function testAlertWithCallback() {
            messageBox('Something went wrong!', 'error', null, function () {
                messageBox('OK clicked.');
            });
        }

        function testConfirm() {
            messageBox('Do you want to proceed?', 'warning', { okButtonName: 'Yes', cancelButtonName: 'No' }, function () {
                messageBox('Are you sure you want to proceed?', 'warning', { okButtonName: 'Yes', cancelButtonName: 'No' });
            });
        }

        function testPrompt() {
            messageBox('How do you feel now?', 'normal', { showTextBox: true }, function (userInput) {
                messageBox('User entered "' + userInput + '".');
            });
        }

        function testPromptWithDefault() {
            messageBox('How do you feel now?', 'normal', { showTextBox: true, textBoxDefaultText: 'I am good!' }, function (userInput) {
                messageBox('User entered "' + userInput + '".');
            });
        }

    </script>
</head>

<body>
    <a href="#" onclick="testAlert();">Test alert</a> <br/>
    <a href="#" onclick="testAlertWithCallback();">Test alert with callback</a> <br />
    <a href="#" onclick="testConfirm();">Test confirm</a> <br/>
    <a href="#" onclick="testPrompt();">Test prompt</a><br />
    <a href="#" onclick="testPromptWithDefault();">Test prompt with default text</a> <br />
</body>

</html>
entrez la description de l'image ici

Mec idiot
la source
1

Vous pouvez essayer ma solution plus réutilisable avec la fonction de rappel . Dans cette fonction, vous pouvez utiliser la requête POST ou une logique. Bibliothèques utilisées: JQuery 3> et Bootstrap 3> .

https://jsfiddle.net/axnikitenko/gazbyv8v/

Code HTML pour le test:

...
<body>
    <a href='#' id="remove-btn-a-id" class="btn btn-default">Test Remove Action</a>
</body>
...

Javascript:

$(function () {
    function remove() {
        alert('Remove Action Start!');
    }
    // Example of initializing component data
    this.cmpModalRemove = new ModalConfirmationComponent('remove-data', remove,
        'remove-btn-a-id', {
            txtModalHeader: 'Header Text For Remove', txtModalBody: 'Body For Text Remove',
            txtBtnConfirm: 'Confirm', txtBtnCancel: 'Cancel'
        });
    this.cmpModalRemove.initialize();
});

//----------------------------------------------------------------------------------------------------------------------
// COMPONENT SCRIPT
//----------------------------------------------------------------------------------------------------------------------
/**
 * Script processing data for confirmation dialog.
 * Used libraries: JQuery 3> and Bootstrap 3>.
 *
 * @param name unique component name at page scope
 * @param callback function which processing confirm click
 * @param actionBtnId button for open modal dialog
 * @param text localization data, structure:
 *              > txtModalHeader - text at header of modal dialog
 *              > txtModalBody - text at body of modal dialog
 *              > txtBtnConfirm - text at button for confirm action
 *              > txtBtnCancel - text at button for cancel action
 *
 * @constructor
 * @author Aleksey Nikitenko
 */
function ModalConfirmationComponent(name, callback, actionBtnId, text) {
    this.name = name;
    this.callback = callback;
    // Text data
    this.txtModalHeader =   text.txtModalHeader;
    this.txtModalBody =     text.txtModalBody;
    this.txtBtnConfirm =    text.txtBtnConfirm;
    this.txtBtnCancel =     text.txtBtnCancel;
    // Elements
    this.elmActionBtn = $('#' + actionBtnId);
    this.elmModalDiv = undefined;
    this.elmConfirmBtn = undefined;
}

/**
 * Initialize needed data for current component object.
 * Generate html code and assign actions for needed UI
 * elements.
 */
ModalConfirmationComponent.prototype.initialize = function () {
    // Generate modal html and assign with action button
    $('body').append(this.getHtmlModal());
    this.elmActionBtn.attr('data-toggle', 'modal');
    this.elmActionBtn.attr('data-target', '#'+this.getModalDivId());
    // Initialize needed elements
    this.elmModalDiv =  $('#'+this.getModalDivId());
    this.elmConfirmBtn = $('#'+this.getConfirmBtnId());
    // Assign click function for confirm button
    var object = this;
    this.elmConfirmBtn.click(function() {
        object.elmModalDiv.modal('toggle'); // hide modal
        object.callback(); // run callback function
    });
};

//----------------------------------------------------------------------------------------------------------------------
// HTML GENERATORS
//----------------------------------------------------------------------------------------------------------------------
/**
 * Methods needed for get html code of modal div.
 *
 * @returns {string} html code
 */
ModalConfirmationComponent.prototype.getHtmlModal = function () {
    var result = '<div class="modal fade" id="' + this.getModalDivId() + '"';
    result +=' tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">';
    result += '<div class="modal-dialog"><div class="modal-content"><div class="modal-header">';
    result += this.txtModalHeader + '</div><div class="modal-body">' + this.txtModalBody + '</div>';
    result += '<div class="modal-footer">';
    result += '<button type="button" class="btn btn-default" data-dismiss="modal">';
    result += this.txtBtnCancel + '</button>';
    result += '<button id="'+this.getConfirmBtnId()+'" type="button" class="btn btn-danger">';
    result += this.txtBtnConfirm + '</button>';
    return result+'</div></div></div></div>';
};

//----------------------------------------------------------------------------------------------------------------------
// UTILITY
//----------------------------------------------------------------------------------------------------------------------
/**
 * Get id element with name prefix for this component.
 *
 * @returns {string} element id
 */
ModalConfirmationComponent.prototype.getModalDivId = function () {
    return this.name + '-modal-id';
};

/**
 * Get id element with name prefix for this component.
 *
 * @returns {string} element id
 */
ModalConfirmationComponent.prototype.getConfirmBtnId = function () {
    return this.name + '-confirm-btn-id';
};
Alexey Nikitenko
la source
0

Lorsqu'il s'agit d'un grand projet pertinent, nous pouvons avoir besoin de quelque chose de réutilisable . C'est quelque chose que je suis venu avec l'aide de SO.

confirmDelete.jsp

<!-- Modal Dialog -->
<div class="modal fade" id="confirmDelete" role="dialog" aria-labelledby="confirmDeleteLabel"
 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">&times;</button>
            <h4 class="modal-title">Delete Parmanently</h4>
        </div>
        <div class="modal-body" style="height: 75px">
            <p>Are you sure about this ?</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" id="confirm-delete-ok">Ok
            </button>
        </div>
    </div>
</div>

<script type="text/javascript">

    var url_for_deletion = "#";
    var success_redirect = window.location.href;

$('#confirmDelete').on('show.bs.modal', function (e) {
    var message = $(e.relatedTarget).attr('data-message');
    $(this).find('.modal-body p').text(message);
    var title = $(e.relatedTarget).attr('data-title');
    $(this).find('.modal-title').text(title);

    if (typeof  $(e.relatedTarget).attr('data-url') != 'undefined') {
        url_for_deletion = $(e.relatedTarget).attr('data-url');
    }
    if (typeof  $(e.relatedTarget).attr('data-success-url') != 'undefined') {
        success_redirect = $(e.relatedTarget).attr('data-success-url');
    }

});

<!-- Form confirm (yes/ok) handler, submits form -->
$('#confirmDelete').find('.modal-footer #confirm-delete-ok').on('click', function () {
    $.ajax({
        method: "delete",
        url: url_for_deletion,
    }).success(function (data) {
        window.location.href = success_redirect;
    }).fail(function (error) {
        console.log(error);
    });
    $('#confirmDelete').modal('hide');
    return false;
});
<script/>

reusingPage.jsp

<a href="#" class="table-link danger"
data-toggle="modal"
data-target="#confirmDelete"
data-title="Delete Something"
data-message="Are you sure you want to inactivate this something?"
data-url="client/32"
id="delete-client-32">
</a>
<!-- jQuery should come before this -->
<%@ include file="../some/path/confirmDelete.jsp" %>

Remarque: Cela utilise la méthode de suppression http pour la demande de suppression, vous pouvez le modifier à partir de javascript ou, l'envoyer en utilisant un attribut de données comme dans data-title ou data-url etc., pour prendre en charge toute demande.

Maleen Abewardana
la source
0

Si vous voulez le faire dans le raccourci le plus simple, alors vous pouvez le faire avec ce plugin .


Mais ce plugin est une implémentation alternative utilisant Bootstrap Modal . Et la véritable implémentation de Bootstrap est également très facile, donc je n'aime pas utiliser ce plugin car il ajoute un excès de contenu JS dans la page, ce qui ralentira le temps de chargement de la page.


Idée

J'aime le mettre en œuvre par moi-même de cette façon-

  1. Si l' utilisateur clique sur s sur un bouton pour supprimer un élément de la liste, un appel JS mettra l' ID d'article (ou toute autre donnée essentielle) sous une forme dans le modal.
  2. Ensuite, dans la fenêtre contextuelle, il y aura 2 boutons pour la confirmation.

    • Oui soumettra le formulaire (avec ajax ou formulaire direct soumettre)
    • Non rejettera simplement le modal

Le code sera comme ceci (en utilisant Bootstrap ) -

<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<script>
$(document).ready(function()
{
    $("button").click(function()
    {
        //Say - $('p').get(0).id - this delete item id
        $("#delete_item_id").val( $('p').get(0).id );
        $('#delete_confirmation_modal').modal('show');
    });
});
</script>

<p id="1">This is a item to delete.</p>

<button type="button" class="btn btn-danger">Delete</button>

<!-- Delete Modal content-->

<div class="modal fade" id="delete_confirmation_modal" role="dialog" style="display: none;">
	<div class="modal-dialog" style="margin-top: 260.5px;">
				<div class="modal-content">
			<div class="modal-header">
				<button type="button" class="close" data-dismiss="modal">×</button>
				<h4 class="modal-title">Do you really want to delete this Category?</h4>
			</div>
			<form role="form" method="post" action="category_delete" id="delete_data">
				<input type="hidden" id="delete_item_id" name="id" value="12">
				<div class="modal-footer">
					<button type="submit" class="btn btn-danger">Yes</button>
					<button type="button" class="btn btn-primary" data-dismiss="modal">No</button>
				</div>
			</form>
		</div>

	</div>
</div>

Vous devez modifier l'action du formulaire en fonction de vos besoins.

Revêtement heureux :)

Abrar Jahin
la source
0

Recette POST avec navigation vers la page cible et fichier Blade réutilisable

La réponse de dfsq est très agréable. Je l'ai modifié un peu pour répondre à mes besoins: j'avais en fait besoin d'un modal pour le cas où, après avoir cliqué, l'utilisateur serait également dirigé vers la page correspondante. L'exécution asynchrone de la requête n'est pas toujours ce dont on a besoin.

En utilisant Bladej'ai créé le fichier resources/views/includes/confirmation_modal.blade.php:

<div class="modal fade" id="confirmation-modal" tabindex="-1" role="dialog" aria-labelledby="confirmation-modal-label" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4>{{ $headerText }}</h4>
            </div>
            <div class="modal-body">
                {{ $bodyText }}
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
                <form action="" method="POST" style="display:inline">
                    {{ method_field($verb) }}
                    {{ csrf_field() }}
                    <input type="submit" class="btn btn-danger btn-ok" value="{{ $confirmButtonText }}" />
                </form>
            </div>
        </div>
    </div>
</div>

<script>
    $('#confirmation-modal').on('show.bs.modal', function(e) {
        href = $(e.relatedTarget).data('href');

        // change href of button to corresponding target
        $(this).find('form').attr('action', href);
    });
</script>

Maintenant, son utilisation est simple:

<a data-href="{{ route('data.destroy', ['id' => $data->id]) }}" data-toggle="modal" data-target="#confirmation-modal" class="btn btn-sm btn-danger">Remove</a>

Pas beaucoup de changement ici et le modal peut être inclus comme ceci:

@include('includes.confirmation_modal', ['headerText' => 'Delete Data?', 'bodyText' => 'Do you really want to delete these data? This operation is irreversible.',
'confirmButtonText' => 'Remove Data', 'verb' => 'DELETE'])

Juste en y mettant le verbe, il l'utilise. De cette façon, CSRF est également utilisé.

Cela m'a aidé, peut-être que ça aide quelqu'un d'autre.

Feu de glace
la source