외부를 클릭하여 Twitter 부트 스트랩 팝 오버를 해제하는 방법은 무엇입니까?


289

모달과 같은 방식으로 팝 오버를 해제 할 수 있습니까? 사용자가 외부에서 클릭하면 닫히도록 하시겠습니까?

불행히도 나는 popover 대신 실제 모달을 사용할 수 없습니다. 모달은 위치 : 고정을 의미하고 더 이상 팝 오버가 아니기 때문입니다. :(



stackoverflow.com/a/40661543/5823517을 사용해보십시오 . 부모를 통해 반복 포함하지 않음
Tunn에게

data-trigger="hover"data-trigger="focus"내장되는 대안은 토글 사용하지 않는 경우, 팝 오버를 닫는. 내 의견으로 data-trigger="hover"는, 최고의 사용자 경험을 제공합니다 ... 추가 .js 코드를 작성할 필요가 없습니다 ...
Hooman Bahreini

답변:


461

업데이트 : 약간 더 강력한 솔루션 : http://jsfiddle.net/mattdlockyer/C5GBU/72/

텍스트 만 포함 된 버튼의 경우 :

$('body').on('click', function (e) {
    //did not click a popover toggle or popover
    if ($(e.target).data('toggle') !== 'popover'
        && $(e.target).parents('.popover.in').length === 0) { 
        $('[data-toggle="popover"]').popover('hide');
    }
});

아이콘 포함 된 버튼 사용 (이 코드에는 Bootstrap 3.3.6에 버그가 있음,이 답변의 아래 수정 사항 참조)

$('body').on('click', function (e) {
        //did not click a popover toggle, or icon in popover toggle, or popover
        if ($(e.target).data('toggle') !== 'popover'
            && $(e.target).parents('[data-toggle="popover"]').length === 0
            && $(e.target).parents('.popover.in').length === 0) { 
            $('[data-toggle="popover"]').popover('hide');
        }
    });

JS 생성 팝 오버'[data-original-title]' 대신 사용'[data-toggle="popover"]'

주의 사항 : 위의 솔루션을 통해 여러 팝 오버를 한 번에 열 수 있습니다.

한 번에 한 번의 팝 오버 :

업데이트 : Bootstrap 3.0.x, 코드 또는 바이올린 참조 http://jsfiddle.net/mattdlockyer/C5GBU/2/

$('body').on('click', function (e) {
    $('[data-toggle="popover"]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            $(this).popover('hide');
        }
    });
});

이것은 이미 열려 있고 클릭하지 않았거나 링크를 클릭하지 않은 팝 오버 닫기를 처리합니다.


업데이트 : Bootstrap 3.3.6, 바이올린 참조

닫은 후 다시 열려면 2 번 클릭하는 문제가 해결되었습니다.

$(document).on('click', function (e) {
    $('[data-toggle="popover"],[data-original-title]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {                
            (($(this).popover('hide').data('bs.popover')||{}).inState||{}).click = false  // fix for BS 3.3.6
        }

    });
});

업데이트 : 이전 개선 조건을 사용 하여이 솔루션을 달성했습니다. 더블 클릭 및 고스트 팝 오버 문제를 해결하십시오.

$(document).on("shown.bs.popover",'[data-toggle="popover"]', function(){
    $(this).attr('someattr','1');
});
$(document).on("hidden.bs.popover",'[data-toggle="popover"]', function(){
    $(this).attr('someattr','0');
});
$(document).on('click', function (e) {
    $('[data-toggle="popover"],[data-original-title]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            if($(this).attr('someattr')=="1"){
                $(this).popover("toggle");
            }
        }
    });
});

2
때로는 전체 페이지가 확장되지 않기 때문에 $(document)대신에 첨부합니다 . $('body')body
jasop

6
팝 오버 (및 후속 숨기기 동작)를 활성화 한 후에는 팝 오버가 완전히 숨겨지지 않습니다. 보이지 않습니다. 문제는 보이지 않지만 현재 나타나는 팝 오버 아래의 콘텐츠를 클릭하거나 마우스로 가리킬 수 없다는 것입니다. 문제는 최신 크롬 빌드, 최신 부트 스트랩 3 개의 .js가 (물론,이 해결 방법 어쨌든 요구해야하기 때문에 확인 성가 시게 할 수없는 등의 다른 브라우저 될 수 있음) 발생
ravb79

