ยืนยันการลบใน modal / dialog โดยใช้ Twitter Bootstrap หรือไม่


284

ฉันมีตาราง HTML เชื่อมโยงกับแถวฐานข้อมูล ฉันต้องการลิงค์ "ลบแถว" สำหรับแต่ละแถว แต่ฉันต้องการยืนยันกับผู้ใช้ล่วงหน้า

มีวิธีทำเช่นนี้โดยใช้กล่องโต้ตอบ Modal Twitter Bootstrap หรือไม่?



3
หลังจากพบคำถามนี้ฉันต้องการพูดสอดกับ (สิ่งที่ดูเหมือนกับฉัน) เช่น "แก้ไข" ที่ง่ายและคล่องตัวขึ้นสำหรับปัญหานี้ ฉันดิ้นรนไปซักพักแล้วก็รู้ว่ามันง่ายแค่ไหน: เพียงแค่ใส่ปุ่มส่งแบบฟอร์มจริงในกล่องโต้ตอบโมดอลแล้วปุ่มส่งบนฟอร์มนั้นไม่ได้ทำอะไรนอกจากเปิดหน้าต่างโต้ตอบ ... แก้ปัญหาแล้ว
Michael Doleman

@jonijones ตัวอย่างนี้ใช้งานไม่ได้สำหรับฉัน (ข้อความยืนยันไม่แสดงเมื่อคลิกปุ่มแรก) - ทดสอบด้วย chrome
egmfrs

คำตอบ:


397

รับสูตร

สำหรับภารกิจนี้คุณสามารถใช้ปลั๊กอินและส่วนขยาย bootstrap ที่มีอยู่แล้ว หรือคุณสามารถสร้างป๊อปอัพการยืนยันของคุณเองด้วยรหัสเพียง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>

นี่#confirm-deleteชี้ไปที่ div ป๊อปอัพ modal ใน HTML ของคุณ ควรมีการกำหนดค่าปุ่ม "ตกลง" ดังนี้:

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

ตอนนี้คุณเพียงแค่ใช้จาวาสคริปต์เล็ก ๆ นี้เพื่อทำการยืนยันการลบ:

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

ดังนั้นในshow.bs.modalปุ่มลบเหตุการณ์hrefถูกตั้งค่าเป็น URL ที่มีรหัสบันทึกที่สอดคล้องกัน

สาธิต: http://plnkr.co/edit/NePR0BQf3VmKtuMmhVR7?p=preview


สูตร POST

ฉันรู้ว่าในบางกรณีอาจจำเป็นต้องดำเนินการตามคำขอ POST หรือ DELETE แทนที่จะได้รับ มันยังค่อนข้างง่ายโดยไม่ต้องใช้รหัสมากเกินไป ดูตัวอย่างด้านล่างด้วยวิธีนี้:

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

การสาธิต: http://plnkr.co/edit/V4GUuSueuuxiGr4L9LmG?p=preview


Bootstrap 2.3

นี่คือรหัสต้นฉบับที่ฉันทำเมื่อฉันตอบคำถามสำหรับ Modstor 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));
});

สาธิต : http://jsfiddle.net/MjmVr/1595/


1
วิธีนี้ใช้ได้เกือบสมบูรณ์แบบ แต่แม้ในรุ่นซอ (เช่นในเว็บไซต์ของฉัน) รหัสไม่ถูกส่งไปยังปุ่มใช่ในคำกริยา ฉันสังเกตเห็นว่าคุณกำลังพยายามแทนที่& refแทนที่จะเป็น"ref"ดังนั้นฉันจึงลองเปลี่ยน แต่ก็ยังใช้งานไม่ได้ ฉันคิดถึงสิ่งอื่นที่นี่หรือไม่ นี่เป็นสิ่งที่ยอดเยี่ยมดังนั้น TIA สำหรับความช่วยเหลือของคุณ!
SWL

