Löschen im Modal / Dialog mit Twitter Bootstrap bestätigen?

284

Ich habe eine HTML-Tabelle mit Zeilen, die an Datenbankzeilen gebunden sind. Ich hätte gerne einen Link zum Löschen einer Zeile für jede Zeile, möchte dies aber vorher mit dem Benutzer bestätigen.

Gibt es eine Möglichkeit, dies über den modalen Twitter-Bootstrap-Dialog zu tun?

SWL
quelle
4
jsfiddle.net/MjmVr/363
joni jones
3
Nachdem ich auf diese Frage gestoßen war, wollte ich (wie mir scheint) eine so einfache und optimierte "Lösung" für dieses Problem finden. Ich hatte eine Weile damit zu kämpfen und erkannte dann, wie einfach es sein kann: Setzen Sie einfach die eigentliche Schaltfläche zum Senden von Formularen in den modalen Dialog, und dann löst die Schaltfläche zum Senden im Formular selbst nur das Dialogfenster aus ... Problem gelöst.
Michael Doleman
@ Jonijones dieses Beispiel funktioniert nicht für mich (die Bestätigungsmeldung wird beim Klicken auf die erste Schaltfläche nicht angezeigt) - getestet in Chrome
egmfrs

Antworten:

396

Rezept bekommen

Für diese Aufgabe können Sie bereits verfügbare Plugins und Bootstrap-Erweiterungen verwenden. Oder Sie können Ihr eigenes Bestätigungs-Popup mit nur 3 Codezeilen erstellen. Hör zu.

Angenommen, wir haben diese Links (Notiz data-hrefstatt href) oder Schaltflächen, für die wir eine Löschbestätigung wünschen:

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

Hier #confirm-deleteverweist auf ein modales Popup-Div in Ihrem HTML. Die Schaltfläche "OK" sollte wie folgt konfiguriert sein:

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

Jetzt brauchen Sie nur noch dieses kleine Javascript, um eine Löschaktion zu bestätigen:

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

Bei einem show.bs.modalEreignis wird die Schaltfläche hrefzum Löschen auf URL mit der entsprechenden Datensatz-ID gesetzt.

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


POST Rezept

Mir ist klar, dass in einigen Fällen möglicherweise eine POST- oder DELETE-Anforderung anstelle von GET erforderlich ist. Es ist immer noch ziemlich einfach ohne zu viel Code. Schauen Sie sich die folgende Demo mit diesem Ansatz an:

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

Hier ist eine Originalversion des Codes, den ich bei der Beantwortung dieser Frage für Bootstrap 2.3 modal erstellt habe.

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

dfsq
quelle
1
Dies funktioniert fast perfekt, aber selbst in der Geigenversion (wie auf meiner Website) wird die ID im Modal nicht an die Schaltfläche "Ja" übergeben. Ich habe bemerkt, dass Sie versuchen, & ref anstelle von ? Ref zu ersetzen, also habe ich versucht, das zu ändern, aber es funktioniert immer noch nicht. Vermisse ich hier noch etwas? Das ist ansonsten toll, also TIA für deine Hilfe!
SWL
Danke @dfsq - das hat wunderbar funktioniert. Der Dialog wird beim Klicken auf die Schaltfläche "Nein" nicht ausgeblendet, daher habe ich die href in "#" geändert und nicht in "modal hide". Das funktioniert auch. Danke nochmal für deine Hilfe.
SWL
22
Eine Optimierung ist, dass die endgültige Löschanforderung zu einem Beitrag führen sollte, nicht zu einem GEt, wie Sie es mit einem Link tun würden. Wenn Sie Löschen auf einem GET zulassen, können böswillige Dritte leicht Links auf Websites oder E-Mails erstellen, die dazu führen, dass Benutzer unabsichtlich Dinge löschen. Es mag albern erscheinen, aber es gibt Szenarien, in denen dies ein ernstes Sicherheitsproblem darstellt.
AaronLS
2
Vielleicht möchten Sie einen Blick auf Vex werfen . So viel einfacher zu tun, was Sie verlangen: jsfiddle.net/adamschwartz/hQump .
Adam
3
Versuchung, für die Verwendung eines GET zur Durchführung einer destruktiven Aktion eine Ablehnung vorzunehmen. Es gibt viele, viele verschiedene Gründe, warum Sie das niemals tun sollten.
NickG
158