6
'[data-toggle="popover"]'JavaScript로 생성 된 팝 오버에서는 작동하지 않는 대신 '[data-original-title]'셀렉터로 사용 했습니다.
Nathan

4
이 솔루션이 최신 버전의 부트 스트랩에서 작동하지 않는 이유를 아는 사람이 있습니까? 다음과 같은 상황이 발생합니다. 버튼을 클릭하여 팝 오버를 표시 한 다음 본문을 클릭하여 팝 오버를 해제 한 다음 버튼을 클릭하여 팝 오버를 표시하면 팝 오버가 표시되지 않습니다. 다시 클릭하면 실패한 후 표시됩니다. 매우 이상합니다.
JTunney

3
@JTunney BS 3.3.6을 실행하고 있는데 팝업을 닫은 후 popoever를 열려면 두 번의 클릭이 필요한 동작을 여전히 봅니다.
sersun

65
$('html').on('mouseup', function(e) {
    if(!$(e.target).closest('.popover').length) {
        $('.popover').each(function(){
            $(this.previousSibling).popover('hide');
        });
    }
});

팝 오버를 제외한 아무 곳이나 클릭하면 모든 팝 오버가 닫힙니다.

부트 스트랩 4.1 업데이트

$("html").on("mouseup", function (e) {
    var l = $(e.target);
    if (l[0].className.indexOf("popover") == -1) {
        $(".popover").each(function () {
            $(this).popover("hide");
        });
    }
});

팝 오버 (pop-btn)를 트리거하는 버튼을 클래스에 추가하여 포함되지 않았습니다 ... if (! $ (e.target) .closest ( '. popover'). length &&! $ (e. target) .closest ( '. btn'). hasClass ( 'pop-btn'))
mozgras

2
3 개의 팝 오버 버튼으로이 코드는 문제를 일으 킵니다. 어떤 경우에는 버튼을 클릭 할 수 없으며 버튼이 깜박입니다.
OpenCode

1
이 코드를 작동시킬 수 없습니다 ...이 바이올린을 확인하고 답변에 바이올린을 추가하십시오. jsfiddle.net/C5GBU/102
mattdlockyer

나 한테 딱이야. 내 "외부 클릭"이 새 팝 오버를 열 때 다른 답변에 부작용이있었습니다.
Facio Ratio

이것은 훌륭하게 작동하지만 팝 오버의 내용을 클릭해도 닫히지 않도록 조정할 수있는 방법이 필요합니다. 예를 들어 팝 오버 내부의 <b> 태그 안의 텍스트를 클릭하면 ...
Ben in CA

39

가장 단순하고 가장 안전한 버전 은 모든 부트 스트랩 버전과 호환됩니다.

데모 : http://jsfiddle.net/guya/24mmM/

데모 2 : 팝 오버 컨텐츠 내부를 클릭 할 때 닫히지 않음 http://jsfiddle.net/guya/fjZja/

데모 3 : 여러 팝 오버 : http://jsfiddle.net/guya/6YCjW/


이 회선을 호출하면 모든 팝 오버가 해제됩니다.

$('[data-original-title]').popover('hide');

이 코드로 외부를 클릭하면 모든 팝 오버를 해제하십시오.

$('html').on('click', function(e) {
  if (typeof $(e.target).data('original-title') == 'undefined') {
    $('[data-original-title]').popover('hide');
  }
});

위의 스 니펫은 본문에 클릭 이벤트를 첨부합니다. 사용자가 팝 오버를 클릭하면 정상적으로 작동합니다. 사용자가 팝 오버가 아닌 것을 클릭하면 모든 팝 오버가 닫힙니다.

작동하지 않는 다른 예제와 달리 Javascript로 시작되는 팝 오버에서도 작동합니다. (데모 참조)

팝 오버 컨텐츠 내부를 클릭 할 때 해제하지 않으려면이 코드를 사용하십시오 (두 번째 데모 링크 참조).

$('html').on('click', function(e) {
  if (typeof $(e.target).data('original-title') == 'undefined' && !$(e.target).parents().is('.popover.in')) {
    $('[data-original-title]').popover('hide');
  }
});

3
비슷한 문제가 있었고 이것은 Bootstrap 3에서 작동했습니다.
wsams

