Jak mogę zamknąć wyskakujące okienko Twittera za pomocą kliknięcia z dowolnego miejsca (innego) na stronie?

Obecnie używam popovers z Twitter Bootstrap, zainicjowany TAK:

$('.popup-marker').popover({
        html: true,
        trigger: 'manual'
    }).click(function(e) {
        $(this).popover('toggle');
        e.preventDefault();
    });

Jak widać, są uruchamiane ręcznie i klikają .popup-znacznik (który jest div z obrazkiem tła) włącza wyskakujące okienko. To działa świetnie, ale chciałbym również być w stanie zamknąć popover za pomocą kliknięcia gdziekolwiek indziej na stronie (ale nie na samym popover!).

Próbowałem kilku różnych rzeczy, w tym następujących, ale bez rezultatów, aby pokazać dla it:

$('body').click(function(e) {
    $('.popup-marker').popover('hide');
});

Jak mogę zamknąć wyskakujące okienko kliknięciem gdziekolwiek indziej na stronie, ale nie kliknięciem samego wyskakującego okienka?

Author: Travis Northcutt, 2012-01-21

30 answers

Zakładając, że tylko jedno okienko może być widoczne w dowolnym momencie, możesz użyć zestawu flag, aby zaznaczyć, gdy jest widoczne okienko, a dopiero potem je ukryć.

Jeśli ustawisz detektor zdarzeń na korpusie dokumentu, zostanie on uruchomiony po kliknięciu elementu oznaczonego 'popup-marker'. Więc będziesz musiał wywołać stopPropagation() na obiekcie event. I zastosuj tę samą sztuczkę, klikając na wyskakujące okienko.

Poniżej znajduje się działający kod JavaScript, który to robi. Używa jQuery >= 1.7

jQuery(function() {
    var isVisible = false;

    var hideAllPopovers = function() {
       $('.popup-marker').each(function() {
            $(this).popover('hide');
        });  
    };

    $('.popup-marker').popover({
        html: true,
        trigger: 'manual'
    }).on('click', function(e) {
        // if any other popovers are visible, hide them
        if(isVisible) {
            hideAllPopovers();
        }

        $(this).popover('show');

        // handle clicking on the popover itself
        $('.popover').off('click').on('click', function(e) {
            e.stopPropagation(); // prevent event for bubbling up => will not get caught with document.onclick
        });

        isVisible = true;
        e.stopPropagation();
    });


    $(document).on('click', function(e) {
        hideAllPopovers();
        isVisible = false;
    });
});

Http://jsfiddle.net/AFffL/539/

Jedynym zastrzeżeniem jest to, że nie będziesz w stanie otworzyć 2 popoverów w tym samym czasie. Ale myślę, że i tak byłoby to mylące dla użytkownika: -)

 96
Author: Radu Cugut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 17:15:25

To jest jeszcze łatwiejsze:

$('html').click(function(e) {
    $('.popup-marker').popover('hide');
});

$('.popup-marker').popover({
    html: true,
    trigger: 'manual'
}).click(function(e) {
    $(this).popover('toggle');
    e.stopPropagation();
});
 70
Author: prbaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 16:11:07

Miałem podobną potrzebę i znalazłem towielkie, małe rozszerzenie Popover na Twitterze autorstwa Lee Carmichaela, o nazwie BootstrapX - clickover . Ma również kilka przykładów użycia TUTAJ . Zasadniczo zmieni wyskakujące okienko w interaktywny komponent, który zostanie zamknięty po kliknięciu w innym miejscu na stronie lub przycisku zamykania w wyskakującym okienku. Pozwoli to również na otwarcie wielu popoverów naraz i kilka innych fajnych funkcji.

Wtyczkę można znaleźć tutaj .

Przykład użycia

<button rel="clickover" data-content="Show something here. 
    <button data-dismiss='clickover'
    >Close Clickover</button>"
>Show clickover</button>

Javascript:

// load click overs using 'rel' attribute
$('[rel="clickover"]').clickover();
 48
Author: Miika L.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-11 07:59:19

