Potwierdź usunięcie w trybie modalnym / dialogowym za pomocą Twitter Bootstrap?

284

Mam tabelę wierszy HTML powiązaną z wierszami bazy danych. Chciałbym mieć link „usuń wiersz” dla każdego wiersza, ale chciałbym wcześniej potwierdzić z użytkownikiem.

Czy można to zrobić za pomocą modalnego okna dialogowego Twitter Bootstrap?

SWL
źródło
4
jsfiddle.net/MjmVr/363
joni jones
3
Po zapoznaniu się z tym pytaniem chciałem wprowadzić (jak mi się wydaje) tak prostą i usprawnioną „poprawkę” dla tego problemu. Zmagałem się z nim przez chwilę, a potem zdałem sobie sprawę, jak proste może być: po prostu umieść przycisk rzeczywistego przesyłania formularza w modalnym oknie dialogowym, a następnie przycisk wysyłania na samym formularzu robi tylko okno dialogowe ... rozwiązany problem.
Michael Doleman,
@jonijones ten przykład nie działa dla mnie (komunikat potwierdzenia nie wyświetla się po kliknięciu pierwszego przycisku) - przetestowany w chrome
egmfrs

Odpowiedzi:

397

POBIERZ przepis

Do tego zadania możesz użyć już dostępnych wtyczek i rozszerzeń bootstrap. Możesz też utworzyć własne okienko z potwierdzeniem za pomocą zaledwie 3 linii kodu. Sprawdź to.

Powiedzmy, że mamy te linki (uwaga data-hrefzamiast href) lub przyciski, dla których chcemy usunąć potwierdzenie dla:

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

Tutaj #confirm-deletewskazuje na modalne okienko div w twoim HTML. Powinien mieć tak skonfigurowany przycisk „OK”:

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

Teraz potrzebujesz tylko tego małego javascript, aby potwierdzić działanie usuwania:

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

Tak więc w show.bs.modalprzypadku przycisku usuwania zdarzenia hrefustawiony jest adres URL z odpowiednim identyfikatorem rekordu.

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


Przepis POST

Zdaję sobie sprawę, że w niektórych przypadkach może być konieczne wykonanie żądania POST lub DELETE zamiast GET. To wciąż dość proste, bez zbyt dużej ilości kodu. Spójrz na poniższą wersję demo dzięki temu podejściu:

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

Oto oryginalna wersja kodu, który napisałem, kiedy odpowiadałem na to pytanie dotyczące modalu 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));
});

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

dfsq
źródło
1
Działa to prawie idealnie, ale nawet w wersji skrzypcowej (jak na mojej stronie) identyfikator nie jest przekazywany do przycisku Tak w module. Zauważyłem, że próbujesz zastąpić i odwołać zamiast ? Ref, więc próbowałem to zmienić, ale nadal nie działa. Czy brakuje mi czegoś jeszcze? Poza tym jest świetnie, więc TIA za pomoc!
SWL
Dzięki @dfsq - to działało pięknie. Okno dialogowe nie ukrywa się po kliknięciu przycisku „nie”, więc zmieniłem href na # zamiast modalnego ukrywania i to również działa. Jeszcze raz dziękuję za pomoc.
SWL
22
Jedna poprawka to ostatnia prośba o usunięcie powinna skutkować postem, a nie GEt, tak jak w przypadku linku. Jeśli zezwolisz na usuwanie w GET, złośliwe osoby trzecie mogą łatwo tworzyć linki do witryn lub wiadomości e-mail, które powodują, że użytkownik nieświadomie usuwa rzeczy. To może wydawać się głupie, ale istnieją scenariusze, w których byłby to poważny problem z bezpieczeństwem.
AaronLS
2
Możesz rzucić okiem na Vex . O wiele łatwiej zrobić to, o co prosisz: jsfiddle.net/adamschwartz/hQump .
Adam,
3
Kusiło, by oddać głos za użycie GET do przeprowadzenia destrukcyjnej akcji. Istnieje wiele różnych powodów, dla których nigdy nie powinieneś tego robić.
NickG
158