팝 오버가 겹치도록 팝 오버를 더 가까이 가져 오면 외부의 어딘가를 클릭하여 팝 오버를 숨기면 링크 중 하나가 작동하지 않습니다. 확인 : jsfiddle.net/qjcuyksb/1
Sandeep Giri

1
팝 오버에서 bootstrap-datepicker를 사용할 때 마지막 버전이 작동하지 않습니다.
dbinott

1
수락 된 답변이 30 개 정도의 팝업으로 약간의 리소스 호그가되기 시작했기 때문에이 솔루션이 가장 마음에 들었습니다.
David G

1
아마도 !$(e.target).closest('.popover.in').length보다 더 효율적일 것 !$(e.target).parents().is('.popover.in')입니다.
joeytwiddle

19

부트 스트랩 2.3.2를 사용하면 트리거를 '포커스'로 설정할 수 있으며 작동합니다.

$('#el').popover({trigger:'focus'});

1
+1이지만 중요한 측면 참고 사항 : 버튼이나 앵커를 다시 클릭해도 허용되는 답변은 팝업이 닫히지 않습니다.
Christian Gollhardt

18

이것은 기본적으로 매우 복잡하지는 않지만 결함을 피하기 위해 확인해야 할 사항이 있습니다.

데모 (jsfiddle)

var $poped = $('someselector');

// Trigger for the popover
$poped.each(function() {
    var $this = $(this);
    $this.on('hover',function() {
            var popover = $this.data('popover');
            var shown = popover && popover.tip().is(':visible');
            if(shown) return;        // Avoids flashing
            $this.popover('show');
    });
});

// Trigger for the hiding
 $('html').on('click.popover.data-api',function() {
    $poped.popover('hide');
});

2
이없는 외부 어디에서나 클릭하여 모달을 일축
hienbt88

popover()마우스 오버가 아닌 클릭시이 작업을 수행 할 수 있습니까?
자키 아지즈

3
물론 stopPropagation()클릭 핸들러로 전달 된 이벤트 를 호출해야 합니다 (그렇지 않은 경우 숨기기 핸들러는 즉시 팝 오버를 숨 깁니다). 데모 (jsfiddle)
Sherbrow

훨씬 적은 코드로 동일한 기능이 아래에 있습니다. 이 답변은 부풀어 오르고 질문에 약간 어리 석습니다 ... 그가 원하는 것은 외부를 클릭 할 때 팝 오버를 닫는 것입니다 ... 이것은 과잉이며 추악합니다!
mattdlockyer

2
수정, 나는 더 적은 코드에서 더 나은 기능을 가지고 있다고 생각합니다. 한 번에 하나의 팝업 만 보이기를 원한다고 가정합니다. 당신이 이것을 좋아한다면 아래에 내 대답을 투표하십시오 : jsfiddle.net/P3qRK/1 답변 : stackoverflow.com/a/14857326/1060487
mattdlockyer

16

투표율이 높은 솔루션 중 어느 것도 나를 위해 올바르게 작동하지 않았습니다. 팝 오버를 처음 열고 닫은 후 (다른 요소를 클릭하여) 버그가 발생하면 번 만들 때까지 다시 열리지 않습니다. 발생하면 트리거 링크를 하나 클릭하는 대신 번 클릭 .

그래서 약간 수정했습니다.

$(document).on('click', function (e) {
    var
        $popover,
        $target = $(e.target);

    //do nothing if there was a click on popover content
    if ($target.hasClass('popover') || $target.closest('.popover').length) {
        return;
    }

    $('[data-toggle="popover"]').each(function () {
        $popover = $(this);

        if (!$popover.is(e.target) &&
            $popover.has(e.target).length === 0 &&
            $('.popover').has(e.target).length === 0)
        {
            $popover.popover('hide');
        } else {
            //fixes issue described above
            $popover.popover('toggle');
        }
    });
})

1
좋아, 그것은 나를 위해 일하고있다. BTW는); 마지막 코드 끝에서}
Merlin

1
두 번째 클릭과 관련된 동일한 문제가 있습니다. 이것이 안전한 안전이어야합니다!
Felipe Leão

위의 이전 솔루션을 시도했지만 2016 년 현재 솔루션을 찾고있는 사람들에게 지침으로 더 나은 솔루션입니다.
dariru