Przyjęte rozwiązanie dało mi pewne problemy (klikając na '.popup-znacznik' element otwartego popowera sprawiał, że popowery nie działały później). Wymyśliłem inne rozwiązanie, które działa dla mnie idealnie i jest dość proste (używam Bootstrap 2.3.1): {]}

$('.popup-marker').popover({
    html: true,
    trigger: 'manual'
}).click(function(e) {
    $('.popup-marker').not(this).popover('hide');
    $(this).popover('toggle');
});
$(document).click(function(e) {
    if (!$(e.target).is('.popup-marker, .popover-title, .popover-content')) {
        $('.popup-marker').popover('hide');
    }
});

Aktualizacja: ten kod działa również z Bootstrap 3!

 37
Author: RayOnAir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-09 15:50:48

Czytaj " Odrzuć przy następnym kliknięciu" tutaj http://getbootstrap.com/javascript/#popovers

Możesz użyć wyzwalacza ostrości, aby odrzucić wyskakujące okienka przy następnym kliknięciu, ale musisz użyć znacznika <a>, a nie znacznika <button>, a także musisz dołączyć atrybut tabindex...

Przykład:

<a href="#" tabindex="0" class="btn btn-lg btn-danger"
  data-toggle="popover" data-trigger="focus" title="Dismissible popover"
  data-content="And here's some amazing content. It's very engaging. Right?">
  Dismissible popover
</a>
 18
Author: Andrej Sramko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-24 08:45:16

Wszystkie istniejące odpowiedzi są dość słabe, ponieważ polegają na przechwytywaniu wszystkich zdarzeń dokumentu, a następnie znajdowaniu aktywnych popoverów lub modyfikowaniu wywołania do .popover().

Znacznie lepszym podejściem jest odsłuchiwanie show.bs.popover zdarzeń na ciele dokumentu, a następnie odpowiednie reagowanie. Poniżej znajduje się kod, który zamknie wyskakujące okienka po kliknięciu dokumentu lub naciśnięciu esc , tylko wiążące nasłuchy zdarzeń, gdy pojawią się wyskakujące okienka:

function closePopoversOnDocumentEvents() {
  var visiblePopovers = [];

  var $body = $("body");

  function hideVisiblePopovers() {
    $.each(visiblePopovers, function() {
      $(this).popover("hide");
    });
  }

  function onBodyClick(event) {
    if (event.isDefaultPrevented())
      return;

    var $target = $(event.target);
    if ($target.data("bs.popover"))
      return;

    if ($target.parents(".popover").length)
      return;

    hideVisiblePopovers();
  }

  function onBodyKeyup(event) {
    if (event.isDefaultPrevented())
      return;

    if (event.keyCode != 27) // esc
      return;

    hideVisiblePopovers();
    event.preventDefault();
  }

  function onPopoverShow(event) {
    if (!visiblePopovers.length) {
      $body.on("click", onBodyClick);
      $body.on("keyup", onBodyKeyup);
    }
    visiblePopovers.push(event.target);
  }

  function onPopoverHide(event) {
    var target = event.target;
    var index = visiblePopovers.indexOf(target);
    if (index > -1) {
      visiblePopovers.splice(index, 1);
    }
    if (visiblePopovers.length == 0) {
      $body.off("click", onBodyClick);
      $body.off("keyup", onBodyKeyup);
    }
  }

  $body.on("show.bs.popover", onPopoverShow);
  $body.on("hide.bs.popover", onPopoverHide);
}
 7
Author: David Wolever,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-08 22:22:21

Https://github.com/lecar-red/bootstrapx-clickover

Jest to rozszerzenie Twitter Bootstrap popover i rozwiąże problem bardzo prosto.

 5
Author: Ibrahim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-01 17:58:43

Z jakiegoś powodu żadne z innych rozwiązań tutaj nie działało dla mnie. Jednak po wielu problemach, w końcu doszedłem do tej metody, która działa doskonale (przynajmniej dla mnie).

$('html').click(function(e) {
  if( !$(e.target).parents().hasClass('popover') ) {
    $('#popover_parent').popover('destroy');
  }
});

