자바 스크립트로 부트 스트랩 모달을 숨기는 방법?


281

나는 여기에있는 게시물, Bootstrap 사이트 및 Googled를 미친 것처럼 읽었지만 쉬운 대답은 확실하지 않습니다 ...

다음과 같이 link_to 도우미에서 여는 부트 스트랩 모달이 있습니다.

<%= link_to "New Contact", new_contact_path, {remote: true, 'data-toggle' => 'modal', 'data-target' => "#myModal",  class: "btn btn-primary"} %>

ContactsController.create행동에는 코드를 만들고에 Contact전달합니다 create.js.erb. 에서 create.js.erb오류 처리 코드 (루비와 자바 스크립트의 혼합)가 있습니다. 모든 것이 잘되면 모달을 닫고 싶습니다.

내가 어려움을 겪고있는 곳입니다. 모든 것이 잘되면 모달을 닫을 수 없습니다.

시도했지만 $('#myModal').modal('hide');효과가 없습니다. 나는 또한 $('#myModal').hide();모달이 사라지게하지만 배경을 남기 려고 시도했습니다 .

모달을 닫거나 백그라운드에서 배경을 해제하는 방법에 대한 지침은 create.js.erb무엇입니까?

편집하다

다음은 myModal의 마크 업입니다.

<div class="modal hide" id="myModal" >
  <div class="modal-header">
    <a class="close" data-dismiss="modal">×</a>
    <h3>Add Contact</h3>
    <div id="errors_notification">
    </div>
  </div>
  <div class="modal-body">
    <%= form_for :contact, url: contacts_path, remote: true do |f| %>  
      <%= f.text_field :first_name, placeholder: "first name" %>
      <%= f.text_field :last_name, placeholder: "last name" %>
      <br>
      <%= f.submit "Save", name: 'save', class: "btn btn-primary" %>
      <a class="close btn" data-dismiss="modal">Cancel</a>
    <% end %>
  </div>
  <div class="modal-footer">
  </div>
</div>

1
$('#myModal').modal('hide');id로 모달을 닫거나 숨기는 올바른 구문입니다 myModal( 부트 스트랩 문서 페이지 에서 테스트 할 수 있음 ). 페이지에이 ID를 가진 요소가 있습니까? 또한이 전화로 무엇을하려고합니까? 현재 구현은 Ajax 요청을 수행 new_contact_path하고 동시에 내용으로 모달을 엽니 다. #myModal이것이 당신이 원하는 것입니까?
Julian D.

줄리안 위의 myModal 마크 업을 게시했으며 실제로 id가있는 div가 myModal있습니다. 나는 다시 시도했지만 $('myModal').modal('hide')여전히 좋지 않다. HM. 내가하려고하는 일과 관련하여 link_to 도우미를 사용하는 것이 잘못되었을 수 있습니다. <a data-toggle="modal" href="#myModal" class="btn btn-primary">Add Contact</a>로 전화를 걸 필요가 없기 때문에 이것을 다음과 같이 바꿨습니다 new_contact_path. 모달을 열고 사용자 입력을 처리하려고합니다. 답변 해 주셔서 감사합니다. 분류 할 수 없는지 살펴 보겠습니다.
jvillian

