모달로 콘텐츠 다시로드 (twitter 부트 스트랩)


98

트위터 부트 스트랩의 모달 팝업을 사용하고 있습니다.

<div id="myModal" class="modal hide fade in">
    <div class="modal-header">
        <a class="close" data-dismiss="modal">×</a>
        <h3>Header</h3>
    </div>
    <div class="modal-body"></div>
    <div class="modal-footer">
        <input type="submit" class="btn btn-success" value="Save"/>
    </div>
</div>

이 a 요소와 함께 ajax를 사용하여 콘텐츠를로드 할 수 있습니다.

<a data-toggle="modal" data-target="#myModal" href="edit.aspx">Open modal</a>

이제 동일한 모달을 열어야하지만 다른 URL을 사용해야합니다. 이 모달을 사용하여 데이터베이스에서 엔티티를 편집하고 있습니다. 따라서 엔티티에서 편집을 클릭하면 ID와 함께 모달을로드해야합니다.

<a data-toggle="modal" data-target="#myModal" href="edit.aspx?id=1">Open modal</a>
<a data-toggle="modal" data-target="#myModal" href="edit.aspx?id=2">Open modal</a>
<a data-toggle="modal" data-target="#myModal" href="edit.aspx?id=3">Open modal</a>

링크 번호 1을 클릭하면 정상적으로 작동합니다. 그러나 링크 번호 2를 클릭하면 모달 콘텐츠가 이미로드되어 링크 번호 1의 콘텐츠가 표시됩니다.

Twitter 부트 스트랩 모달 팝업에서 Ajax로드 된 콘텐츠를 새로 고치거나 재설정하려면 어떻게해야합니까?



동일한 문제가 있었고 동일한 솔루션에 사용되었습니다. 이상한 이유로 jquery에서 .attr () 함수를 사용합니다. .data () 함수가 작동하지 않았습니다.
user1803784 jul.

답변:


98

동일한 문제가 발생하고 있으며이 작업을 수행하는 방법은 data-toggle 특성을 제거하고 링크에 대한 사용자 지정 처리기를 사용하는 것입니다.

라인에있는 것 :

$("a[data-target=#myModal]").click(function(ev) {
    ev.preventDefault();
    var target = $(this).attr("href");

    // load the url and show modal on success
    $("#myModal .modal-body").load(target, function() { 
         $("#myModal").modal("show"); 
    });
});

나중에 시도하고 댓글을 게시합니다.


16
$ ( '. modal'). on ( 'hidden', function () {$ (this) .removeData ();}) 이것은 아래 솔루션의 수정입니다 ... 클릭을 잡아서로드 할 필요가 없기 때문에 더 깨끗합니다. 자체 프로그래밍 방식 모델 쇼가 여전히 작동합니다.
Carter Cole

1
나는 Bootstrap 3을 사용하고 있는데, 모달의 내용은 매번 새로 고쳐 지지만 두 개의 모달 창을 만듭니다. 다른 사람이 이것을 얻습니까?
Mr B

1
Hey Sid, "modal-body"클래스로 2 개의 div를 생성했습니다. 실제로 이미 생성 중이며 모달이 다시 생성되고 있습니다. 해당 코드에서 '.modal-body'를 제거하면 제대로 작동합니다.
Palantir 2013

1
Bootstrap 3에서 저에게 적합합니다. 기본적으로 핵심 부트 스트랩 라이브러리에서 지원하지 않는다는 점에 매우 실망합니다.
Josh Diehl

@markz, 나는 또한 이와 같은 것을 사용하고 ev.preventDefault (); 뿐만 아니라 여전히 링크를 클릭하면 모달 창이 나타나면 내 페이지의 모든 드롭 다운이 재설정됩니다. 그것을 방지하는 방법은 무엇입니까?
Jaikrat

72

모달이 닫힐 때 데이터를 언로드하려면 Bootstrap 2.x와 함께 사용할 수 있습니다.

$('#myModal').on('hidden', function() {
    $(this).removeData('modal');
});

