Confermare la cancellazione in modale / dialog usando Twitter Bootstrap?


285

Ho una tabella di righe HTML legata alle righe del database. Vorrei avere un link "Elimina riga" per ogni riga, ma vorrei confermare prima con l'utente.

Esiste un modo per farlo utilizzando la finestra di dialogo modale Bootstrap di Twitter?



3
Avendo incontrato questa domanda, volevo entrare in contatto con (ciò che mi sembra) una "correzione" così semplice e più snella per questo problema. Ho faticato per un po 'e poi ho capito quanto possa essere semplice: basta inserire il pulsante di invio del modulo effettivo nella finestra di dialogo modale, quindi il pulsante di invio sul modulo stesso non fa altro che attivare la finestra di dialogo ... problema risolto.
Michael Doleman,

@jonijones questo esempio non funziona per me (il messaggio di conferma non viene visualizzato al clic del primo pulsante) - testato in chrome
egmfrs

Risposte:


397

OTTIENI la ricetta

Per questa attività è possibile utilizzare plug-in ed estensioni bootstrap già disponibili. Oppure puoi creare il tuo popup di conferma con solo 3 righe di codice. Controlla.

Supponiamo di avere questo link (nota data-hrefinvece di href) o pulsanti per i quali vogliamo avere la conferma dell'eliminazione per:

<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>

Qui #confirm-deletepunta a un div popup modale nel tuo HTML. Dovrebbe avere un pulsante "OK" configurato in questo modo:

<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>

Ora hai solo bisogno di questo piccolo javascript per confermare un'azione di eliminazione:

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

Quindi il show.bs.modalpulsante di eliminazione evento hrefè impostato su URL con ID record corrispondente.

Demo: http://plnkr.co/edit/NePR0BQf3VmKtuMmhVR7?p=preview


Ricetta POST

Mi rendo conto che in alcuni casi potrebbe essere necessario eseguire la richiesta POST o DELETE anziché GET. È ancora piuttosto semplice senza troppo codice. Dai un'occhiata alla demo qui sotto con questo approccio:

// 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);
});

Demo: http://plnkr.co/edit/V4GUuSueuuxiGr4L9LmG?p=preview


Bootstrap 2.3

Ecco una versione originale del codice che ho creato mentre rispondevo a questa domanda per Bootstrap 2.3 modale.

$('#modal').on('show', function() {
    var id = $(this).data('id'),
        removeBtn = $(this).find('.danger');
    removeBtn.attr('href', removeBtn.attr('href').replace(/(&|\?)ref=\d*/, '$1ref=' + id));
});

Demo : http://jsfiddle.net/MjmVr/1595/


1
Funziona quasi perfettamente, ma anche nella versione violino (come nel mio sito), l'id non viene passato al pulsante Sì nel modale. Ho notato che stai cercando di sostituire e ref invece di ? Ref, quindi ho provato a cambiarlo ma non funziona ancora. Mi sto perdendo qualcos'altro qui? Altrimenti è fantastico, quindi TIA per il tuo aiuto!
SWL,

Grazie @dfsq - ha funzionato magnificamente. La finestra di dialogo non si nasconde facendo clic sul pulsante "no", quindi ho cambiato l'href in # anziché il nascondiglio modale e anche quello funziona. Grazie ancora per il vostro aiuto.
SWL,

22
Un accorgimento è che la richiesta di eliminazione finale dovrebbe comportare un post, non un GEt come faresti con un link. Se si consente l'eliminazione di un GET, le terze parti dannose possono facilmente creare collegamenti su siti o e-mail che causano l'eliminazione involontaria di cose dell'utente. Potrebbe sembrare sciocco, ma ci sono scenari in cui questo sarebbe un grave problema di sicurezza.
AaronLS

2
Potresti dare un'occhiata a Vex . Molto più semplice fare quello che stai chiedendo: jsfiddle.net/adamschwartz/hQump .
Adam,

3
Tentato di sottovalutare per l'utilizzo di un GET per eseguire un'azione distruttiva. Ci sono molte, molte ragioni diverse per cui non dovresti mai farlo.
NickG,

158

http://bootboxjs.com/ - gli ultimi lavori con Bootstrap 3.0.0

L'esempio più semplice possibile:

bootbox.alert("Hello world!"); 

Dal sito:

La libreria espone tre metodi progettati per imitare i loro equivalenti JavaScript nativi. Le loro firme del metodo esatto sono flessibili in quanto ognuna può accettare vari parametri per personalizzare le etichette e specificare i valori predefiniti, ma sono più comunemente chiamati in questo modo:

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

Eccone uno snippet in azione (fai clic su "Esegui snippet di codice" di seguito):

$(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>


2
Sfortunatamente, nel momento in cui hai bisogno di un testo non inglese sul titolo e sui pulsanti devi modificare JS o iniziare a parametrizzare quasi quanto aggiungere semplicemente il bootstrap html e JS da solo. :)
Johncl il

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);

  });

1
È un vecchio post, ma voglio fare la stessa cosa, ma quando uso il codice sopra, la finestra di dialogo modale mostra il dosaggio?
Saurabh,

28

Mi rendo conto che è una domanda molto antica, ma dal momento che mi chiedevo oggi un metodo più efficiente per gestire le modali bootstrap. Ho fatto qualche ricerca e ho trovato qualcosa di meglio delle soluzioni mostrate sopra, che possono essere trovate a questo link:

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

Prima carica il 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;
    });
});

Quindi fai qualsiasi domanda / conferma a href:

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

In questo modo il modale di conferma è molto più universale e quindi può essere facilmente riutilizzato su altre parti del tuo sito web.


