Twitter Bootstrap kullanarak kalıcı / iletişim kutusundaki silme işlemini onaylamak istiyor musunuz?


284

Veritabanı satırlarına bağlı satırların bir HTML tablosu var. Her satır için bir "satırı sil" bağlantısına sahip olmak istiyorum, ancak önceden kullanıcıyla onaylamak istiyorum.

Twitter Bootstrap kalıcı iletişim kutusunu kullanarak bunu yapmanın bir yolu var mı?



3
Bu soru üzerinde koşmak zorunda kaldım (bana ne gibi) bu sorun için böyle basit ve daha akıcı "düzeltme" ile chime-in istedim. Bir süre bununla mücadele ettim ve daha sonra ne kadar basit olabileceğini anladım: sadece gerçek iletişim formunu modal iletişim kutusuna koyun ve formdaki gönder düğmesi iletişim penceresini ateşlemekten başka bir şey yapmaz ... sorun çözüldü.
Michael Doleman

@jonijones bu örnek benim için çalışmıyor (onay düğmesi ilk düğmeye tıklandığında görüntülenmiyor)
kromda

Yanıtlar:


397

Tarif al

Bu görev için zaten mevcut olan eklentileri ve bootstrap uzantılarını kullanabilirsiniz. Veya sadece 3 satır kodla kendi onay pencerenizi oluşturabilirsiniz . Bunu kontrol et.

Aşağıdakiler için silme onayını almak istediğimiz bu bağlantılara (not data-hrefyerine href) veya düğmelere sahip olduğumuzu varsayalım:

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

Burada #confirm-deleteHTML'nizde kalıcı bir açılır pencere div'i işaret ediyor. Bu şekilde yapılandırılmış bir "Tamam" düğmesi olmalıdır:

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

Şimdi silme işlemini onaylanabilir hale getirmek için bu küçük javascript'e ihtiyacınız var:

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

Böylece show.bs.modalolay silme düğmesi hrefilgili kayıt kimliğine sahip URL'ye ayarlanır.

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


POST tarifi

Bazı durumlarda GET yerine POST veya DELETE isteğinin yerine getirilmesi gerekebileceğini fark ediyorum. Çok fazla kod olmadan hala oldukça basit. Bu yaklaşımla aşağıdaki demoya bir göz atın:

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

İşte Bootstrap 2.3 modal için bu soruyu cevaplarken yaptığım kodun orijinal bir versiyonu.

