Twitter 부트 스트랩 경고 메시지를 닫았다가 다시 엽니 다.


103

경고 메시지에 문제가 있습니다. 정상적으로 표시되며 사용자가 x(닫기)를 누르면 닫을 수 있지만 사용자가 다시 표시하려고하면 (예 : 버튼 이벤트 클릭) 표시되지 않습니다. (또한이 경고 메시지를 콘솔에 인쇄하면 [].) 내 코드는 다음과 같습니다.

 <div class="alert" style="display: none">
   <a class="close" data-dismiss="alert">×</a>
   <strong>Warning!</strong> Best check yo self, you're not looking too good.
 </div>

그리고 이벤트 :

 $(".alert").show();

추신! 일부 이벤트 (예 : 버튼 클릭)가 발생한 후에 만 ​​경고 메시지를 표시해야합니다. 아니면 내가 뭘 잘못하고 있니?

답변:


180

데이터 닫기는 요소를 완전히 제거합니다. 대신 jQuery의 .hide () 메서드를 사용하십시오.

빠른 수정 방법 :

인라인 자바 스크립트를 사용하여 다음과 같이 요소 onclick을 숨 깁니다.

<div class="alert" style="display: none"> 
    <a class="close" onclick="$('.alert').hide()">×</a>  
    <strong>Warning!</strong> Best check yo self, you're not looking too good.  
</div>

<a href="#" onclick="$('alert').show()">show</a>

http://jsfiddle.net/cQNFL/

그러나 이것은 당신이 게으른 경우에만 사용해야합니다 (유지 관리 가능한 앱을 원한다면 좋지 않습니다).

올바른 방법 :

요소를 숨기기위한 새 데이터 속성을 만듭니다.

자바 스크립트 :

$(function(){
    $("[data-hide]").on("click", function(){
        $("." + $(this).attr("data-hide")).hide()
        // -or-, see below
        // $(this).closest("." + $(this).attr("data-hide")).hide()
    })
})

그런 다음 데이터 닫기를 마크 업에서 데이터 숨기기로 변경합니다. jsfiddle의 예 .

$("." + $(this).attr("data-hide")).hide()

이렇게하면 data-hide에 지정된 클래스의 모든 요소가 숨겨집니다. 즉 : data-hide="alert"경고 클래스가있는 모든 요소를 ​​숨 깁니다.

Xeon06 은 대체 솔루션을 제공했습니다.

$(this).closest("." + $(this).attr("data-hide")).hide()

가장 가까운 부모 요소 만 숨 깁니다. 이는 각 경고에 고유 한 클래스를 부여하지 않으려는 경우 매우 유용합니다. 그러나 경고 내에 닫기 버튼을 배치해야합니다.

jquery doc 에서 .closest 정의 :

집합의 각 요소에 대해 요소 자체를 테스트하고 DOM 트리의 상위 항목을 통해 위로 이동하여 선택기와 일치하는 첫 번째 요소를 가져옵니다.


4
야! 당신에 관해서는 정답입니다. alert페이지 에서 동일한 클래스 (예 :)를 가진 모든 요소를 ​​숨 깁니다 . 이에 대한 해결책은 콜백의 내용을이 줄로 바꾸는 것입니다.이 줄 $(this).closest("." + $(this).attr("data-hide")).hide();은 가장 가까운 상위 요소에만 영향을 미칩니다. 일반적으로 해제 버튼이 영향을주는 경고 내에 배치되므로 확인합니다.
Alex Turpin 2013

1
그건 사실입니다. 저는 그렇게 할 생각이 없었습니다. 그러나 이렇게하면이 솔루션의 단순성이 약간 제거됩니다. 기존 코드에 주석으로 추가하겠습니다. 감사!
Henrik Karlsson 2013

1
New to this .. 어디에서 '$ (function () {..'을 정의
하시겠습니까

1
JavaScript 파일 또는 <script> 여기 코드 </ script> 태그의 모든 위치.
Henrik Karlsson

1
$ (document) .on ( 'click', '[data-hide]', function () {/ * * /}) 당신의 대답은 완벽 할 것입니다;)
shock_gone_wild

26

방금 모델 변수를 사용하여 대화 상자를 표시하거나 숨기고 data-dismiss="alert"

예:

<div data-ng-show="vm.result == 'error'" class="alert alert-danger alert-dismissable">
    <button type="button" class="close" data-ng-click="vm.result = null" aria-hidden="true">&times;</button>
    <strong>Error  !  </strong>{{vm.exception}}
</div>

나를 위해 일하고 jquery에 갈 필요가 없습니다.