4
Si prega di non pubblicare codice da altre fonti senza attribuzione: petefreitag.com/item/809.cfm .
A. Webb,

4
Anche se inizialmente l'operazione ha dimenticato l'attribuzione, questa è stata la cosa perfetta per me. Funziona come un fascino.
Janis Peisenieks,

3
Penso che non sia una buona idea eliminare elementi con una richiesta GET http
Miguel Prz,

7
La mamma mi ha detto di non fare clic su collegamenti a fusione fredda
Mike Purcell,

3
@BenY Non si tratta di stabilire se l'utente ha il permesso di fare o meno le cose, si tratta di utenti malintenzionati che hanno già il permesso di fare cose indotte a fare clic su collegamenti su altri siti, e-mail ecc. In modo che l'utente malintenzionato possa trarre vantaggio dalle autorizzazioni degli utenti.
Brett,

17

Grazie alla soluzione di @ Jousby , sono riuscito a far funzionare anche la mia, ma ho scoperto che dovevo migliorare un po 'il markup modale Bootstrap della sua soluzione per renderlo correttamente come dimostrato negli esempi ufficiali .

Quindi, ecco la mia versione modificata della confirmfunzione generica che ha funzionato bene:

/* 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 */

3
Ottima soluzione qui. Ho apportato alcune lievi modifiche per gestire un callback per il link di annullamento. Una piccola raccomandazione usa #! invece di # nel tuo href per impedire alla pagina di scorrere verso l'alto.
Domenic D.

Se potessi raddoppiare il voto, lo farei. Bello ed elegante. Grazie.
Nigel Johnson,

Soluzione molto bella. Un ulteriore miglioramento che posso suggerire è quello di aggiungere un altro argomento: btnType = "btn-primary"e quindi modificare il codice affinché il pulsante OK contenga class="btn ' + btnType + '". In questo modo è possibile passare un argomento facoltativo per modificare l'aspetto del pulsante OK, come btn-dangerper una cancellazione.
IamNaN,

Grazie. Ho dovuto scambiare i tag <h3> e <a> (prima h3) per renderlo correttamente.
Dave Dawkins,

10

Ho trovato questo utile e facile da usare, inoltre sembra carino: http://maxailloud.github.io/confirm-bootstrap/ .

Per usarlo, includi il file .js nella tua pagina, quindi esegui:

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

Ci sono varie opzioni che puoi applicare ad esso, per farlo sembrare migliore quando lo faccio per confermare una cancellazione, io uso:

$('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..
    }
});

è una bella lib
loretoparisi,

4

Posso facilmente gestire questo tipo di attività utilizzando la libreria bootbox.js. All'inizio è necessario includere il file JS bootbox. Quindi nella funzione del gestore eventi scrivi semplicemente il seguente codice:

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

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

    });

Bootboxjs Offical sito


2

La seguente soluzione è migliore di bootbox.js , perché

  • Può fare tutto ciò che bootbox.js può fare;
  • La sintassi dell'uso è più semplice
  • Ti permette di controllare elegantemente il colore del tuo messaggio usando "errore", "avviso" o "info"
  • Bootbox è lungo 986 linee, il mio solo 110 linee

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');
}

Per utilizzare 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>
inserisci qui la descrizione dell'immagine


1

Puoi provare più riutilizzabile la mia soluzione con la funzione di callback . In questa funzione è possibile utilizzare la richiesta POST o della logica. Librerie usate: JQuery 3> e Bootstrap 3> .

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

Codice HTML per il 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';
};

0

Quando si tratta di un progetto rilevante, potremmo aver bisogno di qualcosa di riutilizzabile . Questo è qualcosa con cui sono venuto in aiuto di 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" %>

Nota: utilizza il metodo di eliminazione http per la richiesta di eliminazione, puoi cambiarlo da javascript o puoi inviarlo utilizzando un attributo di dati come in data-title o data-url ecc., Per supportare qualsiasi richiesta.


0

Se vuoi farlo con il collegamento più semplice, puoi farlo con questo plugin .


Ma questo plugin è un'implementazione alternativa che utilizza Bootstrap Modal . E l'implementazione di Bootstrap è anche molto semplice, quindi non mi piace usare questo plugin perché aggiunge contenuti JS in eccesso nella pagina, che rallenterà il tempo di caricamento della pagina.


Idea

Mi piace implementarlo da solo in questo modo-

  1. Se l' utente fa clic su un pulsante per eliminare un elemento dall'elenco, una chiamata JS inserirà l' ID oggetto (o qualsiasi altro dato essenziale) in un modulo nel modale.
  2. Quindi nel pop-up, ci saranno 2 pulsanti per la conferma.

    • invierà il modulo (con ajax o invio diretto del modulo)
    • No respingerà semplicemente il modale

Il codice sarà così (usando 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>

È necessario modificare l'azione del modulo in base alle proprie esigenze.

Felice coading :)


0

Ricetta POST con navigazione alla pagina di destinazione e file Blade riutilizzabile

La risposta di dfsq è molto bella. L'ho modificato un po 'per adattarmi alle mie esigenze: in realtà avevo bisogno di un modale per il caso che, dopo aver fatto clic, l'utente fosse anche passato alla pagina corrispondente. Eseguire la query in modo asincrono non è sempre ciò di cui si ha bisogno.

Utilizzando Bladeho creato il file 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>

Ora, usarlo è semplice:

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

Qui non è cambiato molto e il modale può essere incluso in questo modo:

@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'])

Semplicemente inserendo il verbo, lo usa. In questo modo viene utilizzato anche CSRF.

Mi ha aiutato, forse aiuta qualcun altro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.