최고 답변은 광고 된대로 작동합니다. 언급했듯이 다른 사람들은 그렇지 않았습니다. 이것은 정답
duggi

data-toggel = "popover"를 사용하지 않은 것을 제외하고는 완벽하게 작동합니다. 그러나 팝 오버 트리거 요소와 일치하는 선택기를 지정할 수 있습니다. 좋은 솔루션과 나를 위해 두 번의 클릭 문제를 해결 한 유일한 솔루션입니다.
shock_gone_wild

11

나는 그것을하는 방법을 보여주기 위해 jsfiddle을 만들었습니다.

http://jsfiddle.net/3yHTH/

아이디어는 버튼을 클릭하면 팝 오버를 표시하고 버튼 외부를 클릭하면 팝 오버를 숨기는 것입니다.

HTML

<a id="button" href="#" class="btn btn-danger">Click for popover</a>

JS

$('#button').popover({
    trigger: 'manual',
    position: 'bottom',
    title: 'Example',
    content: 'Popover example for SO'
}).click(function(evt) {
    evt.stopPropagation();
    $(this).popover('show');
});

$('html').click(function() {
    $('#button').popover('hide');
});

좋은 데모. Jquery 객체에서 popover를 어떻게 호출 할 수 있는지 궁금합니다 .popover는 부트 스트랩 js 플러그인이지만 부트 스트랩 js 파일은 포함하지 않습니까?
bingjie2680

jsfiddle에 js 파일이 있습니다. 왼쪽 열-> 자원 관리를보십시오.
Pigueiras

좋아, 부트 스트랩 js가 있음을 알았다. 그러나 확인되지 않았지만 여전히 작동합니까?
bingjie2680

예, 작동합니다. 어쨌든, 나는 구글에서 검색했다 : jsfiddle bootstrap그것은 jsfiddle에서 부트 스트랩 CSS + JS의 골격을 주었다.
Pigueiras

2
이것에 대한 나의 유일한 문제는 팝 오버를 클릭하면 숨길 수 있다는 것입니다. 툴팁을 사용할 수도 있습니다.
NoBrainer

6

이 속성을 요소와 함께 추가하기 만하면됩니다.

data-trigger="focus"

처음에는 Bootstrap 3.3.7에서 작동하지 않았지만 문서를 읽고 여기에 언급 할 가치가있는 지침이 있습니다. 문서의 Dismissible popover 예제에서 "올바른 브라우저 및 플랫폼 간 동작을 위해서는 <button> 태그가 아닌 <a> 태그를 사용해야하며 role ="button "및 tabindex 속성도 포함해야합니다. "
Jeff

3

이것은 전에 여기 에 요청되었습니다 . 내가 준 동일한 대답이 여전히 적용됩니다.

비슷한 요구가 있었고 Lee Carmichael의 BootstrapX-clickover라는 Twitter Bootstrap Popover의 작은 확장 기능을 발견했습니다 . 또한 여기에 몇 가지 사용 예가 있습니다 . 기본적으로 팝업을 대화 형 구성 요소로 변경하면 페이지의 다른 곳을 클릭하거나 팝업 내 닫기 버튼을 클릭하면 닫힙니다. 또한 여러 팝 오버가 한 번에 열리고 다른 멋진 기능도 많이 제공됩니다.


3

이 파티에 늦었지만 ... 나는 그것을 공유 할 것이라고 생각했다. 나는 팝 오버를 좋아하지만 내장 기능이 거의 없습니다. 나는 팝 오버가되고 싶은 모든 부트 스트랩 확장 .bubble ()을 작성했습니다. 해고하는 네 가지 방법. 외부를 클릭하고 링크를 전환 한 다음 X를 클릭하고 이스케이프를 누르십시오.

자동으로 배치되므로 페이지를 벗어나지 않습니다.

https://github.com/Itumac/bootstrap-bubble

이것은 무의미한 자기 진흥이 아닙니다 ... 나는 내 인생에서 다른 사람들의 코드를 너무 많이 잡아서 내 자신의 노력을 기울이고 싶었습니다. 소용돌이를주고 그것이 당신에게 효과가 있는지보십시오.


3

http://getbootstrap.com/javascript/#popovers 에 따르면 ,

<button type="button" class="popover-dismiss" data-toggle="popover" title="Dismissible popover" data-content="Popover Content">Dismissible popover</button>