1
투표율이 높은 답변보다 훨씬 간단하고 더 나은 솔루션입니다!
Abs

내 의견에 훨씬 더 나은 솔루션
devqon

난 당신 생각처럼
Kumaresan Perumal

15

이 문제에 대한 좋은 접근 방식은 Bootstrap의 close.bs.alert이벤트 유형을 활용 하여 경고를 제거하는 대신 숨기는 것입니다. Bootstrap이이 이벤트 유형을 노출하는 이유는 DOM에서 경고를 제거하는 기본 동작을 덮어 쓸 수 있기 때문입니다.

$('.alert').on('close.bs.alert', function (e) {
    e.preventDefault();
    $(this).addClass('hidden');
});

5

knockout.js와 같은 MVVM 라이브러리를 사용한다면 (필자가 강력히 추천합니다) 더 깔끔하게 할 수 있습니다 :

<div class="alert alert-info alert-dismissible" data-bind="visible:showAlert">
   <button type="button" class="close" data-bind="click:function(){showAlert(false);}>
        <span aria-hidden="true">&times;</span>
        <span class="sr-only">Close</span>
   </button>
   Warning! Better check yourself, you're not looking too good.
</div>

http://jsfiddle.net/bce9gsav/5/


data-bind="click:function(){showAlert(false);}깨끗하지 않은 띄는 자바 스크립트 의 완벽한 예입니다 . 난 강력하게 추천 하지 이 방법을 따라
레오

@Leo는 어떤 방식으로 눈에 띄지 않습니까?
Ohad Schneider

모든면에서 눈에 띄지 않습니다. html 구조 / 마크 업에 적극적으로 동작을 "포함"하고 있습니다. 그 동작을 변경해야한다고 상상해보십시오. 얼마나 많은 페이지와 HTML 요소를 변경해야합니까? 오해하지 마십시오. 여전히 질문에 대한 답을 제공하므로 제가 반대 투표를하지 않을 것입니다. 그러나 이것은 "깨끗한"해결책에서 멀리
레오

아니요, 제가 실제로 말하는 것은 관심사 분리를 사용하는 것 입니다. 뷰 (html)에는 자바 스크립트가 포함되어서는 안되며, 개발팀에서는 부정적인 영향이 클 수 있습니다. 여기에 녹아웃과 다소 논란에 대한 좋은 질문 (답변)입니다 data-bind속성 stackoverflow.com/questions/13451414/unobtrusive-knockout
레오

"JavaScript"는 무엇이라고 생각하십니까? 호출 할 메서드의 이름 만 포함 된 경우 어떻게됩니까? 그것이 당신의 눈에 눈에 띄게 만드는 매개 변수 (false)로 그것을 호출한다는 사실입니까?
Ohad Schneider

2

따라서 동적 html 페이지를 처리 ​​할 수있는 솔루션을 원한다면 이미 포함되어 있으므로 jQuery의 라이브를 사용하여 현재 및 미래의 모든 요소에 핸들러를 설정하거나 제거해야합니다.

나는 사용한다

