Konfirmasikan penghapusan dalam modal / dialog menggunakan Twitter Bootstrap?

284

Saya memiliki tabel HTML baris terkait dengan baris basis data. Saya ingin memiliki tautan "hapus baris" untuk setiap baris, tetapi saya ingin mengonfirmasi dengan pengguna sebelumnya.

Apakah ada cara untuk melakukan ini menggunakan dialog modal Bootstrap Twitter?

SWL
sumber
4
jsfiddle.net/MjmVr/363
joni jones
3
Setelah mengalami pertanyaan ini, saya ingin berbincang dengan (apa yang menurut saya) seperti "perbaikan" yang sederhana dan lebih ramping untuk masalah ini. Saya berjuang dengan itu untuk sementara waktu dan kemudian menyadari betapa sederhananya itu: cukup masukkan tombol pengiriman formulir yang sebenarnya dalam dialog modal, dan kemudian tombol kirim pada formulir itu sendiri tidak melakukan apa-apa selain menyalakan jendela dialog ... masalah terpecahkan.
Michael Doleman
@jonijones contoh ini tidak berfungsi untuk saya (pesan konfirmasi tidak ditampilkan pada klik tombol pertama) - diuji dalam chrome
egmfrs

Jawaban:

396

DAPATKAN resep

Untuk tugas ini Anda dapat menggunakan plugins dan ekstensi bootstrap yang sudah tersedia. Atau Anda dapat membuat popup konfirmasi sendiri hanya dengan 3 baris kode. Saksikan berikut ini.

Katakanlah kita memiliki tautan ini ( data-hrefbukan catatan href) atau tombol yang ingin kita hapus konfirmasi untuk:

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

Di sini #confirm-deletemenunjuk ke modal popup div di HTML Anda. Seharusnya tombol "OK" dikonfigurasi seperti ini:

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

Sekarang Anda hanya perlu javascript kecil ini untuk membuat tindakan penghapusan dapat dikonfirmasi:

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

Jadi pada show.bs.modalacara tombol hapus hrefdiatur ke URL dengan id rekaman yang sesuai.

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


Resep POST

Saya menyadari bahwa dalam beberapa kasus mungkin diperlukan untuk melakukan permintaan POST atau DELETE daripada GET. Itu masih cukup sederhana tanpa terlalu banyak kode. Lihatlah demo di bawah ini dengan pendekatan ini:

// Bind click to OK button within popup
$('#confirm-delete').on('click', '.btn-ok', function(e) {

  var $modalDiv = $(e.delegateTarget);
  var id = $(this).data('recordId');

  $modalDiv.addClass('loading');
  $.post('/api/record/' + id).then(function() {
     $modalDiv.modal('hide').removeClass('loading');
  });
});

// Bind to modal opening to set necessary data properties to be used to make request
$('#confirm-delete').on('show.bs.modal', function(e) {
  var data = $(e.relatedTarget).data();
  $('.title', this).text(data.recordTitle);
  $('.btn-ok', this).data('recordId', data.recordId);
});

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


Bootstrap 2.3

Ini adalah versi asli dari kode yang saya buat ketika saya menjawab pertanyaan ini untuk modal Bootstrap 2.3.

$('#modal').on('show', function() {
    var id = $(this).data('id'),
        removeBtn = $(this).find('.danger');
    removeBtn.attr('href', removeBtn.attr('href').replace(/(&|\?)ref=\d*/, '$1ref=' + id));
});

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

