【问题标题】:Confirm deletion using Bootstrap 3 modal box使用 Bootstrap 3 模态框确认删除
【发布时间】:2014-05-03 10:16:25
【问题描述】:

我需要使用 Bootstrap 3 模式框(是/否)确认删除。我该如何创建它?

HTML 代码:

<form action="blah" method="POST">
    <button class='btn' type="submit" name="remove_levels" value="delete">
        <span class="fa fa-times"></span> Delete
    </button>
</form>

【问题讨论】:

标签: jquery css twitter-bootstrap-3 bootstrap-modal confirm


【解决方案1】:

您需要 HTML 中的模式。单击删除按钮时,它会弹出模式。防止单击该按钮提交表单也很重要。点击确认后,表单将提交。

   

 $('button[name="remove_levels"]').on('click', function(e) {
      var $form = $(this).closest('form');
      e.preventDefault();
      $('#confirm').modal({
          backdrop: 'static',
          keyboard: false
      })
      .on('click', '#delete', function(e) {
          $form.trigger('submit');
        });
      $("#cancel").on('click',function(e){
       e.preventDefault();
       $('#confirm').modal.model('hide');
      });
    });
<link href="http://getbootstrap.com/2.3.2/assets/css/bootstrap.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://getbootstrap.com/2.3.2/assets/js/bootstrap.js"></script>
<form action="#" method="POST">
  <button class='btn btn-danger btn-xs' type="submit" name="remove_levels" value="delete"><span class="fa fa-times"></span> delete</button>
</form>

<div id="confirm" class="modal">
  <div class="modal-body">
    Are you sure?
  </div>
  <div class="modal-footer">
    <button type="button" data-dismiss="modal" class="btn btn-primary" id="delete">Delete</button>
    <button type="button" data-dismiss="modal" class="btn">Cancel</button>
  </div>
</div>

【讨论】:

  • 这很好用,附带说明:如果我点击删除,如果我点击取消,然后我再次点击删除,在我的情况下,提交被发送 2 次。它应该只提交一个。
  • @Khrys,您应该确认您已包含e.prevenDefault()
  • 这里有问题。请注意,如果您使用它来确认删除具有某种 ID 的内容。发生的情况是,如果您单击“取消”,事件仍将附加到模式。如果你点击另一个要删除的东西后,它会同时删除。
  • 对于以前的 cmets Pedro 指出的问题。 $('#confirm').unbind() 有助于解除绑定事件
  • 在这里查看我的答案 - stackoverflow.com/questions/8982295/… 以获得可重用组件。
【解决方案2】:

您可以使用Bootbox 对话框

$(document).ready(function() {

  $('#btnDelete').click(function() {
    bootbox.confirm("Are you sure want to delete?", function(result) {
      alert("Confirm result: " + result);
    });
  });
});

Plunker Demo

【讨论】:

  • 小心,bootbox 可能与 bootstrap modals 冲突。很抱歉回答老问题,但我刚刚遇到了这个问题。
【解决方案3】:

我今天也遇到了同样的问题。这是我的解决方案(我认为更好更简单):

<!-- Modal dialog -->
<div class="modal fade" id="frmPrenotazione" tabindex="-1">
    <!-- CUTTED -->
    <div id="step1" class="modal-footer">
      <button type="button" class="glyphicon glyphicon-erase btn btn-default" id="btnDelete"> Delete</button>
    </div>
</div>

<!-- Modal confirm -->
<div class="modal" id="confirmModal" style="display: none; z-index: 1050;">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-body" id="confirmMessage">
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" id="confirmOk">Ok</button>
                <button type="button" class="btn btn-default" id="confirmCancel">Cancel</button>
            </div>
        </div>
    </div>
</div>

在我的 .js 中:

$('#btnDelete').on('click', function(e){
    confirmDialog(YOUR_MESSAGE_STRING_CONST, function(){
        //My code to delete
    });
});

function confirmDialog(message, onConfirm){
    var fClose = function(){
        modal.modal("hide");
    };
    var modal = $("#confirmModal");
    modal.modal("show");
    $("#confirmMessage").empty().append(message);
    $("#confirmOk").unbind().one('click', onConfirm).one('click', fClose);
    $("#confirmCancel").unbind().one("click", fClose);
}

one 之前使用unbind 可防止在下次打开对话框时调用删除函数。

我希望这会有所帮助。

看一个完整的例子:

var YOUR_MESSAGE_STRING_CONST = "Your confirm message?";
      $('#btnDelete').on('click', function(e){
    		confirmDialog(YOUR_MESSAGE_STRING_CONST, function(){
    			//My code to delete
          console.log("deleted!");
    		});
    	});

        function confirmDialog(message, onConfirm){
    	    var fClose = function(){
    			  modal.modal("hide");
    	    };
    	    var modal = $("#confirmModal");
    	    modal.modal("show");
    	    $("#confirmMessage").empty().append(message);
    	    $("#confirmOk").unbind().one('click', onConfirm).one('click', fClose);
    	    $("#confirmCancel").unbind().one("click", fClose);
        }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<!-- Modal dialog -->