오타 일뿐이지만 전화가 있어야합니다 $('#myModal').modal('hide');( #댓글에 누락이 있음).
Julian D.

1
실제 코드에서 복사하는 대신 입력하는 것이 좋지 않습니다. 실제 코드는 다음과 같습니다 $('#myModal').modal('hide').. J
jvillian

bootboxjs
md를

답변:


493

브라우저 창에서 모달을 연 상태에서 브라우저 콘솔을 사용하여

$('#myModal').modal('hide');

그것이 작동하고 모달이 닫히면 가까운 자바 스크립트가 서버에서 브라우저로 올바르게 전송 되지 않는 것입니다.

작동하지 않으면 클라이언트에 대해 추가로 조사해야합니다. 예를 들어 동일한 ID를 가진 두 개의 요소가 없는지 확인하십시오. 예를 들어 페이지로드 후 처음으로 작동하지만 두 번째로는 작동하지 않습니까?

브라우저 콘솔 : firefox 용 firebug, Chrome 또는 Safari 용 디버깅 콘솔 등


두 번째 단락은 내가 찾던 것이 었습니다. 중복 ID로 인해 모달이 두 번째로 올바르게 표시되지 않았습니다.
Matias

이것은 나를 위해 문제를 해결했습니다. 감사.
Finchy70

77

부트 스트랩 모달 을 닫으 려면 다음과 같이 모달 방법에 옵션으로 '숨기기' 를 전달할 수 있습니다

$('#modal').modal('hide');

여기 에서 바이올린 작업을 살펴보십시오.

부트 스트랩은 모달 기능에 연결할 수있는 이벤트를 제공합니다 . 모달이 사용자로부터 숨겨 졌을 때 이벤트를 시작하려는 경우 hidden.bs.modal 이벤트를 사용 하면 모달 메서드 및 이벤트에 대한 자세한 내용을 볼 수 있습니다. 선적 서류 비치

위의 방법으로 작동하지 않으면 닫기 버튼에 ID를 부여하고 닫기 버튼을 클릭하십시오.


1
모달 대화 상자를 닫을 시점을 정확히 알고있을 때 특히 유용합니다. 예를 들어 성공 함수의 끝에서. 이렇게하면 오류가 발생하면 대화 상자에 오류가 표시 될 수 있습니다.

47

부트 스트랩 3.4를 사용합니다.이 기능이 작동하지 않습니다

$('#myModal').modal('hide')

필사적으로 나는 이것을했다 :

$('#myModal').hide();
$('.modal-backdrop').hide();

어쩌면 우아하지는 않지만 작동합니다.


2
$ ( ". modal-backdrop"). remove ()를 사용하면 더 좋습니다.
Bloodhound

1
이것은 새로운 버그를 소개합니다. 추천 방법을 사용하십시오
Benjamin Eckstein

jQuery ( '. 모달 배경') .click ();

약간의 버그가 있지만 반드시 작동합니다. 아래의 Manuel Fernando 솔루션은 완벽하게 작동했습니다.
Munam Yousuf

@Umingo 여기에 언급 된 방법이 좋지 않고 하나를 알고 있다면 방법을 권장하십시오.
스팬

47

부트 스트랩이있는 모달을 숨기고 표시하는 가장 좋은 양식

// SHOW
$('#ModalForm').modal('show');
// HIDE
$('#ModalForm').modal('hide');

최고의 답변. 클릭, jQuery fadeOut 또는 CSS로 동작을 시뮬레이션하면 장기적으로 오정렬이 발생할 수 있습니다.
조르지오 템페 스타

43

동일한 오류가 발생 했으며이 코드 줄이 실제로 도움이됩니다.

$("[data-dismiss=modal]").trigger({ type: "click" });

1
문제가 요소에 data-dismiss 속성을 가질 수 있다고 제안한 또 다른 문제를 읽었습니다.이 자바 스크립트에서 트리거하려고 시도하는 것
외에도

많은 많은 많은 감사 마누엘, 이것은 많은 검색 후 내 문제를 해결 한 $ ( '# MyModelId'). modal ( 'hide'); $ ( "[data-dismiss = modal]"). trigger ({유형 : "click"}); 내가 아약스 성공에 모달을 닫고 싶었다 .... 정말 많은 감사합니다 내 사랑
abdelrhman raafat

22
$('#modal').modal('hide'); 
//hide the modal

$('body').removeClass('modal-open'); 
//modal-open class is added on body so it has to be removed

$('.modal-backdrop').remove();
//need to remove div with modal-backdrop class

그것은 작동했지만 다시 열면 모달이
고장났습니다.

21

이 코드를 사용할 수있는 올바른 해결책을 찾았습니다.

$('.close').click(); 

지금까지 최고의 솔루션
kosas

최고는 단순히 최고 +1입니다.
MooMoo

11

나는 비슷한 문제라고 생각하는 것에 부딪쳤다. 는 $('#myModal').modal('hide');이 기능을 통해 가능성이 실행하고 선을 명중

if (!this.isShown || e.isDefaultPrevented()) return

문제는 모달이 표시되고 값이 true 인 경우에도 isShown 값이 정의되지 않을 수 있다는 것입니다. 부트 스트랩 코드를 다음과 같이 약간 수정했습니다.

if (!(typeof this.isShown == 'undefined') && (!this.isShown || e.isDefaultPrevented())) return

이것은 대부분 문제를 해결하는 것으로 보였습니다. 배경이 여전히 남아 있으면 항상 통화를 추가하여 숨기기 통화 후에 수동으로 제거 할 수 있습니다 $('.modal-backdrop').remove();. 전혀 이상적이지 않지만 작동합니다.


11

(부트 스트랩 3 참조), 모달을 숨기려면 : $('#modal').modal('hide'). 그러나 배경이 (나를 위해) 매달려있는 이유는 '숨기기'가 끝나기 전에 모달의 DOM을 파괴했기 때문입니다.

이 문제를 해결하기 위해 숨겨진 이벤트를 DOM 제거와 연결했습니다. 나의 경우에는:this.render()

var $modal = $('#modal');

//when hidden
$modal.on('hidden.bs.modal', function(e) { 
  return this.render(); //DOM destroyer
});

$modal.modal('hide'); //start hiding

1
하지만 크롬 콘솔에 this.render()표시 undefined is not a function되는 내용을 알려주십시오 .
Anil Kumar Pandey

9

"표시된"콜백이 발생한 후 전화를 거는 것이 더 좋았습니다.

$('#myModal').on('shown', function () {
      $('#myModal').modal('hide');
})

이를 통해 hide () 호출 전에 모달을로드 할 수있었습니다.


8

우리가 발견 한 것은 서버 코드 호출과 성공 콜백 리턴 사이에 약간의 지연이 있다는 것입니다. $("#myModal").on('hidden.bs.modal', function (e)핸들러 에서 서버 호출을 래핑 한 다음 $("#myModal").modal("hide");메소드 를 호출 하면 브라우저가 모달을 숨기고 서버 측 코드를 호출합니다.

다시 말하지만, 우아하지는 않지만 기능적입니다.

 function myFunc(){
        $("#myModal").on('hidden.bs.modal', function (e) {
            // Invoke your server side code here.
        });
        $("#myModal").modal("hide");
 };

보시다시피, myFunc호출되면 모달을 숨기고 서버 측 코드를 호출합니다.


6

나는 같은 문제를 겪고 있었고 약간의 실험 후에 해결책을 찾았습니다. 클릭 핸들러에서 다음과 같이 이벤트 버블 링을 중지해야했습니다.

$("a.close").on("click", function(e){
  $("#modal").modal("hide");
  e.stopPropagation();
});

6

문서는 다음과 같습니다. http://getbootstrap.com/javascript/#modals-methods

방법은 다음과 같습니다. $ ( '# myModal'). modal ( 'hide')

다른 내용으로 모달을 여러 번 열어야하는 경우 (주요 js)를 추가하는 것이 좋습니다.

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

따라서 다음 개구부를 위해 내용을 청소하고 일종의 캐싱을 피하십시오.


6
$('.modal-backdrop').hide(); // for black background
$('body').removeClass('modal-open'); // For scroll run
$('#modal').modal('hide'); 

5

심지어 같은 종류의 문제가 있습니다. 이것은 나에게 많은 도움이되었다

$("[data-dismiss=modal]").trigger({ type: "click" });


4

$('#modal').modal('hide');data-dismiss="modal"취소 버튼의 속성으로 사용 하지 않으면 변형이 작동하지 않았습니다 . 당신과 마찬가지로, 내 요구는 일부 추가 논리에 따라 닫히거나 닫히지 않아야했기 때문에 링크가있는 링크를 클릭하면 data-dismiss="modal"안됩니다. data-dismiss="modal"클릭 핸들러를 프로그래밍 방식으로 호출 할 수 있는 숨겨진 버튼이 생겼습니다.

<a id="hidden-cancel" class="hide" data-dismiss="modal"></a>
<a class="close btn">Cancel</a>

그런 다음 클릭 핸들러 내부에서 취소 할 수있는 모달을 닫을 때 취소하십시오.

$('#hidden-cancel').click();

필자의 경우 (순수한 면도기 페이지) OP와 비슷합니다. 클래스가 "modal"인 다소 비어있는 div가 있었고 cshtml 파일을 동적으로 추가했습니다. 모달이 표시 되 자마자 몸. ".modal ( 'hide)"만 호출하는 것만으로는 충분하지 않습니다. 호출 버튼의 "data-dismiss ="modal ""이 거래였습니다! ty
Csharpest

3

이벤트 버블 링을 관리해야합니다. 한 줄의 코드를 추가해야 함

$("#savechanges").on("click", function (e) {
        $("#userModal").modal("hide");
        e.stopPropagation(); //This line would take care of it
    });

3

나는 이것이 오래된 질문이라는 것을 알고 있지만, 이것들 중 어느 것도 내가 정확히 찾고있는 것이 아니라는 것을 알았습니다. 표시가 끝나기 전에 모달을 닫으려고 한 것 같습니다.

내 솔루션은 @ schoonie23의 답변을 기반으로했지만 몇 가지 사항을 변경해야했습니다.

먼저 스크립트 상단에 전역 변수를 선언했습니다.

<script>
    var closeModal = false;
    ...Other Code...

그런 다음 모달 코드에서 :

$('#myModal').on('show.bs.modal', function (event) {
    ...Some Code...
    if (someReasonToHideModal) {
        closeModal = true;
        return;
    }
    ...Other Code...

그런 다음 : (show 이벤트가 호출 될 때 트리거되는 'show'와 반대로 모달이 완전히 표시되었음을 나타내는 'shown.bs.modal'이라는 이름에 유의하십시오. )

$('#myModal').on('shown.bs.modal', function (event) {
    if (closeEditModal) {
        $('#myModal').modal('hide');
        closeModal = false;
    }
});

이것이 언젠가 누군가에게 추가 연구를 구하기를 바랍니다. 이 문제를 해결하기 전에 솔루션을 찾는 데 약간의 시간을 보냈습니다.


2

나는이 코드를 사용했다-

페이드 아웃을 사용하여 부드러운 효과로 모달을 숨 깁니다.

$('#myModal').fadeOut();

$('.modal-backdrop').fadeOut();

$('.modal-open').css({'overflow': 'visible'});

1

모달에서 close 클래스를 사용하는 경우 다음이 작동합니다. 유스 케이스에 따라 클로즈 클래스가있는 모달이 둘 이상인 경우 일반적으로 보이는 모달로 필터링하는 것이 좋습니다.

$('.close:visible').click();

0

document.getElementById ( 'closeButton'). click (); // data-dismiss = "modal"속성을 모달의 요소에 추가하고이 ID를 지정하십시오.


-1

이것은 나쁜 습관이지만 자바 스크립트에서 닫기 버튼을 호출 하여이 기술을 사용하여 모달을 닫을 수 있습니다. 3 초 후에 모달이 닫힙니다.

<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://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="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<script>
window.onload=function()
{
setInterval(function(){ 

$("#closemodal").click();
}, 3000);

}
</script> 
</head>
<body>

   <div class="container">
 <h2>Modal Example</h2>
<!-- Trigger the modal with a button -->
<button type="button" class="btn btn-info btn-lg" data-toggle="modal"   data-target="#myModal">Open Modal</button>

<!-- Modal -->
<div class="modal fade" id="myModal" role="dialog">
<div class="modal-dialog">

    <!-- Modal content-->
  <div class="modal-content">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal">&times;</button>
      <h4 class="modal-title">Modal Header</h4>
    </div>
    <div class="modal-body">
      <p>Some text in the modal.</p>
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-default" data-dismiss="modal" id="closemodal">Close</button>
    </div>
  </div>

</div>
</div>

 </div>

</body>
</html>

-2

이것은 HTML로만 수행 할 수 있습니다.

data-dismiss="modal"

<button type="button" class="btn btn-secondary" data-dismiss="modal">Save</button>

@KevinFrancis 문제는 컨트롤러 에서이 작업을 수행하는 버튼을 만드는 방법이 아닌 프로그래밍 방식을 찾고 있기 때문입니다.
GreenAsJade
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.