사용자가 다음에 클릭 할 때 포커스 트리거를 사용하여 팝 오버를 해제하십시오.

$('.popover-dismiss').popover({
    trigger: 'focus'
})

2
OS X 기본 동작을 따르는 Mac 브라우저에서는 작동하지 않습니다 (클릭시 초점을 맞추거나 흐리게 표시하지 않음). 여기에는 Firefox 및 Safari가 포함됩니다. 부트 스트랩 녀석은 여기서 팝 오버를 열 수 없으며 해고 할뿐만 아니라 큰 실수를 범했습니다.
Ante Vrli

2
당신이 당신의 코멘트를 쓸 때 @AnteVrli은 아마도이 문서에 아직 아니었지만 지금은 문서 말 : "적절한 크로스 브라우저 및 크로스 플랫폼 행동, 당신은 사용해야합니다 <a>태그가 아닌 <button>태그를, 그리고 당신도 포함해야합니다 role="button"tabindex속성. " 이 사양으로 사용해 보셨습니까?
Louis

3
음, 이다 마우스 버튼을 눌러 : 플랫폼 호환성과 아무 상관이 답변에 문제 내부 팝 오버를 트리거하는 요소가 포커스를 잃게되므로 팝 오버를 기각하는 팝 오버는. 사용자가 팝 오버에서 복사하여 붙여 넣기를 할 수 없도록하십시오. 마우스 버튼을 눌렀을 때 팝 오버가 닫힙니다. 팝 오버에 실행 가능한 항목 (버튼, 링크)이 있으면 사용자는 해당 항목을 사용할 수 없습니다.
Louis

부트 스트랩 4.0.0-beta 및 4.0.0-beta.2에서는 '크로스 플랫폼'에 대해 너무 많이 사용하므로 Chrome의 Mac에서 작동하지 않습니다. (
rmcsharry

3

수정 된 수락 된 솔루션. 내가 경험 한 것은 일부 팝 오버가 숨겨진 후에 다시 표시하려면 두 번 클릭해야한다는 것입니다. 이미 숨겨진 팝 오버에서 popover ( 'hide')가 호출되지 않도록하기 위해 수행 한 작업은 다음과 같습니다.

$('body').on('click', function (e) {
    $('[data-original-title]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            var popoverElement = $(this).data('bs.popover').tip();
            var popoverWasVisible = popoverElement.is(':visible');

            if (popoverWasVisible) {
                $(this).popover('hide');
                $(this).click(); // double clicking required to reshow the popover if it was open, so perform one click now
            }
        }
    });
});


3

이 솔루션은 잘 작동합니다.

$("body")   .on('click'     ,'[data-toggle="popover"]', function(e) { 
    e.stopPropagation();
});

$("body")   .on('click'     ,'.popover' , function(e) { 
     e.stopPropagation();
});

$("body")   .on('click'  , function(e) {
        $('[data-toggle="popover"]').popover('hide');
});

2
jQuery("#menu").click(function(){ return false; });
jQuery(document).one("click", function() { jQuery("#menu").fadeOut(); });

2

이벤트 버블 링을 사용하여 DOM에서 팝업을 제거 할 수도 있습니다. 조금 더럽지 만 잘 작동합니다.

$('body').on('click touchstart', '.popover-close', function(e) {
  return $(this).parents('.popover').remove();
});

html에서 .popover-close 클래스를 popover 내부의 내용에 추가하여 popover를 닫아야합니다.


2

선택기 위임으로 팝 오버를 만드는 경우 '숨기기'방법이 작동하지 않는 대신 '파괴'를 사용해야합니다.

나는 그것을 그렇게 작동시켰다.

$('body').popover({
    selector: '[data-toggle="popover"]'
});

$('body').on('click', function (e) {
    $('[data-toggle="popover"]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            $(this).popover('destroy');
        }
    });
});

여기 JSfiddle


2

@mattdlockyer의 솔루션에 문제가 있음을 알았습니다 (솔루션 감사합니다). 다음과 같이 popover 생성자를 위해 selector 속성을 사용할 때 ...

$(document.body').popover({selector: '[data-toggle=popover]'});

제안 된 BS3 솔루션이 작동하지 않습니다. 대신에 로컬에 두 번째 팝 오버 인스턴스가 작성 $(this)됩니다. 이를 방지하기위한 솔루션은 다음과 같습니다.

$(document.body).on('click', function (e) {
    $('[data-toggle="popover"]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            var bsPopover = $(this).data('bs.popover'); // Here's where the magic happens
            if (bsPopover) bsPopover.hide();
        }
    });
});

