Підтвердити видалення в модальному / діалоговому вікні за допомогою Twitter Bootstrap?


284

У мене HTML-рядок рядків прив’язаний до рядків бази даних. Я хотів би мати посилання "видалити рядок" для кожного рядка, але я хотів би попередньо підтвердити його з користувачем.

Чи можливо це зробити за допомогою модального діалогового вікна Twitter Bootstrap?



3
Перебігаючи це питання, я хотів зафіксувати (що мені здається) таке просте і більш обтічне "виправлення" для цього питання. Я деякий час боровся з цим, а потім зрозумів, наскільки це просто: просто покладіть фактичну кнопку подання форми у модальне діалогове вікно, а потім кнопка подання у самій формі не робить нічого, крім запуску діалогового вікна ... проблема вирішена.
Майкл Долеман

@jonijones цей приклад не працює для мене (повідомлення про підтвердження не відображається при натисканні першої кнопки) - перевірено в хромі
egmfrs

Відповіді:


397

Отримайте рецепт

Для цього завдання можна використовувати вже доступні плагіни та розширення для завантаження. Або ви можете зробити власне спливаюче вікно підтвердження лише з 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вказується на модальний спливаючий поділ у вашому 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>

Тепер вам потрібен лише цей маленький javascript, щоб зробити дію видалення підтверджуваною:

$('#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 запиту може знадобитися, а не GET. Це все ще досить просто, не надто багато коду. Погляньте на демонстраційну демонстрацію нижче при такому підході:

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

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

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

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

Демо: http://plnkr.co/edit/V4GUuSueuuxiGr4L9LmG?p=preview


Запуск 2.3

Ось оригінальна версія коду, яку я зробив, коли відповідав на це питання для Bootstrap 2.3.

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

Демонстрація : http://jsfiddle.net/MjmVr/1595/


1
Це працює майже ідеально, але навіть у скрипковій версії (як на моєму сайті) ідентифікатор не передається кнопці Так у модальному режимі. Я помітив, що ви намагаєтесь замінити & ref замість ? Ref, тому я спробував змінити це, але він все ще не працює. Чи пропускаю я тут щось інше? Інакше це чудово, тому ТІА за вашу допомогу!
SWL

Спасибі @dfsq - це спрацювало чудово. Діалогове вікно не ховається після натискання кнопки "ні", тому я змінив href на #, а не модальний приховати, і це також працює. Ще раз дякую за вашу допомогу.
SWL

22
Один твік - остаточний запит на видалення повинен спричинити публікацію, а не GEt, як це було б із посиланням. Якщо ви дозволите "Видалити" в GET, то зловмисні треті сторони можуть легко створювати посилання на веб-сайтах або електронних листах, які призводять до того, що ваш користувач мимоволі видаляє речі. Це може здатися дурним, але є сценарії, коли це було б серйозною проблемою безпеки.
AaronLS

2
Ви можете поглянути на Vex . Набагато простіше робити те, що ви просите: jsfiddle.net/adamschwartz/hQump .
Адам

3
Спокусився спростувати використання 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 або почати параметризувати майже стільки ж, скільки просто додавати HTML-файл завантаження та JS самостійно. :)
Джонкл

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
Це старий пост, але я хочу те ж саме зробити, але коли я використовую вищевказаний код, з'явиться модальний діалоговий візит дози?
Саураб

28

Я усвідомлюю це дуже давнє запитання, але оскільки я сьогодні задався питанням щодо більш ефективного способу роботи з режимами завантаження. Я провів кілька досліджень і знайшов щось краще, ніж рішення, показані вище, що можна знайти за цим посиланням:

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 .
А. Вебб

4
Хоча оп спочатку забув атрибуцію, для мене це було ідеальною справою. Працює як шарм.
Janis Peisenieks

3
Я думаю, що не дуже добре видаляти елементи за допомогою GET http-запиту
Miguel Prz

7
Мама сказала мені не натискати будь-які посилання на холодний синтез
Майк Перселл