ขอบคุณ @dfsq - สิ่งนี้ใช้ได้อย่างสวยงาม กล่องโต้ตอบไม่ได้ซ่อนคลิกปุ่ม 'ไม่' ดังนั้นฉันจึงเปลี่ยน href เป็น # แทนที่จะซ่อน modal และใช้งานได้ดี ขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ
SWL

22
หนึ่งบิดเป็นคำขอลบสุดท้ายควรส่งผลให้โพสต์ไม่ใช่ GEt เช่นเดียวกับที่คุณมีลิงก์ หากคุณอนุญาตให้ลบใน GET บุคคลที่สามที่เป็นอันตรายสามารถสร้างลิงก์ในเว็บไซต์หรืออีเมลที่ทำให้ผู้ใช้ของคุณลบสิ่งต่าง ๆ โดยไม่เจตนา อาจดูงี่เง่า แต่มีหลายสถานการณ์ที่อาจเป็นปัญหาด้านความปลอดภัยที่ร้ายแรง
AaronLS

2
คุณอาจต้องการที่จะดูที่ก่อกวน ดังนั้นง่ายมากที่จะทำสิ่งที่คุณขอ: jsfiddle.net/adamschwartz/hQump
อดัม

3
ล่อลวงให้ downvote สำหรับการใช้ GET เพื่อดำเนินการทำลายล้าง มีเหตุผลมากมายหลายประการที่คุณไม่ควรทำเช่นนั้น
NickG

158

http://bootboxjs.com/ - งานล่าสุดกับ Bootstrap 3.0.0

ตัวอย่างที่ง่ายที่สุดที่เป็นไปได้:

bootbox.alert("Hello world!"); 

จากเว็บไซต์:

ไลบรารีแสดงวิธีการสามวิธีที่ออกแบบมาเพื่อเลียนแบบ JavaScript ที่เทียบเท่ากัน ลายเซ็นต์วิธีการที่แน่นอนของพวกเขานั้นมีความยืดหยุ่นเนื่องจากแต่ละพารามิเตอร์สามารถใช้พารามิเตอร์ต่าง ๆ ในการปรับแต่งป้ายกำกับและระบุค่าเริ่มต้นได้

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

นี่คือตัวอย่างของการทำงาน (คลิก "เรียกใช้ข้อมูลโค้ด" ด้านล่าง):