$(document).on("click", "[data-hide-closest]", function(e) {
  e.preventDefault();
  var $this = $(this);
  $this.closest($this.attr("data-hide-closest")).hide();
});
.alert-success {
    background-color: #dff0d8;
    border-color: #d6e9c6;
    color: #3c763d;
}
.alert {
    border: 1px solid transparent;
    border-radius: 4px;
    margin-bottom: 20px;
    padding: 15px;
}
.close {
    color: #000;
    float: right;
    font-size: 21px;
    font-weight: bold;
    line-height: 1;
    opacity: 0.2;
    text-shadow: 0 1px 0 #fff;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="alert alert-success">
  <a class="close" data-hide-closest=".alert">×</a>
  <strong>Success!</strong> Your entries were saved.
</div>


2

이것은 나를 위해 가장 잘 작동했습니다.

$('.alert').on('close.bs.alert', function (e) {
    e.preventDefault();
    $(this).hide();
});

1

이 문제도 만났고 단순히 닫기 버튼을 해킹하는 문제는 여전히 표준 부트 스트랩 경고 닫기 이벤트에 액세스해야한다는 것입니다.

내 솔루션은 최소한의 소란으로 적절하게 구성된 Bootstrap 3 경고 (필요에 따라 닫기 버튼 포함 또는 제외)를 주입하고 상자가 닫힌 후 쉽게 다시 생성 할 수 있는 작고 사용자 정의 가능한 jquery 플러그인 을 작성하는 것이 었 습니다.

사용법, 테스트 및 예제는 https://github.com/davesag/jquery-bs3Alert 를 참조 하십시오 .


1

Henrik Karlsson이 게시하고 Martin Prikryl이 편집 한 답변에 동의합니다. 접근성을 기반으로 한 제안이 있습니다. .attr ( "aria-hidden", "true")를 끝에 추가하여 다음과 같이 표시합니다.

$(this).closest("." + $(this).attr("data-hide")).attr("aria-hidden", "true");

2
정말 필요한가요? jQuerys .hide 함수 세트 display : none, 스크린 리더는 어쨌든 숨겨진 것으로 인식 할만큼 똑똑해야하지 않습니까?
Henrik Karlsson 2015

1

위의 모든 솔루션은 angular 또는 jQuery와 같은 외부 라이브러리와 이전 버전의 Bootstrap을 사용합니다. 그래서 여기 에 Bootstrap 4에 적용된 순수 JavaScript 로 된 Charles Wyke-Smith의 솔루션이 있습니다. 예, Bootstrap은 자체 모달 및 경고 코드를 위해 jQuery가 필요하지만 모든 사람이 더 이상 jQuery로 자신의 코드를 작성하는 것은 아닙니다.

다음은 경고의 html입니다.

<div id="myAlert" style="display: none;" 
    class="alert alert-success alert-dismissible fade show">
    <button type="button" class="close" data-hide="alert">&times;</button>
    <strong>Success!</strong> You did it!
</div>

처음에는 경고가 숨겨져 있으며 ( style="display: none;") 표준 대신 data-dismiss="alert"여기에서를 사용했습니다 data-hide="alert".

다음은 경고를 표시하고 닫기 버튼을 재정의하는 JavaScript입니다.

var myAlert = document.getElementById('myAlert');
// Show the alert box
myAlert.style.display = 'block';
// Override Bootstrap's standard close action
myAlert.querySelector('button[data-hide]').addEventListener('click', function() {
    myAlert.style.display = 'none';
});

코드의 다른 곳에서 프로그래밍 방식으로 경고를 숨기거나 표시하려면 myAlert.style.display = 'none';또는을 수행하십시오 myAlert.style.display = 'block';.


0

이 문제는을 사용하여 발생합니다. Javascript로 경고style="display:none"숨기 거나 적어도 표시 할 때 스타일 속성을 제거해야합니다.


2
별로 문제는 요소 제거 데이터-해고입니다
헨릭 칼슨

0

다른 답변과 data-dismiss를 data-hide로 변경하는 것을 기반으로이 예제는 링크에서 경고 열기를 처리하고 경고를 반복적으로 열고 닫을 수 있도록합니다.

$('a.show_alert').click(function() {
    var $theAlert = $('.my_alert'); /* class on the alert */
    $theAlert.css('display','block');
   // set up the close event when the alert opens
   $theAlert.find('a[data-hide]').click(function() {
     $(this).parent().hide(); /* hide the alert */
   });
});

0

나는 모든 방법을 시도하고 나를 위해 가장 좋은 방법은 사용하는 것입니다 내장 된 부트 스트랩 클래스 .fade.in

예:

<div class="alert alert-danger fade <?php echo ($show) ? 'in' : '' ?>" role="alert">...</div>

참고 : jQuery에서 경고를 표시하려면 addClass ( 'in'), 숨기려면 removeClass ( 'in')하십시오.

재미있는 사실 : 이것은 모든 요소에 적용됩니다. 경고 뿐만이 아닙니다.


0

다음은 Henrik Karlsson답변 을 기반으로 하지만 적절한 이벤트 트리거 ( 부트 스트랩 소스 기반)를 기반으로하는 솔루션입니다 .

$(function(){
    $('[data-hide]').on('click', function ___alert_hide(e) {
        var $this = $(this)
        var selector = $this.attr('data-target')
        if (!selector) {
            selector = $this.attr('href')
            selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        }

        var $parent = $(selector === '#' ? [] : selector)

        if (!$parent.length) {
            $parent = $this.closest('.alert')
        }

        $parent.trigger(e = $.Event('close.bs.alert'))

        if (e.isDefaultPrevented()) return

        $parent.hide()

        $parent.trigger($.Event('closed.bs.alert'))
    })
});

대부분 저에게 대답은 메모입니다.


0

단순히 "컨테이너"div를 추가하고 제거 된 경고 div를 매번 다시 추가하는 것만으로는이 작업을 수행 할 수 없습니다. 나를 위해 일하는 것 같습니까?

HTML

<div id="alert_container"></div>

JS

 $("#alert_container").html('<div id="alert"></div>');          
 $("#alert").addClass("alert alert-info  alert-dismissible");
 $("#alert").html('<a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a><strong>Info!</strong>message');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.