W moim przypadku dodawałem popover do tabeli i absolutnie pozycjonowałem ją powyżej / poniżej td, który został kliknięty. Wybór tabeli był obsługiwany przez jQuery-UI Selectable więc nie jestem pewien, czy to przeszkadzało. Jednak za każdym razem, gdy kliknąłem w wyskakującym oknie, Mój program obsługi kliknięć, który celował $('.popover') nigdy nie działało, a obsługa zdarzeń była zawsze delegowana do obsługi kliknięć $(html). Jestem całkiem nowy w JS, więc może coś mi umyka?

W każdym razie mam nadzieję, że to komuś pomoże!

 2
Author: moollaza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-06 03:45:59

Daję wszystkim moim popowersom klasę activate_popover. Aktywuję je wszystkie na raz onload

$('body').popover({selector: '.activate-popover', html : true, container: 'body'})

Aby uruchomić funkcjonalność click away używam (w skrypcie coffee):

$(document).on('click', (e) ->
  clickedOnActivate = ($(e.target).parents().hasClass("activate-popover") || $(e.target).hasClass("activate-popover"))
  clickedAway = !($(e.target).parents().hasClass("popover") || $(e.target).hasClass("popover"))
if clickedAway && !clickedOnActivate
  $(".popover.in").prev().popover('hide')
if clickedOnActivate 
  $(".popover.in").prev().each () ->
    if !$(this).is($(e.target).closest('.activate-popover'))
      $(this).popover('hide')
)

Który działa doskonale z bootstrap 2.3.1

 2
Author: Bert-Jan Steerneman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-09 14:33:15

Mimo, że jest tu wiele rozwiązań, chciałbym zaproponować również moje, Nie wiem, czy istnieje jakieś rozwiązanie, które rozwiązuje to wszystko, ale próbowałem 3 z nich i mieli problemy, takie jak kliknięcie w wyskakujące samo powoduje ukrycie, Inne, że gdybym miał inny przycisk wyskakujący kliknął oba / wiele wyskakujących nadal pojawiłoby się (jak w wybranym rozwiązaniu), jak kiedykolwiek, Ten naprawił to wszystko

var curr_popover_btn = null;
// Hide popovers function
function hide_popovers(e)
{
    var container = $(".popover.in");
    if (!container.is(e.target) // if the target of the click isn't the container...
        && container.has(e.target).length === 0) // ... nor a descendant of the container
    {
        if( curr_popover_btn != null )
        {
            $(curr_popover_btn).popover('hide');
            curr_popover_btn = null;
        }
        container.hide();
    }
}
// Hide popovers when out of focus
$('html').click(function(e) {
    hide_popovers(e);
});
$('.popover-marker').popover({
    trigger: 'manual'
}).click(function(e) {
    hide_popovers(e);
    var $popover_btns = $('.popover-marker');
    curr_popover_btn = this;
    var $other_popover_btns = jQuery.grep($($popover_btns), function(popover_btn){
                return ( popover_btn !== curr_popover_btn );
            });
    $($other_popover_btns).popover('hide');
    $(this).popover('toggle');
    e.stopPropagation();
});
 2
Author: Roshdy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-16 21:47:23

Oto rozwiązanie, które działało bardzo dobrze dla mnie, jeśli może pomóc:

/**
* Add the equals method to the jquery objects
*/
$.fn.equals = function(compareTo) {
  if (!compareTo || this.length !== compareTo.length) {
    return false;
  }
  for (var i = 0; i < this.length; ++i) {
    if (this[i] !== compareTo[i]) {
      return false;
    }
  }
  return true;
};

/**
 * Activate popover message for all concerned fields
 */
var popoverOpened = null;
$(function() { 
    $('span.btn').popover();
    $('span.btn').unbind("click");
    $('span.btn').bind("click", function(e) {
        e.stopPropagation();
        if($(this).equals(popoverOpened)) return;
        if(popoverOpened !== null) {
            popoverOpened.popover("hide");            
        }
        $(this).popover('show');
        popoverOpened = $(this);
        e.preventDefault();
    });

    $(document).click(function(e) {
        if(popoverOpened !== null) {
            popoverOpened.popover("hide");   
            popoverOpened = null;
        }        
    });
});
 1