언급 한 바와 같이 $(this).popover('hide');위임 된 리스너로 인해 두 번째 인스턴스가 작성됩니다. 제공된 솔루션은 이미 표시된 팝 오버 만 숨 깁니다.

시간을 절약 할 수 있기를 바랍니다.


2

부트 스트랩은 기본적으로 이것을 지원합니다 :

JS 빈 데모

다음 클릭시 해제에 필요한 특정 마크 업

적절한 크로스 브라우저 및 크로스 플랫폼 동작의 경우, 사용해야합니다 <a>태그 하지<button> 태그를, 당신은 또한 포함해야 role="button"하고 tabindex속성을.


부트 스트랩 4.0.0-beta 및 4.0.0-beta.2에서는 Chrome의 Mac에서 작동하지 않습니다. (
rmcsharry

아무 곳이나 클릭하면이 팝 오버가 닫힙니다. 질문자는 "팝 오버 외부를 클릭하면 닫힙니다".
philw

2

이 솔루션은 두 번째로 팝 오버를 표시 할 때 성가신 두 번째 클릭을 제거합니다.

Bootstrap v3.3.7로 테스트

$('body').on('click', function (e) {
    $('.popover').each(function () {
        var popover = $(this).data('bs.popover');
        if (!popover.$element.is(e.target)) {
            popover.inState.click = false;
            popover.hide();                
        }
    });
});

2

나는 이전의 많은 답변을 시도했지만 실제로 아무것도 효과가 없지만이 솔루션은 다음과 같습니다.

https://getbootstrap.com/docs/3.3/javascript/#dismiss-on-next-click

앵커 태그가 아닌 버튼을 사용하고 role = "button"+ data-trigger = "focus"+ tabindex = "0"속성을 관리하는 것이 좋습니다.

전의:

<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-toggle="popover" 
data-trigger="focus" title="Dismissible popover" data-content="amazing content">
Dismissible popover</a>


1

나는 이것을 생각해 냈습니다 : 내 시나리오에는 같은 페이지에 더 많은 팝 오버가 포함되어 있었으며 숨기면 보이지 않게되었습니다. 그 때문에 팝 오버 뒤에있는 항목을 클릭 할 수 없었습니다. 아이디어는 특정 팝 오버 링크를 '활성'으로 표시 한 다음 활성 팝 오버를 '토글'하는 것입니다. 그렇게하면 팝 오버가 완전히 닫힙니다 $ ( '. popover-link'). popover ({html : true, container : 'body'})

$('.popover-link').popover().on 'shown.bs.popover', ->
  $(this).addClass('toggled')

$('.popover-link').popover().on 'hidden.bs.popover', ->
  $(this).removeClass('toggled')

$("body").on "click", (e) ->
  $openedPopoverLink = $(".popover-link.toggled")
  if $openedPopoverLink.has(e.target).length == 0
    $openedPopoverLink.popover "toggle"
    $openedPopoverLink.removeClass "toggled"

1

새 팝 오버가 표시되기 전에 다른 활성 팝 오버를 제거합니다 (부트 스트랩 3).

$(".my-popover").popover();

$(".my-popover").on('show.bs.popover',function () {
    $('.popover.in').remove();
});              

1

3.3.6으로 테스트되었으며 두 번째 클릭은 정상입니다.

        $('[data-toggle="popover"]').popover()
            .click(function () {
            $(this).popover('toggle');
        });;

        $(document).on('click', function (e) {
            $('[data-toggle="popover"]').each(function () {
                //the 'is' for buttons that trigger popups
                //the 'has' for icons within a button that triggers a popup
                if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
                    $(this).popover('hide');
                }
            });
        });

0

데모 : http://jsfiddle.net/nessajtr/yxpM5/1/

var clickOver = clickOver || {};
clickOver.uniqueId = $.now();