<div id="frmTest" tabindex="-1">
    <!-- CUTTED -->
      <div id="step1" class="modal-footer">
    <button type="button" class="glyphicon glyphicon-erase btn btn-default" id="btnDelete"> Delete</button>
  </div>
</div>

  <!-- Modal confirm -->
<div class="modal" id="confirmModal" style="display: none; z-index: 1050;">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-body" id="confirmMessage">
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" id="confirmOk">Ok</button>
            <button type="button" class="btn btn-default" id="confirmCancel">Cancel</button>
          </div>
    </div>
  </div>
</div>

【讨论】:

    【解决方案4】:

    使用模态的简单方法是eModal

    来自github:

    1. 链接到 eModal.js &lt;script src="//rawgit.com/saribe/eModal/master/dist/eModal.min.js"&gt;&lt;/script&gt;

        var options = {
                message: "The famouse question?",
                title: 'Header title',
                size: 'sm',
                callback: function(result) { result ? doActionTrue(result) :    doActionFalse(); },
                subtitle: 'smaller text header',
                label: "True"   // use the possitive lable as key
                //...
            };
                         
        eModal.confirm(options);
     <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
    <script src="//rawgit.com/saribe/eModal/master/dist/eModal.min.js"></script>

    提示:您可以使用更改默认标签名称! { 标签:“是”| '真'| '好的' }

    【讨论】:

      【解决方案5】:
      $('.launchConfirm').on('click', function (e) {
          $('#confirm')
              .modal({ backdrop: 'static', keyboard: false })
              .one('click', '#delete', function (e) {
                  //delete function
              });
      });
      

      FIDDLE

      对于您的按钮:

      <button class='btn btn-danger btn-xs launchConfirm' type="button" name="remove_levels"><span class="fa fa-times"></span> delete</button></td>
      

      【讨论】:

      • 这不在给定代码的上下文中。 OP 如何将此应用于他/她的代码?
      【解决方案6】:
      <!-- Button trigger modal -->
      <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
        Launch demo modal
      </button>
      
      <!-- Modal -->
      <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
          <div class="modal-content">
            <div class="modal-header">
              <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
              <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                <span aria-hidden="true">&times;</span>
              </button>
            </div>
            <div class="modal-body">
              ...
            </div>
            <div class="modal-footer">
              <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
              <button type="button" class="btn btn-primary">Save changes</button>
            </div>
          </div>
        </div>
      </div>
      

      https://getbootstrap.com/docs/4.0/components/modal/

      【讨论】:

        【解决方案7】:

        使用 id="confirmation" 在 HTML 中创建模态对话框并使用函数 showConfirmation。

        还请记住,您应该在隐藏模式对话框后取消绑定 (modal.unbind()) 取消和成功按钮。如果你不这样做,你会得到双重绑定。 例如:如果您打开一次对话框并按“取消”,然后第二次打开对话框并按“确定”,您将执行 2 次成功回调。

        showConfirmation = function(title, message, success, cancel) {
            title = title ? title : 'Are you sure?';
            var modal = $("#confirmation");
            modal.find(".modal-title").html(title).end()
                .find(".modal-body").html(message).end()
                .modal({ backdrop: 'static', keyboard: false })
                .on('hidden.bs.modal', function () {
                    modal.unbind();
                });
            if (success) {
                modal.one('click', '.modal-footer .btn-primary', success);
            }
            if (cancel) {
                modal.one('click', '.modal-header .close, .modal-footer .btn-default', cancel);
            }
        };
        
        // bind confirmation dialog on delete buttons
        $(document).on("click", ".delete-event, .delete-all-event", function(event){
            event.preventDefault();
            var self = $(this);
            var url = $(this).data('url');
            var success = function(){
                alert('window.location.href=url');
            }
            var cancel = function(){
                alert('Cancel');
            };
            if (self.data('confirmation')) {
                var title = self.data('confirmation-title') ? self.data('confirmation-title') : undefined;
                var message = self.data('confirmation');
                showConfirmation(title, message, success, cancel);
            } else {
                success();
            }
        });
        

        https://jsfiddle.net/yiiBoy/hne9sp6g/

        【讨论】:

          【解决方案8】:

          以下解决方案比 bootbox.js 更好,因为

          • bootbox.js 能做的一切都能做;
          • 使用语法更简单
          • 它允许您使用“错误”、“警告”或“信息”优雅地控制消息的颜色
          • Bootbox 有 986 行,我的只有 110 行

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

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

          【讨论】:

            猜你喜欢
            • 2017-01-19
            • 2012-02-17
            • 2020-07-07
            • 2014-07-21
            • 1970-01-01
            • 2015-09-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多