Twitter 부트 스트랩 모달 창을 닫을 수 없음


549

Twitter Bootstrap을 사용하여 모달 창을 만들고 있습니다. 기본 동작은 모달 영역 외부를 클릭하면 모달이 자동으로 닫힙니다. 모달 외부를 클릭 할 때 모달 창을 닫지 마십시오.

누군가 jQuery 코드를 공유하여 이것을 할 수 있습니까?


1
이 작업을 수행하는 데는 완전히 타당한 이유가있을 수 있습니다. 그러나 일반적으로 UX 고려 사항은 이것에 대해 조언 할 것입니다. 대부분의 사용자는 모달을 클릭하면 내용이 "아래"로 "앞면"으로 나타날 것으로 예상합니다.
Trevor

32
@Trevor 그것은 모달 과 반대입니다 .
롤링

11
백그라운드에 사용자 로그인이 처음 인 경우에만 활성화 할 수있는 페이지가있는 경우 어떻게해야합니까? 모달 Ok 버튼을 클릭하면 사용자가 로그인 페이지로 리디렉션됩니다. 사용자가 클릭 만하면 로그인 페이지를 건너 뛰고 로그인하지 않고 페이지에 액세스 할 수 있습니다. 모든 지옥 브레이크 루스
점퍼 rbk 1

5
@Trevor 귀하의 주장을 뒷받침 할 증거가 전혀 없습니다.
1252748

이 기능은 사용자가 모달에서 많은 양식 필드를 작성해야하는 시나리오에서 적절합니다. 사용자가 실수로 모달 외부를 클릭하면 입력 된 모든 세부 정보가 손실됩니다. 그런 다음 모달을 다시 활성화하고 필드를 다시 채워야합니다. 이 기능은 그러한 자극을 피할 수 있습니다.
mickmackusa

답변:


692

배경 값static 으로 설정하려고합니다 . Esc키를 사용할 때 창이 닫히지 않게하려면 다른 값을 설정해야합니다.

예:

<a data-controls-modal="your_div_id"
   data-backdrop="static"
   data-keyboard="false"
   href="#">

또는 JavaScript를 사용하는 경우 :

$('#myModal').modal({
  backdrop: 'static',
  keyboard: false
});

7
@ user1296175 이것을 달성하기위한 최종 코드는 무엇입니까? 나는 똑같이하고 싶다.
AlphaMale

