Twitter 부트 스트랩을 사용하여 모달 / 대화 상자에서 삭제를 확인 하시겠습니까?


284

데이터베이스 행에 연결된 행의 HTML 테이블이 있습니다. 각 행에 대해 "행 삭제"링크를 갖고 싶지만 사전에 사용자에게 확인하고 싶습니다.

Twitter Bootstrap 모달 대화 상자를 사용하여이를 수행 할 수있는 방법이 있습니까?



3
이 질문에 부딪 치면서 나는이 문제에 대해 간단하고 능률적 인 "수정"으로 차임하고 싶었습니다. 나는 잠시 동안 어려움을 겪고 얼마나 간단한 지 깨달았습니다 : 실제 양식 제출 버튼을 모달 대화 상자에 넣으면 양식 자체의 제출 버튼이 대화 상자 창을 실행하는 것 외에는 아무것도하지 않습니다 ... 문제가 해결되었습니다.
Michael Doleman

@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-deleteHTML의 모달 팝업 div를 가리 킵니다. "OK"버튼이 다음과 같이 구성되어 있어야합니다.

<div class="modal fade" id="confirm-delete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                ...
            </div>
            <div class="modal-body">
                ...
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
                <a class="btn btn-danger btn-ok">Delete</a>
            </div>
        </div>
    </div>
</div>

이제 삭제 작업을 확인하려면이 작은 자바 스크립트 만 있으면됩니다.

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

따라서 show.bs.modal이벤트 삭제 버튼 href은 해당 레코드 ID를 가진 URL로 설정됩니다.

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


POST 레시피

경우에 따라 GET 대신 POST 또는 DELETE 요청을 수행해야 할 수도 있습니다. 너무 많은 코드없이 여전히 간단합니다. 이 방법으로 아래 데모를 살펴보십시오.

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

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

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

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

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


부트 스트랩 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
이것은 거의 완벽하게 작동하지만 바이올린 버전에서도 (내 사이트 에서처럼) 모달의 예 버튼으로 ID가 전달되지 않습니다. 나는 당신이 ? ref 대신 & ref 를 바꾸려고한다는 것을 알았으므로 변경하려고 시도했지만 여전히 작동하지 않습니다. 여기에 다른 것이 빠져 있습니까? 그렇지 않으면 도움이되기 때문에 TIA가 좋습니다!
SWL

감사합니다 @ dfsq-이것은 아름답게 작동했습니다. '아니오'버튼을 클릭해도 대화 상자가 숨겨져 있지 않으므로 모달 숨기기 대신 href를 #으로 변경했으며 제대로 작동합니다. 도와 주셔서 감사합니다.
SWL

22
하나의 조정은 링크를 사용하는 것처럼 GEt가 아닌 게시물을 최종 삭제 요청으로 만드는 것입니다. GET에서 삭제를 허용하면 악의적 인 제 3자가 사이트 나 이메일에 링크를 쉽게 만들어 사용자가 실수로 항목을 삭제하게 할 수 있습니다. 어리석은 것처럼 보이지만 심각한 보안 문제가 될 수있는 시나리오가 있습니다.
AaronLS

2
Vex를 살펴볼 수 있습니다 . jsfiddle.net/adamschwartz/hQump : 당신이 요구하는 것을하는 것이 훨씬 간단합니다 .
Adam

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를 추가하는 것만큼이나 매개 변수화를 시작해야합니다. :)
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
오래된 게시물이지만 같은 일을하고 싶지만 위의 코드를 사용하면 모달 대화 상자가 표시됩니다.
Saurabh

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 속성이없는 다른 소스의 코드는 게시하지 마십시오 .
A. Webb

4
작전이 처음에 귀인을 잊어 버렸지 만 이것은 나에게 완벽한 것이었다. 매력처럼 작동합니다.
Janis Peisenieks

3
GET http 요청으로 항목을 삭제하는 것은 좋은 생각이 아니라고 생각합니다.
Miguel Prz

7
엄마는 차가운 융합 링크를 클릭하지 말라고 이야기
마이크 퍼셀에게

