Xác nhận xóa trong phương thức / hộp thoại bằng Twitter Bootstrap?


284

Tôi có một bảng HTML gồm các hàng được gắn với các hàng cơ sở dữ liệu. Tôi muốn có một liên kết "xóa hàng" cho mỗi hàng, nhưng tôi muốn xác nhận trước với người dùng.

Có cách nào để làm điều này bằng cách sử dụng hộp thoại phương thức Twitter Bootstrap không?



3
Đã chạy qua câu hỏi này, tôi muốn kết hợp với (cái dường như đối với tôi) như một "cách khắc phục" đơn giản và hợp lý hơn cho vấn đề này. Tôi đã vật lộn với nó một lúc và sau đó nhận ra nó có thể đơn giản đến mức nào: chỉ cần đặt nút gửi biểu mẫu thực tế trong hộp thoại phương thức, và sau đó nút gửi trên biểu mẫu không làm gì ngoài việc kích hoạt cửa sổ hộp thoại ... vấn đề đã được giải quyết.
Michael Doleman

@jonijones ví dụ này không hoạt động với tôi (thông báo xác nhận không hiển thị khi nhấp vào nút đầu tiên) - được thử nghiệm trong chrome
egmfrs

Câu trả lời:


396

NHẬN công thức

Đối với tác vụ này, bạn có thể sử dụng các plugin và phần mở rộng bootstrap đã có sẵn. Hoặc bạn có thể tạo cửa sổ bật lên xác nhận của riêng bạn chỉ với 3 dòng mã. Kiểm tra nó ra.

Giả sử chúng tôi có các liên kết này (lưu ý data-hrefthay vì href) hoặc các nút mà chúng tôi muốn có xác nhận xóa cho:

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

Ở đây #confirm-deletechỉ ra một div cửa sổ bật lên phương thức trong HTML của bạn. Nó nên có một nút "OK" được cấu hình như thế này:

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

Bây giờ bạn chỉ cần javascript nhỏ này để thực hiện hành động xóa có thể xác nhận:

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

Vì vậy, show.bs.modalnút xóa sự kiện hrefđược đặt thành URL với id bản ghi tương ứng.

Bản trình diễn: http://plnkr.co/edit/NePR0BQf3VmKtuMmhVR7?p=preview


POST công thức

Tôi nhận ra rằng trong một số trường hợp có thể cần phải thực hiện yêu cầu POST hoặc DELETE thay vì NHẬN. Nó vẫn khá đơn giản mà không cần quá nhiều mã. Hãy xem bản demo dưới đây với phương pháp này:

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

Bản trình diễn: http://plnkr.co/edit/V4GUuSueuuxiGr4L9LmG?p=preview


Bootstrap 2.3

Đây là phiên bản gốc của mã tôi đã tạo khi trả lời câu hỏi này cho phương thức 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));
});

Bản trình diễn : http://jsfiddle.net/MjmVr/1595/


1
Điều này hoạt động gần như hoàn hảo nhưng ngay cả trong phiên bản fiddle (như trong trang web của tôi), id không được chuyển đến nút Có trong phương thức. Tôi đã nhận thấy rằng bạn đang cố gắng thay thế & ref thay vì ? Ref nên tôi đã thử thay đổi nhưng nó vẫn không hoạt động. Tôi có thiếu thứ gì khác ở đây không? Điều này thật tuyệt vời vì vậy TIA đã giúp đỡ bạn!
SWL

Cảm ơn @dfsq - cái này hoạt động rất đẹp. Hộp thoại không ẩn khi nhấp vào nút 'không' vì vậy tôi đã thay đổi href thành # thay vì ẩn phương thức và nó cũng hoạt động. Cảm ơn một lần nữa vì sự giúp đỡ của bạn.
SWL

22
Một điều chỉnh là yêu cầu xóa cuối cùng sẽ dẫn đến một bài đăng, không phải là GEt như bạn muốn với một liên kết. Nếu bạn cho phép Xóa trên GET, thì bên thứ ba độc hại có thể dễ dàng tạo liên kết trên các trang web hoặc email khiến người dùng của bạn vô tình xóa mọi thứ. Nó có vẻ ngớ ngẩn, nhưng có những kịch bản mà đây sẽ là một vấn đề bảo mật nghiêm trọng.
AaronLS

2
Bạn có thể muốn xem Vex . Rất đơn giản để thực hiện những gì bạn yêu cầu: jsfiddle.net/adamschwartz/hQump .
Adam

