使用Twitter Bootstrap确认模态/对话框中的删除?

SWL*_*SWL 275 jquery twitter-bootstrap

我有一个绑定到数据库行的HTML表行.我希望每行都有一个"删除行"链接,但我想事先与用户确认.

有没有办法使用Twitter Bootstrap模式对话框?

dfs*_*fsq 386

获取食谱

对于此任务,您可以使用已有的插件和引导程序扩展.或者,您只需3行代码即可创建自己的确认弹出窗口.看看这个.

假设我们有这个链接(注意data-href而不是href)或我们想要删除确认的按钮:

<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>
Run Code Online (Sandbox Code Playgroud)

这里#confirm-delete指向HTML中的模态弹出div.它应该有一个"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>
Run Code Online (Sandbox Code Playgroud)

现在你只需要这个小javascript来确认删除操作:

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

因此,在show.bs.modal事件删除按钮href设置为具有相应记录ID的URL.

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


POST食谱

我意识到在某些情况下可能需要执行POST或DELETE请求而不是GET.没有太多代码,它仍然非常简单.使用以下方法查看下面的演示:

// 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);
});
Run Code Online (Sandbox Code Playgroud)

// 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');
  setTimeout(function() {
    $modalDiv.modal('hide').removeClass('loading');
  }, 1000);

  // In reality would be something like this
  // $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);
});
Run Code Online (Sandbox Code Playgroud)
.modal.loading .modal-content:before {
  content: 'Loading...';
  text-align: center;
  line-height: 155px;
  font-size: 20px;
  background: rgba(0, 0, 0, .8);
  position: absolute;
  top: 55px;
  bottom: 0;
  left: 0;
  right: 0;
  color: #EEE;
  z-index: 1000;
}
Run Code Online (Sandbox Code Playgroud)
<script data-require="jquery@*" data-semver="2.0.3" src="//code.jquery.com/jquery-2.0.3.min.js"></script>
<script data-require="bootstrap@*" data-semver="3.1.1" src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<link data-require="bootstrap-css@3.1.1" data-semver="3.1.1" rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" />

<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">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h4 class="modal-title" id="myModalLabel">Confirm Delete</h4>
      </div>
      <div class="modal-body">
        <p>You are about to delete <b><i class="title"></i></b> record, this procedure is irreversible.</p>
        <p>Do you want to proceed?</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 btn-ok">Delete</button>
      </div>
    </div>
  </div>
</div>
<a href="#" data-record-id="23" data-record-title="The first one" data-toggle="modal" data-target="#confirm-delete">
        Delete "The first one", #23
    </a>
<br />
<button class="btn btn-default" data-record-id="54" data-record-title="Something cool" data-toggle="modal" data-target="#confirm-delete">
  Delete "Something cool", #54
</button>
Run Code Online (Sandbox Code Playgroud)

演示: http ://plnkr.co/edit/V4GUuSueuuxiGr4L9LmG?p = preview


Bootstrap 2.3

这是我在回答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));
});
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/MjmVr/1595/

  • 一个调整是最后的删除请求应该产生一个帖子,而不是像链接那样的GEt.如果您允许在GET上删除,则恶意第三方可以轻松地在网站或电子邮件上创建链接,导致您的用户无意中删除内容.这可能看起来很愚蠢,但有些情况会出现严重的安全问题. (21认同)
  • 试图拒绝投票赞成使用GET执行破坏性操作。有许多不同的原因,您永远都不要这样做。 (3认同)
  • 您可能想看一下[Vex](http://github.hubspot.com/vex/docs/welcome).做你想问的更简单:http://jsfiddle.net/adamschwartz/hQump. (2认同)

Rif*_*fat 158

http://bootboxjs.com/ - 最新版本与Bootstrap 3.0.0一起使用

最简单的例子:

bootbox.alert("Hello world!"); 
Run Code Online (Sandbox Code Playgroud)

从网站:

该库公开了三种旨在模仿其原生JavaScript等价物的方法.他们的确切方法签名是灵活的,因为每个都可以采取各种参数来自定义标签和指定默认值,但它们通常被称为如下:

bootbox.alert(message, callback)
bootbox.prompt(message, callback)
bootbox.confirm(message, callback)
Run Code Online (Sandbox Code Playgroud)

这是一个实际的片段(点击下面的"运行代码片段"):

$(function() {
  bootbox.alert("Hello world!");
});
Run Code Online (Sandbox Code Playgroud)
<!-- 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>
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,当你需要关于标题和按钮的非英文文本时,你要么必须修改JS,要么开始参数化,就像自己添加bootstrap html和JS一样.:) (2认同)

小智 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);

  });
Run Code Online (Sandbox Code Playgroud)


Arj*_*man 27

我意识到这是一个非常古老的问题,但是因为我今天想知道一个更有效的方法来处理引导模态.我做了一些研究,找到了比上面显示的解决方案更好的东西,可以在这个链接找到:

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

首先加载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;
    });
});
Run Code Online (Sandbox Code Playgroud)

然后只要问任何问题/确认href:

<a href="/any/url/delete.php?ref=ID" data-confirm="Are you sure you want to delete?">Delete</a>
Run Code Online (Sandbox Code Playgroud)

通过这种方式,确认模式更加通用,因此可以轻松地在网站的其他部分重复使用.

  • 妈妈告诉我不要点击任何冷融合链接 (6认同)
  • 请勿在没有归属的情况下发布其他来源的代码:http://www.petefreitag.com/item/809.cfm. (4认同)
  • 尽管op最初忘记了归因,但这对我来说是完美的.奇迹般有效. (3认同)
  • 我认为删除带有GET http请求的项目并不是一个好主意 (2认同)
  • @BenY这不是关于用户是否有权做某事,而是关于恶意用户已经*有权利做某事被欺骗点击其他网站,电子邮件等链接,以便恶意用户可以利用该用户权限. (2认同)

nem*_*ixx 16

感谢@Jousby的解决方案,我设法让我的工作也工作,但发现我必须改进他的解决方案的Bootstrap模态标记,以使其正确渲染,如官方示例中所示.

所以,这是我修改后的通用confirm函数版本,运行正常:

/* 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 */
Run Code Online (Sandbox Code Playgroud)

  • 很棒的解决方案.我做了一些小修改来处理取消链接的回调.一个小推荐使用#!而不是你的href中的#,以防止页面滚动到顶部. (3认同)

Mar*_*des 9

我觉得这很有用且易于使用,而且看起来很漂亮:http://maxailloud.github.io/confirm-bootstrap/.

要使用它,请在页面中包含.js文件,然后运行:

$('your-link-selector').confirmModal();
Run Code Online (Sandbox Code Playgroud)

您可以应用各种选项,以便在确认删除时使其看起来更好,我使用:

$('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..
    }
});
Run Code Online (Sandbox Code Playgroud)