¿Confirmar la eliminación en modal / dialog usando Twitter Bootstrap?


284

Tengo una tabla HTML de filas vinculadas a filas de la base de datos. Me gustaría tener un enlace "eliminar fila" para cada fila, pero me gustaría confirmar con el usuario de antemano.

¿Hay alguna manera de hacer esto usando el diálogo modal de Twitter Bootstrap?



3
Después de haber encontrado esta pregunta, quería intervenir (lo que me parece) una "solución" tan simple y simplificada para este problema. Luché con eso por un tiempo y luego me di cuenta de lo simple que puede ser: solo coloque el botón de envío de formulario real en el cuadro de diálogo modal, y luego el botón de envío en el formulario en sí no hace más que disparar la ventana de diálogo ... problema resuelto.
Michael Doleman

@jonijones este ejemplo no me funciona (el mensaje de confirmación no se muestra al hacer clic en el primer botón) - probado en cromo
egmfrs

Respuestas:


396

OBTENER receta

Para esta tarea, puede usar complementos y extensiones de arranque ya disponibles. O puede hacer su propia ventana emergente de confirmación con solo 3 líneas de código. Echale un vistazo.

Supongamos que tenemos estos enlaces (nota en data-hreflugar de href) o botones para los que queremos tener confirmación de eliminación:

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

Aquí #confirm-deleteapunta a un div emergente modal en su HTML. Debería tener un botón "Aceptar" configurado de esta manera:

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

Ahora solo necesita este pequeño javascript para hacer confirmable una acción de eliminación:

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

Por lo tanto, el show.bs.modalbotón de eliminación de evento hrefestá configurado en URL con la identificación de registro correspondiente.

Demostración: http://plnkr.co/edit/NePR0BQf3VmKtuMmhVR7?p=preview


POST receta

Me doy cuenta de que en algunos casos puede ser necesario realizar una solicitud POST o DELETE en lugar de GET. Todavía es bastante simple sin demasiado código. Eche un vistazo a la demostración a continuación con este enfoque:

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

Demostración: http://plnkr.co/edit/V4GUuSueuuxiGr4L9LmG?p=preview


Bootstrap 2.3

Aquí hay una versión original del código que hice cuando respondía esta pregunta para el modal 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));
});

Demostración : http://jsfiddle.net/MjmVr/1595/


1
Esto funciona casi perfectamente, pero incluso en la versión de violín (como en mi sitio), la identificación no se pasa al botón Sí en el modal. Me di cuenta de que estás tratando de reemplazar & ref en lugar de ? Ref, así que intenté cambiar eso pero todavía no funciona. ¿Me estoy perdiendo algo más aquí? Por lo demás, esto es genial, así que TIA por tu ayuda.
SWL

Gracias @dfsq, esto funcionó muy bien. El diálogo no se oculta al hacer clic en el botón 'no', así que cambié el href a # en lugar del oculto modal y eso también funciona. De nuevo, gracias por tu ayuda.
SWL

22
Un ajuste es que la solicitud de eliminación final debería generar una publicación, no una GEt como lo haría con un enlace. Si permite Eliminar en un GET, los terceros malintencionados pueden crear fácilmente enlaces en sitios o correos electrónicos que hacen que su usuario elimine involuntariamente cosas. Puede parecer una tontería, pero hay escenarios en los que esto sería un grave problema de seguridad.
AaronLS

2
Es posible que desee echar un vistazo a Vex . Mucho más simple de hacer lo que estás pidiendo: jsfiddle.net/adamschwartz/hQump .
Adam

3
Tentado a rechazar por usar un GET para realizar una acción destructiva. Hay muchas, muchas razones diferentes por las que nunca debes hacer eso.
NickG

158

http://bootboxjs.com/ - últimos trabajos con Bootstrap 3.0.0

El ejemplo más simple posible:

bootbox.alert("Hello world!"); 

Desde el sitio:

La biblioteca expone tres métodos diseñados para imitar sus equivalentes nativos de JavaScript. Sus firmas de método exactas son flexibles, ya que cada una puede tomar varios parámetros para personalizar las etiquetas y especificar valores predeterminados, pero comúnmente se llaman así:

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

Aquí hay un fragmento de él en acción (haga clic en "Ejecutar fragmento de código" a continuación):

$(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
Desafortunadamente, en el momento en que necesita texto que no esté en inglés sobre el título y los botones, debe modificar el JS o comenzar a parametrizar casi tanto como simplemente agregar el html de arranque y JS usted mismo. :)
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);

  });

1
Es una publicación antigua, pero quiero hacer lo mismo, pero cuando uso el código anterior, ¿aparece el diálogo modal no?
Saurabh

28

Me di cuenta de que es una pregunta muy antigua, pero desde que me preguntaba hoy por un método más eficiente para manejar los modales de arranque. Investigué un poco y encontré algo mejor que las soluciones que se muestran arriba, que se pueden encontrar en este enlace:

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

Primero cargue el 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;
    });
});

Entonces solo haga cualquier pregunta / confirmación a href:

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

De esta forma, el modo de confirmación es mucho más universal y, por lo tanto, puede reutilizarse fácilmente en otras partes de su sitio web.