dfsq
sumber
1
Ini berfungsi hampir sempurna tetapi bahkan dalam versi biola (seperti di situs saya), id tidak diteruskan ke tombol Ya di ibukota. Saya memperhatikan bahwa Anda mencoba mengganti & ref bukan ? Ref jadi saya mencoba mengubahnya tetapi tetap tidak berfungsi. Apakah saya melewatkan sesuatu yang lain di sini? Ini sangat bagus, jadi TIA atas bantuan Anda!
SWL
Terima kasih @dfsq - ini bekerja dengan baik. Dialognya tidak bersembunyi saat mengklik tombol 'tidak' jadi saya mengubah href ke # alih-alih modal hide dan itu juga berfungsi. Sekali lagi terima kasih atas bantuan Anda.
SWL
22
Satu perubahan adalah permintaan penghapusan akhir harus menghasilkan posting, bukan GEt seperti yang Anda lakukan dengan tautan. Jika Anda mengizinkan Delete ada di GET, maka pihak ketiga yang berbahaya dapat dengan mudah membuat tautan di situs atau email yang menyebabkan pengguna Anda tanpa disadari menghapus sesuatu. Ini mungkin tampak konyol, tetapi ada skenario di mana ini akan menjadi masalah keamanan yang serius.
AaronLS
2
Anda mungkin ingin melihat Vex . Jauh lebih mudah untuk melakukan apa yang Anda minta: jsfiddle.net/adamschwartz/hQump .
Adam
3
Tergoda untuk downvote karena menggunakan GET untuk melakukan tindakan yang merusak. Ada banyak, banyak alasan berbeda yang tidak boleh Anda lakukan.
NickG
158

http://bootboxjs.com/ - karya terbaru dengan Bootstrap 3.0.0

Contoh paling sederhana yang mungkin:

bootbox.alert("Hello world!"); 

Dari situs:

Perpustakaan memaparkan tiga metode yang dirancang untuk meniru setara JavaScript asli mereka. Tanda tangan metode yang tepat mereka fleksibel karena masing-masing dapat mengambil berbagai parameter untuk menyesuaikan label dan menentukan default, tetapi mereka paling sering disebut seperti:

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

Berikut cuplikannya dalam aksi (klik "Jalankan cuplikan kode" di bawah):

$(function() {
  bootbox.alert("Hello world!");
});
<!-- required includes -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>

<!-- bootbox.js at 4.4.0 -->
<script src="https://rawgit.com/makeusabrew/bootbox/f3a04a57877cab071738de558581fbc91812dce9/bootbox.js"></script>

Rifat
sumber
2
Sayangnya, saat Anda memerlukan teks non-bahasa Inggris pada judul dan tombol Anda harus memodifikasi JS atau mulai membuat parameter hampir sama seperti menambahkan bootstrap html dan JS sendiri. :)
Johncl
31
  // ---------------------------------------------------------- Generic Confirm  

  function confirm(heading, question, cancelButtonTxt, okButtonTxt, callback) {

    var confirmModal = 
      $('<div class="modal hide fade">' +    
          '<div class="modal-header">' +
            '<a class="close" data-dismiss="modal" >&times;</a>' +
            '<h3>' + heading +'</h3>' +
          '</div>' +

          '<div class="modal-body">' +
            '<p>' + question + '</p>' +
          '</div>' +

          '<div class="modal-footer">' +
            '<a href="#" class="btn" data-dismiss="modal">' + 
              cancelButtonTxt + 
            '</a>' +
            '<a href="#" id="okButton" class="btn btn-primary">' + 
              okButtonTxt + 
            '</a>' +
          '</div>' +
        '</div>');

    confirmModal.find('#okButton').click(function(event) {
      callback();
      confirmModal.modal('hide');
    });

    confirmModal.modal('show');     
  };

  // ---------------------------------------------------------- Confirm Put To Use

  $("i#deleteTransaction").live("click", function(event) {
    // get txn id from current table row
    var id = $(this).data('id');

    var heading = 'Confirm Transaction Delete';
    var question = 'Please confirm that you wish to delete transaction ' + id + '.';
    var cancelButtonTxt = 'Cancel';
    var okButtonTxt = 'Confirm';

    var callback = function() {
      alert('delete confirmed ' + id);
    };

    confirm(heading, question, cancelButtonTxt, okButtonTxt, callback);

  });
jousby
sumber
1
Ini adalah posting lama tetapi saya ingin hal yang sama dilakukan tetapi ketika saya menggunakan kode di atas, dialog modal menunjukkan dosent?
Saurabh
28

Saya menyadari itu pertanyaan yang sangat lama, tetapi karena saya bertanya-tanya hari ini untuk metode yang lebih efisien dalam menangani bootstrap modals. Saya melakukan riset dan menemukan sesuatu yang lebih baik daripada solusi yang ditunjukkan di atas, yang dapat ditemukan di tautan ini:

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

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