Author: Gilles Hemmerlé,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-09 10:34:41

Oto moje rozwiązanie, jeśli to coś warte:

// Listen for clicks or touches on the page
$("html").on("click.popover.data-api touchend.popover.data-api", function(e) {

  // Loop through each popover on the page
  $("[data-toggle=popover]").each(function() {

    // Hide this popover if it's visible and if the user clicked outside of it
    if ($(this).next('div.popover:visible').length && $(".popover").has(e.target).length === 0) {
      $(this).popover("hide");
    }

  });
});
 1
Author: nates,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-01 21:59:19

Miałem problem z uruchomieniem bootstrap 2.3.2. Ale ja tak:

$(function () {
  $(document).mouseup(function (e) {
        if(($('.popover').length > 0) && !$(e.target).hasClass('popInfo')) {
            $('.popover').each(function(){
                $(this).prev('.popInfo').popover('hide');
            });
        }
    });

    $('.popInfo').popover({
        trigger: 'click',
        html: true
    });
});
 1
Author: oBo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 13:44:03

@David Wolever rozwiązanie lekko:

function closePopoversOnDocumentEvents() {
  var visiblePopovers = [];

  var $body = $("body");

  function hideVisiblePopovers() {
    /* this was giving problems and had a bit of overhead
      $.each(visiblePopovers, function() {
        $(this).popover("hide");
      });
    */
    while (visiblePopovers.length !== 0) {
       $(visiblePopovers.pop()).popover("hide");
    }
  }

  function onBodyClick(event) {
    if (event.isDefaultPrevented())
      return;

    var $target = $(event.target);
    if ($target.data("bs.popover"))
      return;

    if ($target.parents(".popover").length)
      return;

    hideVisiblePopovers();
  }

  function onBodyKeyup(event) {
    if (event.isDefaultPrevented())
      return;

    if (event.keyCode != 27) // esc
      return;

    hideVisiblePopovers();
    event.preventDefault();
  }

  function onPopoverShow(event) {
    if (!visiblePopovers.length) {
      $body.on("click", onBodyClick);
      $body.on("keyup", onBodyKeyup);
    }
    visiblePopovers.push(event.target);
  }

  function onPopoverHide(event) {
    var target = event.target;
    var index = visiblePopovers.indexOf(target);
    if (index > -1) {
      visiblePopovers.splice(index, 1);
    }
    if (visiblePopovers.length == 0) {
      $body.off("click", onBodyClick);
      $body.off("keyup", onBodyKeyup);
    }
  }

  $body.on("show.bs.popover", onPopoverShow);
  $body.on("hide.bs.popover", onPopoverHide);
}
 1
Author: Lee Gary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-25 08:41:55

To pytanie zostało również zadane tutaj i moja odpowiedź zapewnia nie tylko sposób na zrozumienie metod jQuery DOM, ale 2 opcje obsługi zamykania popowerów przez kliknięcie na zewnątrz.

Otwórz wiele okienek naraz lub jedno okienko na raz.

Plus te małe fragmenty kodu mogą obsługiwać zamykanie przycisków zawierających ikony!

Https://stackoverflow.com/a/14857326/1060487

 1
Author: mattdlockyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:55

Ten działa jak czar, a ja go używam.

Otworzy wyskakujące po kliknięciu i jeśli klikniesz ponownie, zamknie się, również jeśli klikniesz poza wyskakującym, wyskakujące zostanie zamknięte.

To również działa z więcej niż 1 popover.

    function hideAllPopovers(){
    $('[data-toggle="popover"]').each(function() {
        if ($(this).data("showing") == "true"){
            $(this).data("showing", "false");
            $(this).popover('hide');                
        }
    });
}
$('[data-toggle="popover"]').each(function() {
        $(this).popover({
            html: true,
            trigger: 'manual'
        }).click(function(e) {
            if ($(this).data("showing") !=  "true"){
                hideAllPopovers();
                $(this).data("showing", "true");
                $(this).popover('show');
            }else{
                hideAllPopovers();
            }
            e.stopPropagation();
        });
});