$(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
น่าเสียดายที่ช่วงเวลาที่คุณต้องการข้อความที่ไม่ใช่ภาษาอังกฤษในชื่อและปุ่มที่คุณต้องแก้ไข JS หรือเริ่มการสร้างพารามิเตอร์เกือบจะเท่ากับเพิ่มเพียงแค่เพิ่ม bootstrap html และ 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
มันเป็นโพสต์เก่า แต่ฉันต้องการสิ่งเดียวกันที่จะทำ แต่เมื่อฉันใช้รหัสข้างต้นการแสดง dosent โต้ตอบคำกริยา?
Saurabh

28

ฉันรู้ว่ามันเป็นคำถามที่เก่ามาก แต่เนื่องจากฉันสงสัยในวันนี้สำหรับวิธีที่มีประสิทธิภาพมากขึ้นในการจัดการ modst bootstrap ฉันได้ทำการวิจัยและพบสิ่งที่ดีกว่าแล้วคำตอบที่แสดงไว้ด้านบนสามารถพบได้ที่ลิงค์นี้:

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

จากนั้นเพียงแค่ถามคำถามใด ๆ / ยืนยันเพื่อ href:

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

วิธีนี้เป็นคำยืนยันที่เป็นสากลมากขึ้นและสามารถนำกลับมาใช้ใหม่ได้อย่างง่ายดายในส่วนอื่น ๆ ของเว็บไซต์ของคุณ


4
กรุณาทำรหัสไม่ได้โพสต์จากแหล่งอื่น ๆ ได้โดยไม่ต้องระบุแหล่งที่มา: petefreitag.com/item/809.cfm
A. เวบบ์

4
แม้ว่า op จะลืมที่มาในตอนแรกนี่เป็นสิ่งที่สมบูรณ์แบบสำหรับฉัน ทำงานเหมือนจับใจ
Janis Peisenieks

3
ฉันคิดว่าไม่ใช่ความคิดที่ดีที่จะลบรายการที่มีคำขอ http GET
มิเกลพรซ์

7
Momma บอกฉันว่าอย่าคลิกลิงค์ฟิวชั่นเย็น ๆ
Mike Purcell

3
@BenY มันไม่ได้เกี่ยวกับว่าผู้ใช้มีสิทธิ์ในการทำสิ่งนั้นหรือไม่ แต่เป็นเรื่องเกี่ยวกับผู้ใช้ที่เป็นอันตรายที่ได้รับอนุญาตให้ทำสิ่งที่ถูกหลอกให้คลิกลิงก์ในเว็บไซต์อื่นอีเมล ฯลฯ เพื่อให้ผู้ใช้ที่เป็นอันตราย
เบร็ท

17

ขอขอบคุณที่ @ Jousby ของการแก้ปัญหาที่ฉันจัดการที่จะได้รับการทำงานเหมืองเช่นกัน แต่พบว่าผมมีการปรับปรุงวิธีการแก้ปัญหาของเขา Bootstrap Modal มาร์กอัปบิตที่จะทำให้มันทำให้ถูกต้องตามที่แสดงให้เห็นอย่างเป็นทางการในตัวอย่าง

ดังนั้นต่อไปนี้เป็นรุ่นทั่วไปของ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 */

3
ทางออกที่ดีที่นี่ ฉันทำการแก้ไขเล็กน้อยเพื่อจัดการการติดต่อกลับสำหรับลิงก์ยกเลิก ข้อเสนอแนะเล็ก ๆ แห่งหนึ่งใช้ #! แทนที่จะเป็น # ใน href ของคุณเพื่อป้องกันไม่ให้หน้าเลื่อนไปด้านบน
ดี.

ถ้าฉันสามารถลงคะแนนสองเท่านี้ฉันจะ ดีและสง่างาม ขอบคุณ.
ไนเจลจอห์นสัน

ทางออกที่ดีมาก การปรับปรุงอีกอย่างหนึ่งที่ฉันแนะนำคือเพิ่มอาร์กิวเมนต์อีกตัว: btnType = "btn-primary"จากนั้นเปลี่ยนรหัสเพื่อให้ปุ่ม OK มีclass="btn ' + btnType + '"อยู่ วิธีนั้นสามารถส่งผ่านอาร์กิวเมนต์ตัวเลือกเพื่อเปลี่ยนลักษณะที่ปรากฏของปุ่มตกลงเช่นbtn-dangerการลบ
IamNaN

ขอบคุณ. ฉันต้องสลับไปมาระหว่าง <h3> และ <a> แท็ก (h3 ก่อน) เพื่อให้การแสดงผลถูกต้อง
Dave Dawkins

10

ฉันพบนี้มีประโยชน์และง่ายต่อการใช้งานรวมทั้งจะดูสวย: http://maxailloud.github.io/confirm-bootstrap/

หากต้องการใช้ให้รวมไฟล์. js ในหน้าเว็บของคุณแล้วเรียกใช้:

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

มีตัวเลือกต่าง ๆ ที่คุณสามารถนำไปใช้เพื่อทำให้มันดูดีขึ้นเมื่อทำเพื่อยืนยันการลบฉันใช้:

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

นั่นเป็น lib ที่ดี
loretoparisi

4

ฉันสามารถจัดการงานประเภทนี้ได้อย่างง่ายดายโดยใช้ห้องสมุด bootbox.js ตอนแรกคุณต้องรวมไฟล์ bootbox JS จากนั้นในฟังก์ชันตัวจัดการเหตุการณ์ของคุณเพียงแค่เขียนรหัสต่อไปนี้:

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

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

    });