Kemudian tanyakan saja pertanyaan / konfirmasi ke href:

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

Dengan cara ini, modal konfirmasi jauh lebih universal sehingga dapat dengan mudah digunakan kembali di bagian lain situs web Anda.

Arjan
sumber
4
Harap jangan memposting kode dari sumber lain tanpa atribusi: petefreitag.com/item/809.cfm .
A. Webb
4
Meskipun op pertama kali lupa atribusi, ini adalah hal yang sempurna bagi saya. Bekerja seperti pesona.
Janis Peisenieks
3
Saya pikir itu bukan ide yang baik menghapus item dengan permintaan GET http
Miguel Prz
7
Momma mengatakan kepada saya untuk tidak mengklik tautan fusi dingin
Mike Purcell
3
@BenY Ini bukan tentang apakah pengguna memiliki izin untuk melakukan sesuatu atau tidak, ini tentang pengguna jahat yang sudah memiliki izin untuk melakukan hal-hal yang diperdaya untuk mengklik tautan di situs lain, email dll sehingga pengguna jahat dapat mengambil keuntungan dari izin pengguna tersebut.
Brett
17

Berkat solusi @ Jousby , saya berhasil membuat tambang saya berfungsi juga, tetapi ternyata saya harus sedikit meningkatkan markup modal Bootstrap solusinya agar membuatnya render dengan benar seperti ditunjukkan dalam contoh resmi .

Jadi, inilah versi modifikasi saya dari confirmfungsi generik yang berfungsi dengan baik:

/* Generic Confirm func */
  function confirm(heading, question, cancelButtonTxt, okButtonTxt, callback) {

    var confirmModal = 
      $('<div class="modal fade">' +        
          '<div class="modal-dialog">' +
          '<div class="modal-content">' +
          '<div class="modal-header">' +
            '<a class="close" data-dismiss="modal" >&times;</a>' +
            '<h3>' + heading +'</h3>' +
          '</div>' +

          '<div class="modal-body">' +
            '<p>' + question + '</p>' +
          '</div>' +

          '<div class="modal-footer">' +
            '<a href="#!" class="btn" data-dismiss="modal">' + 
              cancelButtonTxt + 
            '</a>' +
            '<a href="#!" id="okButton" class="btn btn-primary">' + 
              okButtonTxt + 
            '</a>' +
          '</div>' +
          '</div>' +
          '</div>' +
        '</div>');

    confirmModal.find('#okButton').click(function(event) {
      callback();
      confirmModal.modal('hide');
    }); 

    confirmModal.modal('show');    
  };  
/* END Generic Confirm func */
nemesisfixx
sumber
3
Solusi hebat di sini. Saya membuat sedikit modifikasi untuk menangani panggilan balik untuk tautan batal. Satu rekomendasi kecil gunakan #! alih-alih # di href Anda untuk mencegah halaman bergulir ke atas.
Domenic D.
Jika saya bisa menggandakan suara ini saya akan. Bagus dan elegan. Terima kasih.
Nigel Johnson
Solusi yang sangat bagus Satu lagi perbaikan yang bisa saya sarankan adalah menambahkan argumen lain: btnType = "btn-primary"dan kemudian mengubah kode untuk tombol OK untuk mengandung class="btn ' + btnType + '". Dengan cara itu orang dapat melewati argumen opsional untuk mengubah tampilan tombol OK, seperti btn-dangeruntuk menghapus.
IamNaN
Terima kasih. Saya harus bertukar sekitar tag <h3> dan <a> (h3 terlebih dahulu) agar ini ditampilkan dengan benar.
Dave Dawkins
10

Saya menemukan ini berguna dan mudah digunakan, ditambah lagi tampilannya cantik: http://maxailloud.github.io/confirm-bootstrap/ .

Untuk menggunakannya, masukkan file .js di halaman Anda kemudian jalankan:

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

Ada berbagai opsi yang dapat Anda terapkan padanya, agar terlihat lebih baik saat melakukan konfirmasi penghapusan, saya menggunakan:

$('your-link-selector').confirmModal({
    confirmTitle: 'Please confirm',
    confirmMessage: 'Are you sure you want to delete this?',
    confirmStyle: 'danger',
    confirmOk: '<i class="icon-trash icon-white"></i> Delete',
    confirmCallback: function (target) {
         //perform the deletion here, or leave this option
         //out to just follow link..
    }
});
Mark Rhodes
sumber
lib yang bagus
loretoparisi
4

Saya dapat dengan mudah menangani jenis tugas ini menggunakan perpustakaan bootbox.js. Pada awalnya Anda harus memasukkan file JS bootbox. Kemudian dalam fungsi event handler Anda cukup menulis kode berikut:

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

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

    });

Situs bootbox resmi

karim_fci
sumber
2

Solusi berikut lebih baik daripada bootbox.js , karena

  • Itu bisa melakukan apa saja yang bisa dilakukan bootbox.js;
  • Sintaks penggunaannya lebih sederhana
  • Ini memungkinkan Anda untuk mengontrol warna pesan Anda secara elegan menggunakan "kesalahan", "peringatan" atau "info"
  • Bootbox panjangnya 986 baris, hanya milikku 110 baris

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

Untuk menggunakan 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>
masukkan deskripsi gambar di sini

Bung konyol
sumber
1

Anda dapat mencoba solusi saya yang lebih dapat digunakan kembali dengan fungsi callback . Dalam fungsi ini Anda dapat menggunakan permintaan POST atau logika. Perpustakaan yang digunakan: JQuery 3> dan Bootstrap 3> .

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

Kode html untuk pengujian:

...
<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';
};
Alexey Nikitenko
sumber
0

Ketika datang ke proyek besar yang relevan kita mungkin perlu sesuatu yang dapat digunakan kembali . Ini adalah sesuatu yang saya datangi dengan bantuan 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" %>

Catatan: Ini menggunakan metode penghapusan http untuk permintaan penghapusan, Anda dapat mengubahnya dari javascript atau, dapat mengirimnya menggunakan atribut data seperti pada judul data atau url data dll, untuk mendukung permintaan apa pun.

Maleen Abewardana
sumber
0

Jika Anda ingin melakukannya di pintasan termudah, maka Anda dapat melakukannya dengan plugin ini .


Tetapi plugin ini adalah implementasi alternatif menggunakan Bootstrap Modal . Dan implementasi Bootstrap yang sebenarnya juga sangat mudah, jadi saya tidak suka menggunakan plugin ini karena menambahkan konten JS berlebih di halaman, yang akan memperlambat waktu pemuatan halaman.


Ide

Saya suka mengimplementasikannya sendiri dengan cara ini-

  1. Jika pengguna mengklik pada tombol untuk menghapus item dari daftar, maka panggilan JS akan memasukkan ID Item (atau data yang lebih penting) dalam formulir di modal.
  2. Kemudian dalam pop-up, akan ada 2 tombol untuk konfirmasi.

    • Ya akan mengirimkan formulir (dengan ajax atau mengirimkan formulir langsung)
    • Tidak hanya akan mengabaikan modal

Kode akan seperti ini (menggunakan 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>

Anda harus mengubah tindakan formulir sesuai dengan kebutuhan Anda.

Selamat coading :)

Abrar Jahin
sumber
0

Resep POST dengan navigasi ke halaman target dan file Blade yang dapat digunakan kembali

Jawaban dfsq sangat bagus. Saya memodifikasinya sedikit agar sesuai dengan kebutuhan saya: Saya benar-benar membutuhkan modal untuk kasus itu, setelah mengklik, pengguna juga akan dinavigasi ke halaman yang sesuai. Mengeksekusi kueri secara sinkron tidak selalu menjadi kebutuhan.

Menggunakan Bladesaya membuat file 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>

Sekarang, menggunakannya langsung:

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

Tidak banyak berubah di sini dan modal dapat dimasukkan seperti ini:

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

Hanya dengan menempatkan kata kerja di sana, ia menggunakannya. Dengan cara ini, CSRF juga digunakan.

Membantu saya, mungkin itu membantu orang lain.

Es api
sumber