http://bootboxjs.com/ - Die neuesten Funktionen funktionieren mit Bootstrap 3.0.0

Das einfachste mögliche Beispiel:

bootbox.alert("Hello world!"); 

Von der Website:

Die Bibliothek stellt drei Methoden zur Verfügung, mit denen die nativen JavaScript-Entsprechungen nachgeahmt werden können. Ihre genauen Methodensignaturen sind flexibel, da jeder verschiedene Parameter verwenden kann, um Beschriftungen anzupassen und Standardeinstellungen anzugeben. Am häufigsten werden sie jedoch so genannt:

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

Hier ist ein Ausschnitt davon in Aktion (klicken Sie unten auf "Code-Snippet ausführen"):

$(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
quelle
2
Unglücklicherweise müssen Sie in dem Moment, in dem Sie nicht-englischen Text für Titel und Schaltflächen benötigen, entweder die JS ändern oder mit der Parametrisierung beginnen, fast so viel wie nur das Hinzufügen des Bootstrap-HTML und der JS selbst. :)
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
quelle
1
Es ist ein alter Beitrag, aber ich möchte das Gleiche tun, aber wenn ich den obigen Code verwende, wird der modale Dialog angezeigt.
Saurabh
28

Ich würde erkennen, dass es eine sehr alte Frage ist, aber seit ich mich heute nach einer effizienteren Methode für den Umgang mit den Bootstrap-Modalen gefragt habe. Ich habe einige Nachforschungen angestellt und etwas Besseres gefunden als die oben gezeigten Lösungen, die unter diesem Link zu finden sind:

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

Laden Sie zuerst die Abfrage

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

Dann stellen Sie einfach eine Frage / Bestätigung an href:

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

Auf diese Weise ist das Bestätigungsmodal viel universeller und kann daher problemlos in anderen Teilen Ihrer Website wiederverwendet werden.

Arjan
quelle
4
Bitte posten Sie keine Code aus anderen Quellen ohne Namensnennung: petefreitag.com/item/809.cfm .
A. Webb
4
Obwohl die Operation die Zuschreibung zunächst vergessen hatte, war dies die perfekte Sache für mich. Klappt wunderbar.
Janis Peisenieks
3
Ich denke, es ist keine gute Idee, Elemente mit einer GET http-Anfrage zu löschen
Miguel Prz
7
Mama sagte mir, ich solle keine kalten Fusion-Links anklicken
Mike Purcell
3
@BenY Es geht nicht darum, ob der Benutzer die Berechtigung hat, Dinge zu tun oder nicht, es geht um böswillige Benutzer, die bereits die Berechtigung haben, Dinge zu tun, die dazu verleitet werden, auf Links auf anderen Websites, E-Mails usw. zu klicken, damit der böswillige Benutzer die Berechtigungen dieses Benutzers nutzen kann.
Brett
17

Dank der Lösung von @ Jousby gelang es mir auch, meine zum Laufen zu bringen, aber ich musste das modale Bootstrap-Markup seiner Lösung ein wenig verbessern, damit es korrekt gerendert wird, wie in den offiziellen Beispielen gezeigt .

Hier ist meine modifizierte Version der generischen confirmFunktion, die gut funktioniert hat:

/* 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
quelle
3
Tolle Lösung hier. Ich habe einige geringfügige Änderungen vorgenommen, um einen Rückruf für den Abbruchlink zu behandeln. Eine kleine Empfehlung verwenden Sie #! anstelle von # in Ihrer href, um zu verhindern, dass die Seite nach oben scrollt.
Domenic D.
Wenn ich das verdoppeln könnte, würde ich es tun. Schön und elegant. Danke dir.
Nigel Johnson
Sehr schöne Lösung. Eine weitere Verbesserung, die ich vorschlagen kann, besteht darin, ein weiteres Argument hinzuzufügen: btnType = "btn-primary"und dann den Code für die Schaltfläche OK zu ändern class="btn ' + btnType + '". Auf diese Weise kann ein optionales Argument übergeben werden, um das Erscheinungsbild der Schaltfläche OK zu ändern, beispielsweise beim btn-dangerLöschen.
IamNaN
Danke dir. Ich musste die Tags <h3> und <a> (zuerst h3) vertauschen, damit dies korrekt gerendert wurde.
Dave Dawkins
10

Ich fand das nützlich und einfach zu bedienen, und es sieht hübsch aus: http://maxailloud.github.io/confirm-bootstrap/ .

Um es zu verwenden, fügen Sie die .js-Datei in Ihre Seite ein und führen Sie dann Folgendes aus:

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

Es gibt verschiedene Optionen, die Sie darauf anwenden können, damit es beim Bestätigen eines Löschvorgangs besser aussieht. Ich verwende:

$('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
quelle
das ist eine schöne lib
loretoparisi
4

Ich kann diese Art von Aufgabe leicht mit der Bibliothek bootbox.js erledigen. Zuerst müssen Sie die Bootbox-JS-Datei einschließen. Dann schreiben Sie in Ihrer Event-Handler-Funktion einfach folgenden Code:

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

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

    });

Offizielle Bootbox- Site

karim_fci
quelle
2

Die folgende Lösung ist besser als bootbox.js , weil

  • Es kann alles, was bootbox.js kann;
  • Die Verwendungssyntax ist einfacher
  • Sie können die Farbe Ihrer Nachricht mithilfe von "Fehler", "Warnung" oder "Info" elegant steuern.
  • Die Bootbox ist 986 Zeilen lang, meine nur 110 Zeilen

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

So verwenden Sie 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>
Geben Sie hier die Bildbeschreibung ein

Dummer Kerl
quelle
1

Sie können versuchen, meine Lösung mit Rückruffunktion wiederverwendbarer zu machen . In dieser Funktion können Sie eine POST-Anforderung oder eine Logik verwenden. Verwendete Bibliotheken: JQuery 3> und Bootstrap 3> .

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

HTML-Code zum Testen:

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

Wenn es um ein relevant großes Projekt geht, benötigen wir möglicherweise etwas Wiederverwendbares . Dies ist etwas, mit dem ich mit Hilfe von SO gekommen bin.

verifyDelete.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" %>

Hinweis: Hierbei wird die http-Löschmethode zum Löschen von Anforderungen verwendet. Sie können sie von Javascript aus ändern oder sie mithilfe eines Datenattributs wie Datentitel oder Daten-URL usw. senden, um jede Anforderung zu unterstützen.

Maleen Abewardana
quelle
0

Wenn Sie es in der einfachsten Verknüpfung tun möchten, dann können Sie es mit diesem Plugin tun .


Dieses Plugin ist jedoch eine alternative Implementierung mit Bootstrap Modal . Eine echte Bootstrap-Implementierung ist ebenfalls sehr einfach. Daher verwende ich dieses Plugin nicht gern, da es der Seite überschüssigen JS-Inhalt hinzufügt, wodurch die Ladezeit der Seite verlangsamt wird.


Idee

Ich implementiere es gerne selbst auf diese Weise.

  1. Wenn der Benutzer auf eine Schaltfläche klickt , um ein Element aus der Liste zu löschen, wird ein JS-Aufruf ausgeführt ID (oder weitere wichtige Daten) in ein Formular im Modal ein.
  2. Dann gibt es im Popup 2 Schaltflächen zur Bestätigung.

    • Ja wird das Formular senden (mit Ajax oder direktem Formular senden)
    • Nein wird nur das Modal entlassen

Der Code wird so sein (mit 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>

Sie sollten die Formularaktion entsprechend Ihren Anforderungen ändern.

Viel Spaß beim Coading :)

Abrar Jahin
quelle
0

POST-Rezept mit Navigation zur Zielseite und wiederverwendbarer Blade-Datei

Die Antwort von dfsq ist sehr nett. Ich habe es ein wenig an meine Bedürfnisse angepasst: Ich brauchte tatsächlich ein Modal für den Fall, dass der Benutzer nach dem Klicken auch zur entsprechenden Seite navigiert wird. Die asynchrone Ausführung der Abfrage ist nicht immer das, was man braucht.

Mit BladeIch habe die Datei erstellt 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>

Jetzt ist die Verwendung einfach:

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

Hier hat sich nicht viel geändert und das Modal kann folgendermaßen aufgenommen werden:

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

Nur indem das Verb dort eingefügt wird, wird es verwendet. Auf diese Weise wird auch CSRF verwendet.

Hat mir geholfen, vielleicht hilft es jemand anderem.

Eisfeuer
quelle