3
@BenY 사용자가 작업을 수행 할 권한이 있는지 여부가 아니라 악의적 인 사용자가 다른 사이트, 전자 메일 등의 링크를 클릭하도록 속이는 작업을 수행 할 권한 이있는 악의적 인 사용자에 대한 것이므로 악의적 인 사용자가 해당 사용자 권한을 이용할 수 있습니다.
Brett

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에 # 대신.
Domenic D.

내가 투표를 두 배로 할 수 있다면 나는 할 것이다. 멋지고 우아합니다. 감사합니다.
Nigel Johnson

아주 좋은 해결책입니다. 제안 할 수있는 또 다른 개선 사항은 다른 인수를 추가 btnType = "btn-primary"한 다음 확인 버튼의 코드를 포함하도록 변경하는 것 class="btn ' + btnType + '"입니다. 이렇게하면 선택적인 인수를 전달하여 btn-danger삭제 와 같은 확인 버튼의 모양을 변경할 수 있습니다 .
IamNaN

감사합니다. 이것을 올바르게 렌더링하려면 <h3> 및 <a> 태그 (h3 먼저)를 바꿔야했습니다.
Dave Dawkins

10

나는 이것이 유용하고 사용하기 쉽고, 예쁘게 보인다 : http://maxailloud.github.io/confirm-bootstrap/ .

이를 사용하려면 페이지에 .js 파일을 포함시킨 후 다음을 실행하십시오.

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

적용 할 수있는 다양한 옵션이 있습니다. 삭제 확인을 위해 더 잘 보이게하기 위해 다음을 사용합니다.

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

그 좋은 lib 디렉토리입니다
loretoparisi

4

bootbox.js 라이브러리를 사용하여 이러한 유형의 작업을 쉽게 처리 할 수 ​​있습니다. 처음에는 bootbox JS 파일을 포함해야합니다. 그런 다음 이벤트 핸들러 함수에서 간단히 다음 코드를 작성하십시오.

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

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

    });

공식 bootboxjs 사이트


2

다음 솔루션은 bootbox.js보다 낫습니다 .

  • bootbox.js가 할 수있는 모든 것을 할 수 있습니다.
  • 사용 구문이 더 간단합니다
  • "오류", "경고"또는 "정보"를 사용하여 메시지 색상을 우아하게 제어 할 수 있습니다.
  • Bootbox의 길이는 986 줄이며, 길이는 110 줄입니다.

digimango.messagebox.js :

const dialogTemplate = '\
    <div class ="modal" id="digimango_messageBox" role="dialog">\
        <div class ="modal-dialog">\
            <div class ="modal-content">\
                <div class ="modal-body">\
                    <p class ="text-success" id="digimango_messageBoxMessage">Some text in the modal.</p>\
                    <p><textarea id="digimango_messageBoxTextArea" cols="70" rows="5"></textarea></p>\
                </div>\
                <div class ="modal-footer">\
                    <button type="button" class ="btn btn-primary" id="digimango_messageBoxOkButton">OK</button>\
                    <button type="button" class ="btn btn-default" data-dismiss="modal" id="digimango_messageBoxCancelButton">Cancel</button>\
                </div>\
            </div>\
        </div>\
    </div>';


// See the comment inside function digimango_onOkClick(event) {
var digimango_numOfDialogsOpened = 0;