$(document).click(function(e) {
    hideAllPopovers();
});
 1
Author: Patrick Nogueira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-12 15:35:57

Ustawiłbym ostrość na nowo utworzony pop-over i usunąłbym go przy rozmyciu. W ten sposób nie trzeba sprawdzać, który element DOM został kliknięty, a wyskakujące okienko można kliknąć, a także wybrać: nie straci ostrości i nie zniknie.

Kod:

    $('.popup-marker').popover({
       html: true,
       trigger: 'manual'
    }).click(function(e) {
       $(this).popover('toggle');
       // set the focus on the popover itself 
       jQuery(".popover").attr("tabindex",-1).focus();
       e.preventDefault();
    });

    // live event, will delete the popover by clicking any part of the page
    $('body').on('blur','.popover',function(){
       $('.popup-marker').popover('hide');
    });
 1
Author: Luca Vizzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-24 18:15:34

Robię to jak poniżej

$("a[rel=popover]").click(function(event){
    if(event.which == 1)
    {   
        $thisPopOver = $(this);
        $thisPopOver.popover('toggle');
        $thisPopOver.parent("li").click(function(event){
            event.stopPropagation();
            $("html").click(function(){
                $thisPopOver.popover('hide');
            });
        });
    }
});
Mam nadzieję, że to pomoże!
 0
Author: foxybagga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-13 12:34:42

Jeśli próbujesz użyć twitter Bootstrap popover z pjax, to zadziałało dla mnie:

App.Utils.Popover = {

  enableAll: function() {
    $('.pk-popover').popover(
      {
        trigger: 'click',
        html : true,
        container: 'body',
        placement: 'right',
      }
    );
  },

  bindDocumentClickEvent: function(documentObj) {
    $(documentObj).click(function(event) {
      if( !$(event.target).hasClass('pk-popover') ) {
        $('.pk-popover').popover('hide');
      }
    });
  }

};

$(document).on('ready pjax:end', function() {
  App.Utils.Popover.enableAll();
  App.Utils.Popover.bindDocumentClickEvent(this);
});
 0
Author: keruilin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-16 02:36:46

@RayOnAir, mam ten sam problem z wcześniejszymi rozwiązaniami. Ja też zbliżam się do @rayonair solution. Jedną z rzeczy, które się poprawiły, jest zamknięcie już otwartego popover po kliknięciu innego znacznika popover. Więc mój kod to:

var clicked_popover_marker = null;
var popover_marker = '#pricing i';

$(popover_marker).popover({
  html: true,
  trigger: 'manual'
}).click(function (e) {
  clicked_popover_marker = this;

  $(popover_marker).not(clicked_popover_marker).popover('hide');
  $(clicked_popover_marker).popover('toggle');
});

$(document).click(function (e) {
  if (e.target != clicked_popover_marker) {
    $(popover_marker).popover('hide');
    clicked_popover_marker = null;
  }
});
 0
Author: msa7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-08 10:52:59

Uznałem to za zmodyfikowane rozwiązanie powyższej sugestii pbarona, ponieważ jego rozwiązanie aktywowało popover ('hide') na wszystkich elementach z klasą'popup-marker'. Jednak, gdy używasz popover () dla zawartości html zamiast danych-zawartości, jak robię poniżej, wszelkie kliknięcia wewnątrz tego wyskakującego okna html faktycznie aktywują popover ('hide'), co natychmiast zamyka okno. Ta metoda jest następująca dla każdej z nich .popup - element znacznika i odkrywa najpierw, czy rodzic jest związany z .popup-identyfikator znacznika, który został kliknięty, a jeśli tak, to nie ukrywa go. Wszystkie inne divy są ukryte...

        $(function(){
            $('html').click(function(e) {
                // this is my departure from pbaron's code above
                // $('.popup-marker').popover('hide');
                $('.popup-marker').each(function() {
                    if ($(e.target).parents().children('.popup-marker').attr('id')!=($(this).attr('id'))) {
                        $(this).popover('hide');
                    }
                });
            });

            $('.popup-marker').popover({
                html: true,
                // this is where I'm setting the html for content from a nearby hidden div with id="html-"+clicked_div_id
                content: function() { return $('#html-'+$(this).attr('id')).html(); },
                trigger: 'manual'
            }).click(function(e) {
                $(this).popover('toggle');
                e.stopPropagation();
            });
        });
 0
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-03 22:08:19