clickOver.ClickOver = function (selector, options) {
    var self = this;

    //default values
    var isVisible, clickedAway = false;

    var callbackMethod = options.content;
var uniqueDiv = document.createElement("div");
var divId = uniqueDiv.id = ++clickOver.uniqueId;
uniqueDiv.innerHTML = options.loadingContent();

options.trigger = 'manual';
options.animation = false;
options.content = uniqueDiv;

self.onClose = function () {
    $("#" + divId).html(options.loadingContent());
    $(selector).popover('hide')
    isVisible = clickedAway = false;
};
self.onCallback = function (result) {
    $("#" + divId).html(result);
};

$(selector).popover(options);

//events
$(selector).bind("click", function (e) {
    $(selector).filter(function (f) {
        return $(selector)[f] != e.target;
    }).popover('hide');

    $(selector).popover("show");
    callbackMethod(self.onCallback);

    isVisible = !(clickedAway = false);
});

$(document).bind("click", function (e) {
    if (isVisible && clickedAway && $(e.target).parents(".popover").length == 0) {
        self.onClose();
        isVisible = clickedAway = false;
    } else clickedAway = true;
});

}

이것이 나의 해결책입니다.


0

이 방법을 사용하면 페이지의 아무 곳이나 클릭하여 팝 오버를 닫을 수 있습니다. 다른 클릭 가능한 엔티티를 클릭하면 다른 모든 팝 오버가 숨겨집니다. animation : false가 필요합니다. 그렇지 않으면 콘솔에 jquery .remove 오류가 발생합니다.

$('.clickable').popover({
 trigger: 'manual',
 animation: false
 }).click (evt) ->
  $('.clickable').popover('hide')
  evt.stopPropagation()
  $(this).popover('show')

$('html').on 'click', (evt) ->
  $('.clickable').popover('hide')

0

Ok 이것은 실제로 stackoverflow에서 무언가에 응답하는 첫 번째 시도이므로 여기에는 아무것도 없습니다 .P

이 기능이 실제로 최신 부트 스트랩에서 즉시 작동한다는 것은 확실하지 않습니다 . 사용자가 클릭 할 수 있습니다. 당신은 넣을 경우 잘 모르겠어요 '클릭 마우스로 가리 키지 만 iPad에서는 클릭이 토글로 작동합니다.

결과적으로 데스크톱에서 마우스를 가져 가거나 클릭 할 수 있습니다 (대부분의 사용자가 마우스를 가져갑니다). 터치 장치에서 요소를 터치하면 요소가 표시되고 다시 터치하면 요소가 삭제됩니다. 물론 이것은 원래 요구 사항과 약간의 타협이지만 최소한 코드는 이제 깨끗합니다. :)

$ ( ". my-popover"). popover ({트리거 : 'click hover'});


0

Matt Lockyer의 코드를 가져 와서 간단한 재설정을 수행하여 dom이 숨어있는 요소로 덮이지 않도록했습니다.

매트의 코드 : http://mattlockyer.com/2013/04/08/close-a-twitter-bootstrap-popover-when-clicking-outside/

피들 : http://jsfiddle.net/mrsmith/Wd2qS/

    $('body').on('click', function (e) {
    //hide popover from dom to prevent covering elements
    $('.popover').css('display', 'none');
    //bring popover back if trigger element is clicked
    $('[data-toggle="popover"]').each(function () {
        if ($(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            $('.popover').css('display', 'block');
        }
    });
    //hide popover with .popover method
    $('[data-toggle="popover"]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            $(this).popover('hide');
        }
    });
});

0

이것을 시도하면 외부를 클릭하여 숨길 수 있습니다.

$('body').on('click', function (e) {
    $('[data-toggle="popover"]').each(function () {
    //the 'is' for buttons that trigger popups
    //the 'has' for icons within a button that triggers a popup
    if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
    $(this).popover('hide');
    }
    });
});

0

다음과 같은 코드를 사용하여 팝 오버 링크를 동적으로 설정했기 때문에 mattdlockyer의 솔루션에 문제가 발생했습니다.

$('body').popover({
        selector : '[rel="popover"]'
});

그래서 그렇게 수정해야했습니다. 그것은 나를 위해 많은 문제를 해결했습니다.

$('html').on('click', function (e) {
  $('[data-toggle="popover"]').each(function () {
    //the 'is' for buttons that trigger popups
    //the 'has' for icons within a button that triggers a popup
    if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
        $(this).popover('destroy');
    }
  });
});

destroy는 요소를 제거하므로 선택기 부분은 팝 오버를 초기화하는 데 중요합니다.

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