function messageBox(msg, significance, options, actionConfirmedCallback) {
    if ($('#digimango_MessageBoxContainer').length == 0) {
        var iDiv = document.createElement('div');
        iDiv.id = 'digimango_MessageBoxContainer';
        document.getElementsByTagName('body')[0].appendChild(iDiv);
        $("#digimango_MessageBoxContainer").html(dialogTemplate);
    }

    var okButtonName, cancelButtonName, showTextBox, textBoxDefaultText;

    if (options == null) {
        okButtonName = 'OK';
        cancelButtonName = null;
        showTextBox = null;
        textBoxDefaultText = null;
    } else {
        okButtonName = options.okButtonName;
        cancelButtonName = options.cancelButtonName;
        showTextBox = options.showTextBox;
        textBoxDefaultText = options.textBoxDefaultText;
    }

    if (showTextBox == true) {
        if (textBoxDefaultText == null)
            $('#digimango_messageBoxTextArea').val('');
        else
            $('#digimango_messageBoxTextArea').val(textBoxDefaultText);

        $('#digimango_messageBoxTextArea').show();
    }
    else
        $('#digimango_messageBoxTextArea').hide();

    if (okButtonName != null)
        $('#digimango_messageBoxOkButton').html(okButtonName);
    else
        $('#digimango_messageBoxOkButton').html('OK');

    if (cancelButtonName == null)
        $('#digimango_messageBoxCancelButton').hide();
    else {
        $('#digimango_messageBoxCancelButton').show();
        $('#digimango_messageBoxCancelButton').html(cancelButtonName);
    }

    $('#digimango_messageBoxOkButton').unbind('click');
    $('#digimango_messageBoxOkButton').on('click', { callback: actionConfirmedCallback }, digimango_onOkClick);

    $('#digimango_messageBoxCancelButton').unbind('click');
    $('#digimango_messageBoxCancelButton').on('click', digimango_onCancelClick);

    var content = $("#digimango_messageBoxMessage");

    if (significance == 'error')
        content.attr('class', 'text-danger');
    else if (significance == 'warning')
        content.attr('class', 'text-warning');
    else
        content.attr('class', 'text-success');

    content.html(msg);

    if (digimango_numOfDialogsOpened == 0)
        $("#digimango_messageBox").modal();

    digimango_numOfDialogsOpened++;
}

function digimango_onOkClick(event) {
    // JavaScript's nature is unblocking. So the function call in the following line will not block,
    // thus the last line of this function, which is to hide the dialog, is executed before user
    // clicks the "OK" button on the second dialog shown in the callback. Therefore we need to count
    // how many dialogs is currently showing. If we know there is still a dialog being shown, we do
    // not execute the last line in this function.
    if (typeof (event.data.callback) != 'undefined')
        event.data.callback($('#digimango_messageBoxTextArea').val());

    digimango_numOfDialogsOpened--;

    if (digimango_numOfDialogsOpened == 0)
        $('#digimango_messageBox').modal('hide');
}

function digimango_onCancelClick() {
    digimango_numOfDialogsOpened--;

    if (digimango_numOfDialogsOpened == 0)
        $('#digimango_messageBox').modal('hide');
}

사용 digimango.messagebox.js를 :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>A useful generic message box</title>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />

    <link rel="stylesheet" type="text/css" href="~/Content/bootstrap.min.css" media="screen" />
    <script src="~/Scripts/jquery-1.10.2.min.js" type="text/javascript"></script>
    <script src="~/Scripts/bootstrap.js" type="text/javascript"></script>
    <script src="~/Scripts/bootbox.js" type="text/javascript"></script>

    <script src="~/Scripts/digimango.messagebox.js" type="text/javascript"></script>


    <script type="text/javascript">
        function testAlert() {
            messageBox('Something went wrong!', 'error');
        }

        function testAlertWithCallback() {
            messageBox('Something went wrong!', 'error', null, function () {
                messageBox('OK clicked.');
            });
        }

        function testConfirm() {
            messageBox('Do you want to proceed?', 'warning', { okButtonName: 'Yes', cancelButtonName: 'No' }, function () {
                messageBox('Are you sure you want to proceed?', 'warning', { okButtonName: 'Yes', cancelButtonName: 'No' });
            });
        }

        function testPrompt() {
            messageBox('How do you feel now?', 'normal', { showTextBox: true }, function (userInput) {
                messageBox('User entered "' + userInput + '".');
            });
        }

        function testPromptWithDefault() {
            messageBox('How do you feel now?', 'normal', { showTextBox: true, textBoxDefaultText: 'I am good!' }, function (userInput) {
                messageBox('User entered "' + userInput + '".');
            });
        }

    </script>
</head>