그리고 부트 스트랩 3 ( https://github.com/twbs/bootstrap/pull/7935#issuecomment-18513516 ) :

$(document.body).on('hidden.bs.modal', function () {
    $('#myModal').removeData('bs.modal')
});

//Edit SL: more universal
$(document).on('hidden.bs.modal', function (e) {
    $(e.target).removeData('bs.modal');
});

완전한. 문제없이 작동했습니다. 부트 스트랩 3에서 $ ( '. modal'). on ( 'hidden.bs.modal', function () {$ (this) .removeData ( 'bs.modal');});
Thupten 2013 년

4
완벽하지 않음 : 새 콘텐츠 이전에 이전 콘텐츠를 간략하게 보여줍니다.
Laurent

3
@Laurent, .html ( '')을 추가하여 이전 내용을 지울 수 있습니다. 따라서 2.x의 경우 : $ (this) .removeData ( 'modal'). find ( '. modal-body'). html ( ''). 3의 경우 : $ (this) .removeData ( 'bs.modal'). html ( '') 2.x는 콘텐츠를 .modal-body로로드하는 반면 3은 콘텐츠를 .modal 컨테이너로 직접로드합니다
nabrown

부트 스트랩 v3에서 마지막 주석에 대한 작은 수정은 다음과 같아야합니다. $ (e.target) .removeData ( 'bs.modal'). html ( ''); 이것은 지금까지 가장 우아한 솔루션입니다 (그러나 약간 지연됩니다).
Cesc 2013

이 제안 된 솔루션에 @Softlion이 게시 한 편집 / 버전을 사용했습니다. 작동했으며 속도 / 지연 문제가 발생하지 않았습니다.
user1801810

21

Modal 플러그인의 hide 메소드 끝에이 행을 추가하여 Modal이 팝업을 새로 고치도록 강제 할 수 있습니다 (bootstrap-transition.js v2.1.1을 사용하는 경우 836 행에 있어야합니다).

this.$element.removeData()

또는 이벤트 리스너

$('#modal').on('hidden', function() {
    $(this).data('modal').$element.removeData();
})

4
-1 첫 번째 스 니펫을 모달 플러그인에 직접 넣는 것은 끔찍한 아이디어입니다. 플러그인을 해킹하려는 경우 (피할 것입니다), 더 합리적인 방법은 load()호출을 생성자에서으로 이동 show()하거나 플러그인에 메서드를 추가하여 수동으로 다시로드를 트리거하는 것입니다. remote. 두 번째 제안에서는 @markz가 제안한 방식 으로하지 말라고 명시 적으로 요청한 질문에 대한 답변 으로 만 제공했습니다 .
merv

2
나는 청취자의 접근 방식을 좋아합니다. ID를 하드 코딩하지 않도록 '#modal'대신 '.modal'을 사용하여 개선 할 수도 있다고 생각합니다. 제 생각에는 원래 부트 스트랩 모달에서와 같이 데이터 토글을 계속 사용하기 때문에 markz보다 더 깨끗한 접근 방식입니다.
Toni Grimalt 2013

왜이 답변에 찬성표가 많지 않은지 궁금합니다. 이 답변은 매우 흥미롭고 빠르게 구현할 수있는 이벤트 리스너를 제안하는 첫 번째 답변 인 것 같습니다.
Anupam

15

Bootstrap 3을 사용하면 'hidden.bs.modal'이벤트 핸들러를 사용하여 모달 관련 데이터를 삭제하여 다음에 팝업이 다시로드되도록 할 수 있습니다.

$('#modal').on('hidden.bs.modal', function() {
    $(this).removeData('bs.modal');
});

1
예,하지만이 솔루션에는 여전히 중대한 지연이 있습니다. 새 콘텐츠가 나오기 전에 1 ~ 3 초 동안 이전 콘텐츠가 계속 표시됩니다.
문서 휴일

대신 #modal 시도의 몸
wobsoriano

8

다른 답변을 바탕으로 (모두 감사합니다).

.html을 호출하면 전체 내용이 지워지고 모달은 내가 한 후에 어떤 내용으로도로드되지 않기 때문에 코드를 작동하도록 조정해야했습니다. 그래서 나는 단순히 모달의 내용 영역을 찾고 거기에 HTML 재설정을 적용했습니다.

    $(document).on('hidden.bs.modal', function (e) {
        var target = $(e.target);
        target.removeData('bs.modal')
              .find(".modal-content").html('');
    });

컨트롤이 Bootstrap과 함께 있기 때문에 모달로드 직전에 추악한 점프가 발생하기 때문에 여전히 받아 들여지는 대답으로 갈 수 있습니다.


5

위의 허용 된 예보다 약간 더 압축되었습니다. data-toggle = modal이 켜진 상태에서 현재 클릭 한 항목의 데이터 대상에서 대상을 가져옵니다. 이렇게하면 대상 모달의 ID가 무엇인지 알 필요가 없으며 동일한 것을 재사용 할 수 있습니다! 적은 코드 = 승리! 원하는 경우 모달의 제목, 레이블 및 버튼을로드하도록 수정할 수도 있습니다.

 $("[data-toggle=modal]").click(function(ev) {
    ev.preventDefault();
    // load the url and show modal on success
    $( $(this).attr('data-target') + " .modal-body").load($(this).attr("href"), function() { 
         $($(this).attr('data-target')).modal("show"); 
    });
});

링크 예 :

<a data-toggle="modal" href="/page/api?package=herp" data-target="#modal">click me</a>
<a data-toggle="modal" href="/page/api?package=derp" data-target="#modal">click me2</a>
<a data-toggle="modal" href="/page/api?package=merp" data-target="#modal">click me3</a>

3

Softlion 답변 을 약간 변경 했으므로 모든 모달이 숨길 때 새로 고쳐지지 않습니다. data-refresh = 'true'속성이있는 모달은 새로 고쳐지고 다른 모달은 평소처럼 작동합니다. 다음은 수정 된 버전입니다.

$(document).on('hidden.bs.modal', function (e) {
    if ($(e.target).attr('data-refresh') == 'true') {
        // Remove modal data
        $(e.target).removeData('bs.modal');
        // Empty the HTML of modal
        $(e.target).html('');
    }
});

이제 아래와 같이 속성을 사용하십시오.

<div class="modal fade" data-refresh="true" id="#modal" tabindex="-1" role="dialog" aria-labelledby="#modal-label" aria-hidden="true"></div>

이렇게하면 data-refresh = 'true'인 모달 만 새로 고쳐집니다. 그리고 새 값이로드 될 때까지 이전 값이 표시되기 때문에 모달 html을 재설정하여 html을 비어있는 상태로 수정합니다.


2

나를 위해 일한 커피 스크립트 버전이 있습니다.

$(document).on 'hidden.bs.modal', (e) ->
  target = $(e.target)
  target.removeData('bs.modal').find(".modal-content").html('')

콘텐츠가 다시로드되지만 모달 내부의 js가 두 번째로 실행되지 않는 문제를 해결했습니다.
Souhaieb

1

모든 버전의 twitterbootstrap에서 작동합니다.

자바 스크립트 코드 :

<script type="text/javascript">
/* <![CDATA[ */
(function(){
   var bsModal = null;
   $("[data-toggle=modal]").click(function(e) {
      e.preventDefault();
      var trgId = $(this).attr('data-target'); 
      if ( bsModal == null ) 
       bsModal = $(trgId).modal;
      $.fn.bsModal = bsModal;
      $(trgId + " .modal-body").load($(this).attr("href"));
      $(trgId).bsModal('show');
    });
 })();
/* <![CDATA[ */
</script>

모달에 대한 링크는

<a data-toggle="modal" data-target="#myModal" href="edit1.aspx">Open modal 1</a>
<a data-toggle="modal" data-target="#myModal" href="edit2.aspx">Open modal 2</a>
<a data-toggle="modal" data-target="#myModal" href="edit3.aspx">Open modal 3</a>

모달 팝업

<div id="myModal" class="modal hide fade in">
<div class="modal-header">
    <a class="close" data-dismiss="modal">×</a>
    <h3>Header</h3>
</div>
<div class="modal-body"></div>
<div class="modal-footer">
    <input type="submit" class="btn btn-success" value="Save"/>
</div>


1

나는 또한이 문제에 갇혀 있었고 모달 의 ID 가 동일 하다는 것을 알았습니다 . 여러 모달을 원하는 경우 다른 모달 ID 가 필요합니다 . 동적 ID를 사용했습니다 . 다음은 내 코드입니다 haml.

.modal.hide.fade{"id"=> discount.id,"aria-hidden" => "true", "aria-labelledby" => "myModalLabel", :role => "dialog", :tabindex => "-1"}

넌 할 수있어

<div id="<%= some.id %>" class="modal hide fade in">
  <div class="modal-header">
    <a class="close" data-dismiss="modal">×</a>
    <h3>Header</h3>
  </div>
  <div class="modal-body"></div>
  <div class="modal-footer">
    <input type="submit" class="btn btn-success" value="Save" />
  </div>
</div>

모달에 대한 링크는

<a data-toggle="modal" data-target="#" href='"#"+<%= some.id %>' >Open modal</a>
<a data-toggle="modal" data-target="#myModal" href='"#"+<%= some.id %>' >Open modal</a>
<a data-toggle="modal" data-target="#myModal" href='"#"+<%= some.id %>' >Open modal</a>

이것이 당신에게 효과가 있기를 바랍니다.


1

이것을 시도 할 수 있습니다.

$('#modal').on('hidden.bs.modal', function() {
    $(this).removeData('bs.modal');
});

0

모달이 닫힐 때 AJAX로드 된 콘텐츠가 제거되기를 원했기 때문에 다른 사람이 제안한 줄 (coffeescript 구문)을 조정했습니다.

$('#my-modal').on 'hidden.bs.modal', (event) ->
  $(this).removeData('bs.modal').children().remove()


0

1 단계 : 호출 된 모달에 대한 래퍼를 만듭니다. clone-modal-wrapper .

2 단계 :라는 빈 div를 만듭니다 modal-wrapper.

3 단계 : 모달 요소를 clone-modal-wrapper에서 modal-wrapper.

4 단계 :의 모달을 전환합니다 modal-wrapper.

<a data-toggle="modal" class='my-modal'>Open modal</a>

<div class="clone-modal-wrapper">
   <div class='my-modal' class="modal fade">
      <div class="modal-dialog">
         <div class="modal-content">
            <div class="modal-header">
               <a class="close" data-dismiss="modal">×</a>
               <h3>Header</h3>
            </div>
            <div class="modal-body"></div>
            <div class="modal-footer">
               <input type="submit" class="btn btn-success" value="Save"/>
            </div>
         </div>
      </div>
   </div>
</div>

<div class="modal-wrapper"></div>


$("a[data-target=#myModal]").click(function (e) {
    e.preventDefault();
    $(".modal-wrapper").html($(".clone-modal-wrapper").html());
    $('.modal-wrapper').find('.my-modal').modal('toggle');
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.