http://bootboxjs.com/ - najnowsze działa z Bootstrap 3.0.0

Najprostszy możliwy przykład:

bootbox.alert("Hello world!"); 

Ze strony:

Biblioteka udostępnia trzy metody naśladujące ich natywne odpowiedniki JavaScript. Ich dokładne podpisy metod są elastyczne, ponieważ każdy może przyjmować różne parametry w celu dostosowania etykiet i określenia wartości domyślnych, ale najczęściej są one nazywane w ten sposób:

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

Oto jego fragment w akcji (kliknij „Uruchom fragment kodu” poniżej):

$(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
źródło
2
Niestety, w chwili gdy potrzebujesz tytułu w języku innym niż angielski w tytule i przyciskach, musisz albo zmodyfikować JS, albo rozpocząć parametryzację prawie tak samo, jak sam dodając html bootstrap i JS. :)
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
źródło
1
Jest to stary post, ale chcę zrobić to samo, ale kiedy używam powyższego kodu, modalne okno dialogowe nie jest wyświetlane?
Saurabh
28

Uświadomiłbym sobie, że to bardzo stare pytanie, ale ponieważ zastanawiałem się dzisiaj nad bardziej wydajną metodą obsługi modów bootstrap. Przeprowadziłem badania i znalazłem coś lepszego niż rozwiązania pokazane powyżej, które można znaleźć pod tym linkiem:

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

Najpierw załaduj 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;
    });
});

Następnie po prostu zadaj dowolne pytanie / potwierdzenie, aby:

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

W ten sposób moduł potwierdzania jest o wiele bardziej uniwersalny i dlatego można go łatwo użyć ponownie w innych częściach witryny.

Arjan
źródło
4
Nie wysyłaj kodu z innych źródeł bez podania źródła: petefreitag.com/item/809.cfm .
A. Webb,
4
Mimo, że operacja początkowo zapomniała o uznaniu, była to dla mnie idealna rzecz. Działa jak marzenie.
Janis Peisenieks
3
Myślę, że nie jest dobrym pomysłem usuwanie elementów za pomocą żądania GET http
Miguel Prz
7
Mama powiedziała mi, żebym nie klikał żadnych linków do fuzji na zimno
Mike Purcell,
3
@BenY Nie chodzi o to, czy użytkownik ma uprawnienia do robienia rzeczy, czy nie, chodzi o złośliwych użytkowników, którzy już mają pozwolenie na robienie rzeczy nakłanianych do klikania łączy w innych witrynach, wiadomościach e-mail itp., Aby złośliwy użytkownik mógł skorzystać z uprawnień tych użytkowników.
Brett
17

Dzięki rozwiązaniu @ Jousby'ego udało mi się również uruchomić moje, ale odkryłem, że muszę nieco poprawić znaczniki modalne Bootstrap jego rozwiązania, aby renderowanie było prawidłowe, jak pokazano w oficjalnych przykładach .

Oto moja zmodyfikowana wersja confirmfunkcji ogólnej, która działała dobrze:

/* 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
źródło
3
Świetne rozwiązanie tutaj. Wprowadziłem niewielkie modyfikacje, aby obsłużyć funkcję oddzwaniania dla łącza anulowania. Jedna mała rekomendacja użyj #! zamiast # w href, aby zapobiec przewijaniu strony do góry.
Domenic D.,
Gdybym mógł podwoić głosowanie, zrobiłbym to. Ładnie i elegancko. Dziękuję Ci.
Nigel Johnson
Bardzo fajne rozwiązanie. Jeszcze jedno ulepszenie, które mogę zasugerować, to dodanie kolejnego argumentu: btnType = "btn-primary"a następnie zmiana kodu, który ma zawierać przycisk OK class="btn ' + btnType + '". W ten sposób można przekazać opcjonalny argument, aby zmienić wygląd przycisku OK, tak jak btn-dangerw przypadku usuwania.
IamNaN
Dziękuję Ci. Musiałem zamienić znaczniki <h3> i <a> (najpierw h3), aby to renderowało poprawnie.
Dave Dawkins
10

Znalazłem to przydatne i łatwe w użyciu, a ponadto wygląda ładnie: http://maxailloud.github.io/confirm-bootstrap/ .

Aby z niego skorzystać, dołącz na stronie plik .js, a następnie uruchom:

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

Istnieją różne opcje, które możesz zastosować, aby poprawić wygląd podczas wykonywania operacji usuwania, używam:

$('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
źródło
to niezła lib
loretoparisi
4

Mogę z łatwością obsłużyć tego typu zadania za pomocą biblioteki bootbox.js. Najpierw musisz dołączyć plik JS bootboxa. Następnie w funkcji modułu obsługi zdarzeń po prostu napisz następujący kod:

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

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

    });

Oficjalna strona bootboxjs

karim_fci
źródło
2

Poniższe rozwiązanie jest lepsze niż bootbox.js , ponieważ

  • Może zrobić wszystko, co potrafi bootbox.js;
  • Składnia użycia jest prostsza
  • Pozwala elegancko kontrolować kolor wiadomości za pomocą „błędu”, „ostrzeżenia” lub „informacji”
  • Bootbox ma 986 linii, kopalni tylko 110 linii

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

Aby użyć 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>
wprowadź opis zdjęcia tutaj

Głupi koleś
źródło
1

Możesz wypróbować więcej mojego wielokrotnego użytku z funkcją oddzwaniania . W tej funkcji możesz użyć żądania POST lub logiki. Użyte biblioteki: JQuery 3> i Bootstrap 3> .

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

Kod HTML do testu:

...
<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';
};
Aleksiej Nikitenko
źródło
0

Jeśli chodzi o odpowiednio duży projekt, możemy potrzebować czegoś do ponownego użycia . To jest coś, z czym przyszedłem przy pomocy 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" %>

Uwaga: Ta metoda używa metody usuwania HTTP dla żądania usunięcia, możesz zmienić ją z javascript lub, możesz wysłać ją za pomocą atrybutu danych jak w tytule danych lub danych-adresie URL, w celu obsługi dowolnego żądania.

Maleen Abewardana
źródło
0

Jeśli chcesz to zrobić za pomocą najprostszego skrótu, możesz to zrobić za pomocą tej wtyczki .


Ale ta wtyczka jest alternatywną implementacją używającą Bootstrap Modal . I prawdziwa implementacja Bootstrap jest również bardzo łatwa, więc nie lubię używać tej wtyczki, ponieważ dodaje ona nadmiar zawartości JS na stronie, co spowolni czas ładowania strony.


Pomysł

W ten sposób lubię go wdrażać

  1. Jeśli użytkownik kliknie przycisk s, aby usunąć element z listy, wówczas wywołanie JS umieści identyfikator elementu (lub inne niezbędne dane) w formularzu w module.
  2. Następnie w wyskakującym okienku będą 2 przyciski do potwierdzenia.

    • Tak , prześle formularz (z ajax lub bezpośredni formularz)
    • Nie , po prostu odrzuci modal

Kod będzie taki (przy użyciu 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>

Powinieneś zmienić akcję formularza zgodnie ze swoimi wymaganiami.

Wesołego chodzenia :)

Abrar Jahin
źródło
0

Przepis POST z nawigacją do strony docelowej i plikiem Blade wielokrotnego użytku

Odpowiedź dfsq jest bardzo ładna. Zmodyfikowałem go trochę, aby dopasować do moich potrzeb: tak naprawdę potrzebowałem modalu na skrzynkę, który po kliknięciu przekierowałby użytkownika do odpowiedniej strony. Asynchroniczne wykonanie zapytania nie zawsze jest potrzebne.

Za pomocą Bladeutworzyłem plik 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>

Teraz korzystanie z niego jest proste:

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

Niewiele się tu zmieniło, a modal można włączyć w ten sposób:

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

Po prostu umieszczając tam czasownik, używa go. W ten sposób wykorzystywany jest również CSRF.

Pomógł mi, może pomaga komuś innemu.

Lód Ogień
źródło