3
@BenY Йдеться не про те, чи має користувач дозвіл на те, чи ні, а про зловмисних користувачів, які вже мають дозвіл на те, щоб вводити речі на натискання посилань на інших сайтах, електронних листах тощо, щоб зловмисний користувач міг скористатися цим дозволом користувачів.
Бретт

17

Завдяки @ Jousby в розчині , мені вдалося отримати мої працювало добре, але знайшов , що я повинен був поліпшити Bootstrap свого рішення в модальних розмітку трохи , щоб зробити це правильно робить , як показано в офіційних прикладах .

Отже, ось моя модифікована версія родової confirmфункції, яка добре працювала:

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

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

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

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

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

    confirmModal.modal('show');    
  };  
/* END Generic Confirm func */

3
Чудове рішення тут. Я вніс кілька незначних змін для обробки зворотного дзвінка для посилання для скасування. Одна невелика рекомендація використовувати #! замість # у вашому href, щоб запобігти прокрученню сторінки доверху.
Доменіч Д.

Якби я міг подвоїти голос, я би це зробив. Приємно і елегантно. Дякую.
Найджел Джонсон

Дуже приємне рішення. Ще одне вдосконалення, яке я можу запропонувати, - це додати ще один аргумент: btnType = "btn-primary"а потім змінити код, щоб містити кнопку ОК class="btn ' + btnType + '". Таким чином можна передавати необов'язковий аргумент, щоб змінити вигляд кнопки ОК, як-от btn-dangerдля видалення.
IamNaN

Дякую. Мені довелося міняти місцями теги <h3> та <a> (спочатку h3), щоб правильно відобразити це.
Дейв Докінз

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

це приємна
ліб

4

Я легко впораюся з цим типом завдань за допомогою бібліотеки bootbox.js. Спочатку потрібно включити файл JS завантажувача. Тоді у своїй функції обробника подій просто напишіть наступний код:

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

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

    });

Офіційний сайт для завантаження


2

Наступне рішення краще, ніж bootbox.js , тому що

  • Він може робити все, що може зробити bootbox.js;
  • Синтаксис використання простіший
  • Це дозволяє елегантно керувати кольором вашого повідомлення за допомогою "помилки", "попередження" або "інформації"
  • Завантажувальна машина - 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> і Bootstrap 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

Коли справа доходить до відповідно великого проекту, нам може знадобитися щось повторне використання . Це те, що я прийшов за допомогою ТА.

підтвердженняDelete.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 або, надіслати його, використовуючи атрибут даних, як у заголовку даних або URL-адресі тощо, для підтримки будь-якого запиту.


0

Якщо ви хочете зробити це найпростішим ярликом, тоді ви можете зробити це за допомогою цього плагіна .


Але цей плагін є альтернативною реалізацією за допомогою Bootstrap Modal . І реальна реалізація Bootstrap також дуже проста, тому мені не подобається використовувати цей плагін, оскільки він додає надлишок вмісту JS на сторінці, що сповільнить час завантаження сторінки.


Ідея

Мені подобається реалізовувати це таким чином -

  1. Якщо користувач натисне s на кнопку, щоб видалити елемент зі списку, тоді JS-дзвінок поставить ідентифікатор елемента (або будь-які інші важливі дані) у форму в модальному режимі.
  2. Потім у спливаючому вікні з’являться 2 кнопки для підтвердження.

    • Так , надішліть форму (з аяксом або прямою формою подання)
    • Ніхто не просто відхилить модаль

Код буде таким (за допомогою 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 з навігацією до цільової сторінки та файлом леза для багаторазового використання

Відповідь dfsq дуже приємна. Я трохи змінив його, щоб відповідати моїм потребам: мені фактично був потрібний режим для випадку, щоб після натискання користувач також перейшов на відповідну сторінку. Асинхронно виконувати запит - це не завжди те, що потрібно.

Скориставшись 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.

Допомогли мені, можливо, це допоможе комусь іншому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.