4
@nobita에게 감사합니다. data-backdrop = "static"을 추가하십시오! 트위터 부트 스트랩 문서가 잘못되었습니다 :(
Blue Smith

2
@@ Varun Chatterji의 답변을 확인하고이를 모달 정의에 포함 시키십시오
Leandro

1
한 줄의 js로 모든 모달에 대해 외부 클릭 비활성화 : $ .fn.modal.Constructor.DEFAULTS.backdrop = 'static';
Lukas Liesis

1
각도 사용자의 경우 : var modalInstance = $ modal.open ({templateUrl : 'modalTemplate.html', 컨트롤러 : 'modalController', 배경막 : 'static',});
Alexandr

310

backdrop속성을로 설정하십시오 'static'.

$('#myModal').modal({
  backdrop: 'static',
  keyboard: true
})

키보드 의 키를 눌러 모달이 닫히지 않도록 keyboard속성 을 설정할 수도 있습니다 .falseEsc

$('#myModal').modal({
  backdrop: 'static',
  keyboard: false
})

myModal 모달 콘텐츠가 포함 된 div의 ID입니다.


6
그러나 이것은 데이터 속성을 추가하지 않기 때문에 가장 깨끗하고 간단한 답변입니다. 참고로, backdrop그리고 keyboard언급 된 자신의 문서에 여기 세 이하 옵션 섹션을 참조하십시오.
Jesse Dupuy

데이터 속성을 피해야합니까? 친절하게 안내해주세요.

@GopalAggarwal : 모달 설정 방법에 따라 다릅니다. 모달을 여러 앵커 태그에 연결하는 경우 데이터 속성을 사용하는 것이 좋습니다. 그러나 태그 당 하나의 모달이있는 경우 모든 동작이 한곳에서 보이는 스크립트 매개 변수를 사용합니다.
Nirmal

7
또한 모달 표시가 즉시 표시되는 것을 피하려면 false
ClearCloud8

214

이러한 속성을 모달 정의 자체에 포함시킬 수도 있습니다.

<div class="modal hide fade" data-keyboard="false" data-backdrop="static">

4
그러나 이것은 데이터 속성을 추가하여 작동하므로 가장 깨끗하고 간단한 답변입니다. 참고로, 배경 및 키보드는 옵션 섹션의 설명서에서 여기에 언급되어 있습니다.
floww December

페이지로드시 모달을 시작하면 다른 닫기 옵션을 제거하는 가장 좋은 방법입니다.
Santa

46

모달 창을 이미 초기화 한 $('#myModal').removeData("modal").modal({backdrop: 'static', keyboard: false})경우 새 옵션이 적용되도록 옵션을 재설정 할 수 있습니다.


1
이것은 나를 도왔다. "배경 : '정적'"을 설정 한 후에도 클릭으로 모달을 닫을 수 있습니다. 버그처럼 보였지만 이것은 트릭을했습니다!
Omar

7
지금 : $ ( '# modal'). removeData ( 'bs.modal'). modal ({배경 : 'static', 키보드 : false});
D3VELOPER

34

Dialog의 Bootstrap 'hide'이벤트를 재정의하고 기본 동작을 중지하십시오 (대화 상자를 삭제).

아래 코드 스 니펫을 참조하십시오

   $('#yourDialogID').on('hide.bs.modal', function(e) {

       e.preventDefault();
   });

우리의 경우에는 잘 작동합니다.


2
그렇다면 어떻게 되돌릴까요?
sertaconay 2018 년

3
우아합니다. 들으 :) 그리고 @sertaconay 단지 u는 기본 않도록하려면 결정하기 위해 검사 될 것이다 (예를 들어) 부울 변수를 생성
니므롯 Yonatan 벤 네스

1
모달을 연 후 여기에서 작동하는 옵션 만
ask_io

2
모달을 닫을 수 있고 닫을 수없는 경우를보다 세밀하게 제어하려면 완벽한 솔루션입니다.
Curos

33

예, 다음과 같이 할 수 있습니다 :

<div id="myModal"  tabindex="-1" role="dialog"
     aria-labelledby="myModalLabel"
     aria-hidden="true"
     data-backdrop="static"  data-keyboard="false">

이것은 모달이 html로 선언되고 javascript를 통해서만 열린 경우에 적합합니다. 즉, 링크가 없습니다. 감사!
hgolov

22

@AymKdn의 답변과 비슷하지만 모달을 다시 초기화하지 않고 옵션을 변경할 수 있습니다.

$('#myModal').data('modal').options.keyboard = false;

또는 여러 옵션을 수행 해야하는 경우 JavaScript가 with유용합니다!

with ($('#myModal').data("modal").options) {
    backdrop = 'static';
    keyboard = false;
}

모달이 이미 열려 있으면이 옵션은 다음 에 모달을 열 때만 적용됩니다 .


stackoverflow.com/questions/16030448/… 그러나 나는이 해결책을 좋아하지 않습니다
Victor

14

이 두 가지를 추가하십시오

data-backdrop="static" 
data-keyboard="false"

이제 이렇게 보일 것입니다

<div class="modal fade bs-example-modal-sm" id="myModal" data-backdrop="static" data-keyboard="false" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">

이스케이프 버튼을 비활성화하고 아무 곳이나 클릭하고 숨길 수 있습니다.


이 조언은 몇 년 전에 제공되었습니다.
mickmackusa

11

페이지의 JavaScript를 페이지에 추가하여 배경의 클릭하여 닫기 동작을 비활성화하고 모든 모달의 기본값으로 설정할 수 있습니다 (jQuery 및 Bootstrap JS가로드 된 후 실행되는지 확인).

$(function() {
    $.fn.modal.Constructor.DEFAULTS.backdrop = 'static';
});

6

D3VELOPER가 말했듯이 다음 코드는이를 해결합니다.

$('#modal').removeData('bs.modal').modal({backdrop: 'static', keyboard: false});