เว็บไซต์ bootboxjs อย่างเป็นทางการ


2

วิธีแก้ปัญหาต่อไปนี้ดีกว่า 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>
ป้อนคำอธิบายรูปภาพที่นี่


1

คุณสามารถลองใช้โซลูชันของฉันได้อีกครั้งด้วยฟังก์ชั่นโทรกลับ ในฟังก์ชั่นนี้คุณสามารถใช้คำขอ POST หรือตรรกะบางอย่าง ห้องสมุดที่ใช้: JQuery 3>และเงินทุน 3>

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

รหัส Html สำหรับการทดสอบ:

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

เมื่อมันมาถึงโครงการขนาดใหญ่ประเด็นที่เราอาจจะต้องการสิ่งใหม่ใช้งาน นี่คือสิ่งที่ฉันมาด้วยความช่วยเหลือของ 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" %>

หมายเหตุ:วิธีนี้ใช้วิธีการลบ http สำหรับคำขอลบคุณสามารถเปลี่ยนได้จาก javascript หรือสามารถส่งโดยใช้ data-attribute เหมือนใน data-title หรือ data-url ฯลฯ เพื่อรองรับคำขอใด ๆ


0

หากคุณต้องการที่จะทำในทางลัดที่ง่ายที่สุดแล้วคุณสามารถทำได้ด้วยปลั๊กอินนี้


แต่ปลั๊กอินนี้คือการดำเนินการอื่นโดยใช้เงินทุน Modal และการใช้ Bootstrap ที่แท้จริงนั้นง่ายมากดังนั้นฉันไม่ชอบใช้ปลั๊กอินนี้เพราะมันเพิ่มเนื้อหา JS ส่วนเกินในหน้าซึ่งจะทำให้เวลาในการโหลดหน้าเว็บช้าลง


ความคิด

ฉันชอบที่จะใช้มันด้วยตัวเองด้วยวิธีนี้ -

  1. หากผู้ใช้คลิกที่ปุ่มเพื่อลบรายการออกจากรายการการโทร JS จะใส่ID รายการ (หรือข้อมูลที่จำเป็นอื่น ๆ ) ในแบบฟอร์มใน modal
  2. จากนั้นในป็อปอัพจะมี 2 ปุ่มสำหรับการยืนยัน

    • ใช่จะส่งแบบฟอร์ม (ด้วย Ajax หรือส่งแบบฟอร์มโดยตรง)
    • ไม่เพียงแค่จะยกเลิกคำกริยา

รหัสจะเป็นเช่นนี้ (ใช้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>

คุณควรเปลี่ยนรูปแบบการกระทำตามความต้องการของคุณ

ยินดีด้วยกัน :)


0

สูตร POST พร้อมการนำทางไปยังหน้าเป้าหมายและไฟล์ Blade ที่สามารถใช้ซ้ำได้

คำตอบของ dfsq ดีมาก ฉันปรับเปลี่ยนเล็กน้อยเพื่อให้เหมาะกับความต้องการของฉัน: จริง ๆ แล้วฉันต้องการ modal สำหรับกรณีที่หลังจากคลิกผู้ใช้จะถูกนำทางไปยังหน้าที่เกี่ยวข้อง การดำเนินการแบบสอบถามแบบอะซิงโครนัสไม่ใช่สิ่งที่ต้องการเสมอไป

ใช้Bladeฉันสร้างไฟล์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>

ตอนนี้ใช้มันเป็นตรงไปข้างหน้า:

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

ไม่ค่อยมีการเปลี่ยนแปลงที่นี่และสามารถรวมกิริยาเช่นนี้:

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

เพียงแค่ใส่คำกริยาเข้าไปในนั้นก็ใช้มัน ด้วยวิธีนี้ CSRF ก็ถูกนำไปใช้เช่นกัน

ช่วยฉันด้วยบางทีมันอาจช่วยคนอื่นได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.