<body>
    <a href="#" onclick="testAlert();">Test alert</a> <br/>
    <a href="#" onclick="testAlertWithCallback();">Test alert with callback</a> <br />
    <a href="#" onclick="testConfirm();">Test confirm</a> <br/>
    <a href="#" onclick="testPrompt();">Test prompt</a><br />
    <a href="#" onclick="testPromptWithDefault();">Test prompt with default text</a> <br />
</body>

</html>
여기에 이미지 설명을 입력하십시오


1

콜백 함수를 사용 하여 솔루션을 더 재사용 할 수 있습니다 . 이 기능에서는 POST 요청 또는 일부 로직을 사용할 수 있습니다. 사용 된 라이브러리 : JQuery와 3>부트 스트랩 3> .

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

테스트를위한 HTML 코드 :

...
<body>
    <a href='#' id="remove-btn-a-id" class="btn btn-default">Test Remove Action</a>
</body>
...

자바 스크립트 :

$(function () {
    function remove() {
        alert('Remove Action Start!');
    }
    // Example of initializing component data
    this.cmpModalRemove = new ModalConfirmationComponent('remove-data', remove,
        'remove-btn-a-id', {
            txtModalHeader: 'Header Text For Remove', txtModalBody: 'Body For Text Remove',
            txtBtnConfirm: 'Confirm', txtBtnCancel: 'Cancel'
        });
    this.cmpModalRemove.initialize();
});

//----------------------------------------------------------------------------------------------------------------------
// COMPONENT SCRIPT
//----------------------------------------------------------------------------------------------------------------------
/**
 * Script processing data for confirmation dialog.
 * Used libraries: JQuery 3> and Bootstrap 3>.
 *
 * @param name unique component name at page scope
 * @param callback function which processing confirm click
 * @param actionBtnId button for open modal dialog
 * @param text localization data, structure:
 *              > txtModalHeader - text at header of modal dialog
 *              > txtModalBody - text at body of modal dialog
 *              > txtBtnConfirm - text at button for confirm action
 *              > txtBtnCancel - text at button for cancel action
 *
 * @constructor
 * @author Aleksey Nikitenko
 */
function ModalConfirmationComponent(name, callback, actionBtnId, text) {
    this.name = name;
    this.callback = callback;
    // Text data
    this.txtModalHeader =   text.txtModalHeader;
    this.txtModalBody =     text.txtModalBody;
    this.txtBtnConfirm =    text.txtBtnConfirm;
    this.txtBtnCancel =     text.txtBtnCancel;
    // Elements
    this.elmActionBtn = $('#' + actionBtnId);
    this.elmModalDiv = undefined;
    this.elmConfirmBtn = undefined;
}

/**
 * Initialize needed data for current component object.
 * Generate html code and assign actions for needed UI
 * elements.
 */
ModalConfirmationComponent.prototype.initialize = function () {
    // Generate modal html and assign with action button
    $('body').append(this.getHtmlModal());
    this.elmActionBtn.attr('data-toggle', 'modal');
    this.elmActionBtn.attr('data-target', '#'+this.getModalDivId());
    // Initialize needed elements
    this.elmModalDiv =  $('#'+this.getModalDivId());
    this.elmConfirmBtn = $('#'+this.getConfirmBtnId());
    // Assign click function for confirm button
    var object = this;
    this.elmConfirmBtn.click(function() {
        object.elmModalDiv.modal('toggle'); // hide modal
        object.callback(); // run callback function
    });
};

//----------------------------------------------------------------------------------------------------------------------
// HTML GENERATORS
//----------------------------------------------------------------------------------------------------------------------
/**
 * Methods needed for get html code of modal div.
 *
 * @returns {string} html code
 */
ModalConfirmationComponent.prototype.getHtmlModal = function () {
    var result = '<div class="modal fade" id="' + this.getModalDivId() + '"';
    result +=' tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">';
    result += '<div class="modal-dialog"><div class="modal-content"><div class="modal-header">';
    result += this.txtModalHeader + '</div><div class="modal-body">' + this.txtModalBody + '</div>';
    result += '<div class="modal-footer">';
    result += '<button type="button" class="btn btn-default" data-dismiss="modal">';
    result += this.txtBtnCancel + '</button>';
    result += '<button id="'+this.getConfirmBtnId()+'" type="button" class="btn btn-danger">';
    result += this.txtBtnConfirm + '</button>';
    return result+'</div></div></div></div>';
};