jquery와 bootstrap을 모두 사용하고 있으며 단순히 removeData('modal')작동하지 않습니다.


4

내가 찾은 최고는이 코드를 링크에 추가하는 것입니다.

<!-- Link -->
<a href="#mdl" role="button"  data-backdrop="static" data-keyboard="false" data-toggle="modal" id_team="" ></a>
<-- Div -->
<div id="mdl" class="modal hide fade" tabindex="-1" role="dialog" data-keyboard="false" data-backdrop="static"></div>

2

누군가가 모달을 닫는 것을 방지하는 방법을 알아 내려고 Google에 온 경우 모달 오른쪽 상단에 제거 해야하는 닫기 버튼이 있다는 것을 잊지 마십시오.

CSS를 숨겨서 사용했습니다.

#Modal .modal-header button.close {
    visibility: hidden;
}

"display : none;"사용 모달을 만들 때 덮어 쓰므로 사용하지 마십시오.


모달 헤더에서 버튼을 제거 할 수 없습니까?
foop

때로는 HTML을 변경하는 대신 CSS를 사용하는 것이 좋습니다.
Drew

2

조건부로 backdrop click closing기능을 비활성화하려면 다음 줄을 사용하여 런타임 중에 backdrop옵션을 설정할 수 있습니다 static.

부트 스트랩 v3.xx

jQuery('#MyModal').data('bs.modal').options.backdrop = 'static';

부트 스트랩 v2.xx

jQuery('#MyModal').data('modal').options.backdrop = 'static';

이렇게하면 backdrop옵션이 false( 기본 동작 ) 으로 설정된 이미 인스턴스화 된 모델이 닫히지 않습니다.


2

아래 코드 줄을 사용하여 모달 팝업의 기본 동작을 설정할 수 있습니다.

 $.fn.modal.prototype.constructor.Constructor.DEFAULTS.backdrop = 'static';

이 방법을 +1처럼 모든 모달에 대해 해당 옵션을 원하지 않습니다.
tsohr

2

그렇게하는 것은 요즘 매우 쉽습니다. 다음을 추가하십시오.

data-backdrop="static" data-keyboard="false" 

모달 분배기에서.


이 조언은 같은 페이지에서 몇 년 전에 제공되었습니다.
mickmackusa

1

글쎄, 이것은 당신들 중 일부가 찾고있는 또 다른 해결책입니다.

내 문제는 비슷했고 내부에 iframe을로드하는 동안 모달 상자가 닫히고 있으므로 Iframe 이로 드를 마칠 때까지 모달 해제를 비활성화 한 다음 다시 활성화해야했습니다.

여기에 제시된 솔루션은 100 % 작동하지 않았습니다.

내 해결책은 다음과 같습니다.

showLocationModal = function(loc){

    var is_loading = true;

    if(is_loading === true) {

        is_loading  = false;
        var $modal   = $('#locationModal');

        $modal.modal({show:true});

        // prevent Modal to close before the iframe is loaded
        $modal.on("hide", function (e) {
            if(is_loading !== true) {
                e.preventDefault();
                return false
            }
        });

        // populate Modal
        $modal.find('.modal-body iframe').hide().attr('src', location.link).load(function(){

            is_loading = true;
     });
}};

따라서 일시적으로 모달이 다음과 같이 닫히지 못하게합니다.

$modal.on("hide", function (e) {
    if(is_loading !== true) {
        e.preventDefault();
        return false
    }
});

그러나 iframe 이로 드 된 후 닫기를 다시 활성화하는 var is_loading입니다.


1
<button type="button" class="btn btn-info btn-md" id="myBtn3">Static 
Modal</button>

<!-- Modal -->
<div class="modal fade" id="myModal3" role="dialog">
<div class="modal-dialog">
  <!-- Modal content-->
  <div class="modal-content">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal">×</button>
      <h4 class="modal-title">Static Backdrop</h4>
    </div>
    <div class="modal-body">
      <p>You cannot click outside of this modal to close it.</p>
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-default" data-
      dismiss="modal">Close</button>
    </div>
   </div>
  </div>
</div>
   <script>
    $("#myBtn3").click(function(){
     $("#myModal3").modal({backdrop: "static"});
    });
   });
  </script>

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