44
No publique código de otras fuentes sin atribución: petefreitag.com/item/809.cfm .
A. Webb

44
Aunque el operador olvidó la atribución al principio, esto fue lo perfecto para mí. Funciona de maravilla.
Janis Peisenieks

3
Creo que no es una buena idea eliminar elementos con una solicitud GET http
Miguel Prz

77
Mamá me dijo que no haga clic en ningún enlace de fusión fría
Mike Purcell

3
@BenY No se trata de si el usuario tiene permiso para hacer cosas o no, se trata de usuarios malintencionados que ya tienen permiso para hacer que las cosas sean engañadas para hacer clic en enlaces en otros sitios, correos electrónicos, etc. para que el usuario malintencionado pueda aprovechar los permisos de los usuarios.
Brett

17

Gracias a la solución de @ Jousby , logré que el mío funcionara también, pero descubrí que tenía que mejorar un poco el marcado modal Bootstrap de su solución para que se procesara correctamente como se demostró en los ejemplos oficiales .

Entonces, aquí está mi versión modificada de la confirmfunción genérica que funcionó 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 */

3
Gran solución aquí. Hice algunas modificaciones leves para manejar una devolución de llamada para el enlace cancelar. Una pequeña recomendación utiliza #! en lugar de # en su href para evitar que la página se desplace hacia arriba.
Domenic D.

Si pudiera duplicar el voto, lo haría. Agradable y elegante Gracias.
Nigel Johnson

Muy buena solución. Una mejora más que puedo sugerir es agregar otro argumento: btnType = "btn-primary"y luego cambiar el código para que contenga el botón Aceptar class="btn ' + btnType + '". De esa manera, se puede pasar un argumento opcional para cambiar la apariencia del botón Aceptar, como btn-dangerpara eliminar.
IamNaN

Gracias. Tuve que cambiar las etiquetas <h3> y <a> (h3 primero) para que esto se procesara correctamente.
Dave Dawkins

10

Encontré esto útil y fácil de usar, además se ve bonito: http://maxailloud.github.io/confirm-bootstrap/ .

Para usarlo, incluya el archivo .js en su página y luego ejecute:

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

Hay varias opciones que puede aplicar, para que se vea mejor al hacerlo para confirmar una eliminación, utilizo:

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

esa es una buena lib
loretoparisi

4

Puedo manejar fácilmente este tipo de tarea usando la biblioteca bootbox.js. Al principio, debe incluir el archivo JS de bootbox. Luego, en su función de controlador de eventos, simplemente escriba el siguiente código:

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

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

    });

Sitio oficial de bootboxjs


2

La siguiente solución es mejor que bootbox.js , porque

  • Puede hacer todo lo que bootbox.js puede hacer;
  • La sintaxis de uso es más simple
  • Le permite controlar con elegancia el color de su mensaje usando "error", "advertencia" o "información"
  • Bootbox tiene 986 líneas de largo, el mío solo 110 líneas de largo

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

Para usar 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>
ingrese la descripción de la imagen aquí


1

Puede probar mi solución más reutilizable con la función de devolución de llamada . En esta función puede usar la solicitud POST o alguna lógica. Bibliotecas utilizadas: JQuery 3> y Bootstrap 3> .

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

Código HTML para prueba:

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

Cuando se trata de un proyecto relevante relevante, es posible que necesitemos algo reutilizable . Esto es algo con lo que vine con la ayuda 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" %>

Nota: Esto utiliza el método de eliminación de http para la solicitud de eliminación, puede cambiarlo desde javascript o puede enviarlo utilizando un atributo de datos como en data-title o data-url, etc., para admitir cualquier solicitud.


0

Si quieres hacerlo en el atajo más fácil, entonces puedes hacerlo con este complemento .


Pero este complemento es una implementación alternativa que utiliza Bootstrap Modal . Y la implementación real de Bootstrap también es muy fácil, por lo que no me gusta usar este complemento porque agrega contenido JS en exceso en la página, lo que ralentizará el tiempo de carga de la página.


Idea

Me gusta implementarlo por mí mismo de esta manera.

  1. Si el usuario hace clic en un botón para eliminar un elemento de la lista, una llamada JS colocará la ID del elemento (o cualquier otro dato esencial) en un formulario en el modo.
  2. Luego, en la ventana emergente, habrá 2 botones para confirmar.

    • enviará el formulario (con ajax o envío directo del formulario)
    • No solo descartará el modal

El código será así (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>

Debe cambiar la acción del formulario de acuerdo con sus requisitos.

Feliz codificación :)


0

POST Receta con navegación a la página de destino y archivo Blade reutilizable

La respuesta de dfsq es muy buena. Lo modifiqué un poco para satisfacer mis necesidades: en realidad necesitaba un modal para el caso de que, después de hacer clic, el usuario también fuera navegado a la página correspondiente. Ejecutar la consulta de forma asincrónica no siempre es lo que uno necesita.

Usando Bladecreé el archivo 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>

Ahora, usarlo es sencillo:

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

No ha cambiado mucho aquí y el modal se puede incluir así:

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

Simplemente poniendo el verbo allí, lo usa. De esta manera, CSRF también se utiliza.

Me ayudó, tal vez ayude a alguien más.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.