$('#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/


1
Bu neredeyse mükemmel çalışıyor ancak keman sürümünde (sitemde olduğu gibi), kimlik moddaki Evet düğmesine geçmiyor. ? Ref yerine & ref yerine çalıştığınızı fark ettim, bu yüzden değiştirmeye çalıştım ama hala çalışmıyor. Burada başka bir şey mi eksik? Aksi takdirde harika yani TIA yardımınız için!
SWL

Teşekkürler @ dfsq - bu güzel çalıştı. Iletisim 'Hayır' düğmesini tıklatarak gizlenmiyor, bu yüzden href modal gizle yerine # olarak değiştirdim ve bu da işe yarıyor. Yardımın için tekrar teşekkürler.
SWL

22
Bir değişiklik, son silme isteğinin, bir bağlantıyla yaptığınız gibi GEt değil, bir gönderiyle sonuçlanması gerektiğidir. Delete'in bir GET'te olmasına izin verirseniz, kötü niyetli üçüncü taraflar, kullanıcıların farkında olmadan bir şeyler silmesine neden olan siteler veya e-postalarda kolayca bağlantı oluşturabilir. Aptalca görünebilir, ancak bunun ciddi bir güvenlik sorunu olacağı senaryolar vardır.
AaronLS

2
Vex'e bir göz atmak isteyebilirsiniz . İstediğinizi yapmak çok daha basit: jsfiddle.net/adamschwartz/hQump .
Adam

3
Yıkıcı bir eylem gerçekleştirmek için bir GET kullanmak için aşağı oy kullanmaya ayarlandı. Bunu asla yapmamanız gereken birçok farklı sebep var.
NickG

158

http://bootboxjs.com/ - Bootstrap 3.0.0 ile son çalışmalar

Olası en basit örnek:

bootbox.alert("Hello world!"); 

Siteden:

Kütüphane, yerel JavaScript eşdeğerlerini taklit etmek için tasarlanmış üç yöntem ortaya koyar. Kesin yöntem imzaları esnektir, çünkü her biri etiketleri özelleştirmek ve varsayılanları belirlemek için çeşitli parametreler alabilir, ancak bunlar genellikle şöyle adlandırılır:

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

İşte bir snippet'i işte (aşağıdaki "Kod snippet'ini çalıştır" ı tıklayın):

$(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
Ne yazık ki, başlık ve düğmelerde İngilizce olmayan bir metne ihtiyacınız olduğu anda, ya JS'yi değiştirmeniz ya da sadece bootstrap html ve JS'yi kendiniz eklemek kadar parametreleştirmeye başlamanız gerekir. :)
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
Onun eski bir yazı ama aynı şeyi yapmak istiyorum ama yukarıdaki kodu kullandığımda kalıcı iletişim dosent gösterisi?
Saurabh

28

Ben çok eski bir soru fark ediyorum, ama ben bugün bootstrap modals ele almak için daha verimli bir yöntem merak ettiğimden beri. Biraz araştırma yaptım ve yukarıda gösterilen çözümlerden daha iyi bir şey buldum, bu bağlantıda bulunabilir:

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

İlk önce jquery yükleyin

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

Daha sonra href'e herhangi bir soru / onay isteyin:

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

Bu şekilde onaylama yöntemi çok daha evrenseldir ve web sitenizin diğer bölümlerinde kolayca yeniden kullanılabilir.


4
Lütfen ilişkilendirmeden başka kaynaklardan kod göndermeyin: petefreitag.com/item/809.cfm .
A. Webb

4
Operasyon ilk başta atıfları unutsa da, bu benim için mükemmel bir şeydi. Tıkır tıkır çalışıyor.
Janis Peisenieks

3
Bence bir GET http isteği ile öğeleri silmek iyi bir fikir değil
Miguel Prz

7
Momma bana herhangi bir soğuk füzyon bağlantısına tıklamamamı söyledi
Mike Purcell

3
@BenY Kullanıcının bir şey yapma iznine sahip olup olmadığı değil, kötü niyetli kullanıcının bu kullanıcıların izinlerinden yararlanabilmesi için diğer sitelerdeki, e-postalardaki vb.
Brett

17

@ Jousby'nin çözümü sayesinde , benimkini de çalıştırmayı başardım, ancak resmi örneklerde gösterildiği gibi doğru bir şekilde oluşturulmasını sağlamak için çözümünün Bootstrap modal işaretlemesini biraz geliştirmek zorunda kaldım .

Yani, işte confirmiyi çalışan genel fonksiyonun değiştirilmiş versiyonu :

/* 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
Burada harika bir çözüm. İptal bağlantısı için geri arama yapmak için bazı küçük değişiklikler yaptım. Küçük bir öneri #! Sayfanın en üste kaymasını önlemek için href'inizdeki # yerine.
Domenic

Bunu iki katına çıkarabilirsem yapardım. Güzel ve zarif. Teşekkür ederim.
Nigel Johnson

Çok güzel bir çözüm. Önerebileceğim bir gelişme daha var: başka bir argüman eklemek: btnType = "btn-primary"ve sonra içermek için Tamam düğmesinin kodunu değiştirmek class="btn ' + btnType + '". Bu şekilde, btn-dangersilme işlemi gibi, Tamam düğmesinin görünümünü değiştirmek için isteğe bağlı bir bağımsız değişken iletilebilir .
IamNaN

Teşekkür ederim. Bunun doğru bir şekilde oluşturulması için <h3> ve <a> etiketlerini (ilk önce h3) değiştirmeliydim.
Dave Dawkins

10

Bunu kullanışlı ve kullanımı kolay buldum, ayrıca güzel görünüyor: http://maxailloud.github.io/confirm-bootstrap/ .

Kullanmak için sayfanıza .js dosyasını ekleyin ve ardından çalıştırın:

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

Silme işlemini onaylamak için yaparken daha iyi görünmesini sağlamak için uygulayabileceğiniz çeşitli seçenekler vardır, kullanıyorum:

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

bu güzel bir lib
loretoparisi

4

Bootbox.js kütüphanesini kullanarak bu tür görevleri kolayca halledebilirim. İlk önce bootbox JS dosyasını eklemeniz gerekir. Ardından olay işleyici işlevinizde aşağıdaki kodu yazmanız yeterlidir:

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

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

    });

Resmi bootboxjs sitesi


2

Aşağıdaki çözüm bootbox.js'den daha iyidir , çünkü

  • Bootbox.js'nin yapabileceği her şeyi yapabilir;
  • Kullanımı sözdizimi daha basit
  • "Hata", "uyarı" veya "bilgi" kullanarak mesajınızın rengini zarif bir şekilde kontrol etmenizi sağlar
  • Bootbox 986 satır uzunluğunda, sadece 110 satır uzunluğunda

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 kullanmak için :

<!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>
resim açıklamasını buraya girin


1

Geri arama işlevi ile çözümümü daha fazla yeniden deneyebilirsiniz . Bu işlevde POST isteğini veya bazı mantığı kullanabilirsiniz. Kullanılan kütüphaneler: JQuery 3> ve Bootstrap 3> .

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

Test için HTML kodu:

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

İlgili büyük bir proje söz konusu olduğunda, yeniden kullanılabilir bir şeye ihtiyacımız olabilir . Bu SO'nun yardımıyla geldiğim bir şey.

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

Not: Bu, silme isteği için http silme yöntemini kullanır, javascript'ten değiştirebilir veya herhangi bir isteği desteklemek için veri başlığında veya veri URL'sinde olduğu gibi bir veri özniteliğini kullanarak gönderebilirsiniz.


0

Bunu en kolay kısayolda yapmak istiyorsanız, u bu eklenti ile yapabilirsiniz .


Ancak bu eklenti Bootstrap Modal kullanan alternatif bir uygulamadır . Ve gerçek Bootstrap uygulaması da çok kolay, bu yüzden bu eklentiyi kullanmak istemiyorum çünkü sayfaya aşırı JS içeriği ekliyor, bu da sayfa yükleme süresini yavaşlatacak.


Fikir

Bu şekilde kendim uygulamayı seviyorum-

  1. Eğer kullanıcı tıklama listeden bir öğe silmek için bir düğmeye s, ardından bir JS çağrı koyacağız Öğe Kimliği modal bir biçimde (ya da herhangi daha gerekli verileri).
  2. Ardından açılır pencerede onay için 2 düğme olacaktır.

    • Evet formu gönderecektir (ajax veya doğrudan form gönderimi ile)
    • Hayır sadece kipi yok edecek

Kod şöyle olacaktır ( Bootstrap kullanarak ) -

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

Form işlemini gereksiniminize göre değiştirmeniz gerekir.

Mutlu coading :)


0

Hedef sayfaya navigasyon ve yeniden kullanılabilir Blade dosyası ile POST Tarif

dfsq'nin cevabı çok güzel. İhtiyaçlarımı karşılamak için biraz değiştirdim: Aslında, tıkladıktan sonra kullanıcının ilgili sayfaya yönlendirileceği durum için bir modele ihtiyacım vardı. Sorguyu eşzamansız olarak yürütmek, her zaman gerekli değildir.

Kullanarak Bladedosyayı oluşturdum 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>

Şimdi, kullanımı basittir:

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

Burada çok fazla değişiklik yapılmadı ve modal şu ​​şekilde dahil edilebilir:

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

Sadece fiili oraya koyarak, onu kullanır. Bu şekilde CSRF de kullanılır.

Bana yardým etti, belki baţka birine yardým eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.