Wymyśliłem to:

Mój scenariusz zawierał więcej popowerów na tej samej stronie, a ich ukrywanie sprawiało, że były niewidoczne i dlatego klikanie na przedmioty za popowerem nie było możliwe. Chodzi o to, aby oznaczyć konkretne wyskakujące łącze jako "aktywne", a następnie możesz po prostu "przełączyć" aktywne wyskakujące łącze. Spowoduje to całkowite zamknięcie popover.

$('.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"
 0
Author: Adi Nistor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-01 10:53:47

Starałem się zrobić proste rozwiązanie dla prostego problemu. Powyższe posty są dobre, ale tak skomplikowane dla prostego problemu. Więc zrobiłem prostą rzecz. Właśnie dodałem przycisk zamykania. Jest idealny dla mnie.

            $(".popover-link").click(function(){
                $(".mypopover").hide();
                $(this).parent().find(".mypopover").show();
        })
        $('.close').click(function(){
    $(this).parents('.mypopover').css('display','none');
});



          <div class="popover-content">
        <i class="fa fa-times close"></i>
    <h3 class="popover-title">Title here</h3>
your other content here
        </div>


   .popover-content {
    position:relative;
    }
    .close {
        position:absolute;
        color:#CCC;
        right:5px;
        top:5px;
        cursor:pointer;
    }
 0
Author: Mohammad Kashif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-20 21:28:41

Podoba mi się to, proste, ale skuteczne..

var openPopup;

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

    }
    openPopup=this;
});
 0
Author: gstarr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-19 19:04:00

Dodaj btn-popover klasę do przycisku/linku wyskakującego, który otwiera wyskakujące okienko. Ten kod zamknie wyskakujące okienka po kliknięciu na zewnątrz.

$('body').on('click', function(event) {
  if (!$(event.target).closest('.btn-popover, .popover').length) {
    $('.popover').popover('hide');
  }
});
 0
Author: Tobias Mühl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 11:48:10

Jeszcze łatwiejsze rozwiązanie, wystarczy przejrzeć wszystkie wyskakujące okienka i ukryć, jeśli nie this.

$(document).on('click', '.popup-marker', function() {
    $(this).popover('toggle')
})

$(document).bind('click touchstart', function(e) {
    var target = $(e.target)[0];
    $('.popup-marker').each(function () {
        // hide any open popovers except for the one we've clicked
        if (!$(this).is(target)) {
            $(this).popover('hide');
        }
    });
});
 0
Author: inostia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-15 22:56:58
$('.popForm').popover();

$('.conteneurPopForm').on("click",".fermePopover",function(){
    $(".popForm").trigger("click");
});

Aby było jasne, po prostu uruchom popover

 0
Author: poete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 14:49:01

Inne rozwiązanie, obejmowało problem, który miałem z kliknięciem w wyskakujące okienko:

$(document).mouseup(function (e) {
    // The target is not popover or popover descendants
    if (!$(".popover").is(e.target) && 0 === $(".popover").has(e.target).length) {
        $("[data-toggle=popover]").popover('hide');
    }
});
 0
Author: Fernando Caraballo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 11:40:14

Spróbuj data-trigger="focus" zamiast "click".

To rozwiązało problem.
 -1
Author: Hannes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-07 12:08:25
jQuery(':not(.popup-marker)').once().click(function(){
   jQuery('.popup-marker').hide(); 
});
 -3
Author: everconfusedGuy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-13 04:04:01