3
Bị cám dỗ downvote vì sử dụng GET để thực hiện hành động phá hoại. Có rất nhiều, rất nhiều lý do khác nhau mà bạn không bao giờ nên làm điều đó.
NickG

158

http://bootboxjs.com/ - hoạt động mới nhất với Bootstrap 3.0.0

Ví dụ đơn giản nhất có thể:

bootbox.alert("Hello world!"); 

Từ trang web:

Thư viện trưng bày ba phương thức được thiết kế để bắt chước các tương đương JavaScript gốc của chúng. Chữ ký phương thức chính xác của chúng rất linh hoạt vì mỗi chữ ký có thể lấy các tham số khác nhau để tùy chỉnh nhãn và chỉ định mặc định, nhưng chúng thường được gọi như vậy:

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

Đây là một đoạn của nó trong hành động (nhấp vào "Chạy đoạn mã" bên dưới):

$(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
Thật không may, thời điểm bạn cần văn bản không phải tiếng Anh trên tiêu đề và các nút, bạn phải sửa đổi JS hoặc bắt đầu tham số hóa gần như chỉ cần thêm html bootstrap và 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);

  });

1
Đây là một bài viết cũ nhưng tôi muốn điều tương tự để làm nhưng khi tôi sử dụng đoạn mã trên, hộp thoại modal hiển thị?
Saurabh

28

Tôi nhận ra đây là một câu hỏi rất cũ, nhưng vì hôm nay tôi đã tự hỏi về một phương pháp hiệu quả hơn để xử lý các phương thức bootstrap. Tôi đã thực hiện một số nghiên cứu và tìm thấy một cái gì đó tốt hơn sau đó các giải pháp được hiển thị ở trên, có thể được tìm thấy tại liên kết này:

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

Đầu tiên tải 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;
    });
});

Sau đó, chỉ cần hỏi bất kỳ câu hỏi / xác nhận nào để href:

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

Bằng cách này, phương thức xác nhận là phổ quát hơn rất nhiều và vì vậy nó có thể dễ dàng được sử dụng lại trên các phần khác của trang web của bạn.


4
Vui lòng không đăng mã từ các nguồn khác mà không có sự ghi nhận: petefreitag.com/item/809.cfm .
A. Webb

4
Mặc dù lúc đầu op quên ghi công, đây là điều hoàn hảo với tôi. Hoạt động như một lá bùa.
Janis Peisenieks

3
Tôi nghĩ rằng đó không phải là một ý tưởng tốt để xóa các mục với yêu cầu GET http
Miguel Prz

7
Momma bảo tôi không nhấp vào bất kỳ liên kết hợp hạch lạnh nào
Mike Purcell

3
@BenY Không phải là về việc người dùng có được phép thực hiện hay không, đó là về người dùng độc hại đã có quyền thực hiện những việc bị lừa khi nhấp vào liên kết trên các trang web khác, email, v.v. để người dùng độc hại có thể tận dụng quyền của người dùng đó.
Brett

17

Nhờ giải pháp của @ Jousby , tôi cũng đã làm cho tôi hoạt động tốt, nhưng thấy rằng tôi phải cải thiện cách đánh dấu phương thức Bootstrap của giải pháp một chút để làm cho nó hiển thị chính xác như được minh họa trong các ví dụ chính thức .

Vì vậy, đây là phiên bản sửa đổi của tôi về confirmchức năng chung hoạt động tốt:

/* 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
Giải pháp tuyệt vời ở đây. Tôi đã thực hiện một số sửa đổi nhỏ để xử lý một cuộc gọi lại cho liên kết hủy bỏ. Một khuyến nghị nhỏ sử dụng #! thay vì # trong your href để ngăn trang cuộn lên trên cùng.
Domenic D.

Nếu tôi có thể tăng gấp đôi số phiếu này, tôi sẽ. Đẹp và thanh lịch. Cảm ơn bạn.
Nigel Johnson

Giải pháp rất hay. Một cải tiến nữa tôi có thể đề xuất là thêm một đối số khác: btnType = "btn-primary"và sau đó thay đổi mã cho nút OK để chứa class="btn ' + btnType + '". Bằng cách đó, người ta có thể vượt qua một đối số tùy chọn để thay đổi giao diện của nút OK, như btn-dangerđể xóa.
IamNaN

Cảm ơn bạn. Tôi đã phải trao đổi xung quanh các thẻ <h3> và <a> (h3 trước) để hiển thị chính xác.
Dave Dawkins

10

Tôi thấy điều này hữu ích và dễ sử dụng, cộng với nó trông khá đẹp: http://maxailloud.github.io/confirm-bootstrap/ .

Để sử dụng nó, hãy bao gồm tệp .js trong trang của bạn rồi chạy:

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

Có nhiều tùy chọn bạn có thể áp dụng cho nó, để làm cho nó trông đẹp hơn khi thực hiện để xác nhận xóa, tôi sử dụng:

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

đó là một lib tốt đẹp
loretoparisi

4

Tôi có thể dễ dàng xử lý loại tác vụ này bằng thư viện bootbox.js. Đầu tiên bạn cần bao gồm tệp JS của bootbox. Sau đó, trong chức năng xử lý sự kiện của bạn chỉ cần viết mã sau đây:

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

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

    });

Trang web bootboxjs chính thức


2

Giải pháp sau tốt hơn bootbox.js , bởi vì

  • Nó có thể làm mọi thứ bootbox.js có thể làm;
  • Cú pháp sử dụng đơn giản hơn
  • Nó cho phép bạn kiểm soát màu sắc của tin nhắn một cách tao nhã bằng cách sử dụng "lỗi", "cảnh báo" hoặc "thông tin"
  • Bootbox dài 986 dòng, tôi chỉ dài 110 dòng

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

Để sử dụng 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>
nhập mô tả hình ảnh ở đây


1

Bạn có thể thử sử dụng lại giải pháp của tôi với chức năng gọi lại . Trong chức năng này, bạn có thể sử dụng yêu cầu POST hoặc một số logic. Các thư viện đã sử dụng: JQuery 3>Bootstrap 3> .

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

Mã Html để kiểm tra:

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

Khi nói đến một dự án lớn có liên quan, chúng ta có thể cần một cái gì đó có thể sử dụng lại . Đây là một cái gì đó tôi đã đến với sự giúp đỡ của SO.

xác nhậnDelete.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/>

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

Lưu ý: Điều này sử dụng phương pháp xóa http cho yêu cầu xóa, bạn có thể thay đổi nó từ javascript hoặc, có thể gửi nó bằng thuộc tính dữ liệu như trong tiêu đề dữ liệu hoặc url dữ liệu, v.v., để hỗ trợ mọi yêu cầu.


0

Nếu bạn muốn làm điều đó trong các phím tắt dễ nhất, thì bạn có thể làm điều đó với plugin này .


Nhưng plugin này là một triển khai thay thế bằng cách sử dụng Bootstrap Modal . Và việc triển khai Bootstrap thực tế cũng rất dễ dàng, vì vậy tôi không thích sử dụng plugin này vì nó bổ sung nội dung JS dư thừa trong trang, điều này sẽ làm chậm thời gian tải trang.


Ý tưởng

Tôi muốn tự mình thực hiện nó bằng cách này-

  1. Nếu người dùng nhấp vào nút để xóa một mục khỏi danh sách, thì lệnh gọi JS sẽ đặt ID vật phẩm (hoặc bất kỳ dữ liệu cần thiết nào khác) vào một biểu mẫu trong phương thức.
  2. Sau đó, trong cửa sổ bật lên, sẽ có 2 nút để xác nhận.

    • sẽ gửi biểu mẫu (với ajax hoặc gửi biểu mẫu trực tiếp)
    • Không sẽ bỏ qua phương thức

Mã sẽ như thế này (sử dụng 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>

Bạn nên thay đổi hành động biểu mẫu theo yêu cầu của bạn.

Chúc mừng hạnh phúc :)


0

POST Recipe với điều hướng đến trang đích và tệp Blade có thể sử dụng lại

Câu trả lời của dfsq rất hay. Tôi đã sửa đổi nó một chút để phù hợp với nhu cầu của mình: Tôi thực sự cần một phương thức cho trường hợp, sau khi nhấp vào, người dùng cũng sẽ được điều hướng đến trang tương ứng. Thực hiện truy vấn không đồng bộ không phải lúc nào cũng là điều người ta cần.

Sử dụng Bladetôi đã tạo tập tin 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>

Bây giờ, sử dụng nó là đơn giản:

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

Không có nhiều thay đổi ở đây và phương thức có thể được bao gồm như thế này:

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

Chỉ cần đặt động từ vào đó, nó sử dụng nó. Bằng cách này, CSRF cũng được sử dụng.

Giúp tôi, có thể nó giúp người khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.