//----------------------------------------------------------------------------------------------------------------------
// UTILITY
//----------------------------------------------------------------------------------------------------------------------
/**
 * Get id element with name prefix for this component.
 *
 * @returns {string} element id
 */
ModalConfirmationComponent.prototype.getModalDivId = function () {
    return this.name + '-modal-id';
};

/**
 * Get id element with name prefix for this component.
 *
 * @returns {string} element id
 */
ModalConfirmationComponent.prototype.getConfirmBtnId = function () {
    return this.name + '-confirm-btn-id';
};

0

프로젝트의 규모가 크면 재사용 할 수있는 무언가가 필요할 있습니다. 이것은 내가 SO의 도움으로 얻은 것입니다.

confirmDelete.jsp

<!-- Modal Dialog -->
<div class="modal fade" id="confirmDelete" role="dialog" aria-labelledby="confirmDeleteLabel"
 aria-hidden="true">
<div class="modal-dialog">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal"
                    aria-hidden="true">&times;</button>
            <h4 class="modal-title">Delete Parmanently</h4>
        </div>
        <div class="modal-body" style="height: 75px">
            <p>Are you sure about this ?</p>
        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
            <button type="button" class="btn btn-danger" id="confirm-delete-ok">Ok
            </button>
        </div>
    </div>
</div>

<script type="text/javascript">

    var url_for_deletion = "#";
    var success_redirect = window.location.href;

$('#confirmDelete').on('show.bs.modal', function (e) {
    var message = $(e.relatedTarget).attr('data-message');
    $(this).find('.modal-body p').text(message);
    var title = $(e.relatedTarget).attr('data-title');
    $(this).find('.modal-title').text(title);

    if (typeof  $(e.relatedTarget).attr('data-url') != 'undefined') {
        url_for_deletion = $(e.relatedTarget).attr('data-url');
    }
    if (typeof  $(e.relatedTarget).attr('data-success-url') != 'undefined') {
        success_redirect = $(e.relatedTarget).attr('data-success-url');
    }

});

<!-- Form confirm (yes/ok) handler, submits form -->
$('#confirmDelete').find('.modal-footer #confirm-delete-ok').on('click', function () {
    $.ajax({
        method: "delete",
        url: url_for_deletion,
    }).success(function (data) {
        window.location.href = success_redirect;
    }).fail(function (error) {
        console.log(error);
    });
    $('#confirmDelete').modal('hide');
    return false;
});
<script/>

reusingPage.jsp

<a href="#" class="table-link danger"
data-toggle="modal"
data-target="#confirmDelete"
data-title="Delete Something"
data-message="Are you sure you want to inactivate this something?"
data-url="client/32"
id="delete-client-32">
</a>
<!-- jQuery should come before this -->
<%@ include file="../some/path/confirmDelete.jsp" %>

참고 : 이것은 삭제 요청에 http delete 메소드를 사용하고, 자바 스크립트에서 변경하거나, 요청을 지원하기 위해 data-title 또는 data-url 등의 데이터 속성을 사용하여 전송할 수 있습니다.


0

가장 쉬운 바로 가기로 수행하려면 이 플러그인으로 할 수 있습니다 .


그러나이 플러그인은 Bootstrap Modal을 사용한 대체 구현 입니다. 실제 부트 스트랩 구현도 매우 쉬워서 페이지에 과도한 JS 내용을 추가하여 페이지 로딩 시간을 늦추기 때문에이 플러그인을 사용하고 싶지 않습니다.


생각

이 방법으로 직접 구현하고 싶습니다.

  1. 경우 사용자가 클릭이 목록에서 항목을 삭제하는 버튼이야, 다음 JS 호출을 넣어 것입니다 항목 ID 모달의 형태 (또는 더 이상 필수 데이터).
  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>

요구 사항에 따라 양식 조치를 변경해야합니다.

행복한 coading :)


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도 활용됩니다.

나를 도왔을 수도 있고, 다른 사람을 도울 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.