Wie kann ich ein Twitter Bootstrap-Popover schließen, indem ich nach außen klicke?


289

Können wir Popovers dazu bringen, auf die gleiche Weise wie Modals entlassen zu werden, d. H. sie schließen, wenn der Benutzer irgendwo außerhalb von ihnen klickt?

Leider kann ich nicht einfach echtes Modal anstelle von Popover verwenden, da Modal Position bedeutet: fest und das wäre kein Popover mehr. :((



Versuchen Sie dies auf stackoverflow.com/a/40661543/5823517 . Es geht nicht darum, die Eltern zu durchlaufen
Tunn

data-trigger="hover"und data-trigger="focus"sind eine integrierte Alternative zum Schließen des Popovers, wenn Sie den Toggle nicht verwenden möchten. Meiner Meinung nach data-trigger="hover"bietet die beste Benutzererfahrung ... es besteht keine Notwendigkeit, zusätzlichen .js-Code zu schreiben ...
Hooman Bahreini

Antworten:


461

Update: Eine etwas robustere Lösung: http://jsfiddle.net/mattdlockyer/C5GBU/72/

Für Schaltflächen, die nur Text enthalten:

$('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');
    }
});

Für Schaltflächen mit Symbolen verwenden (dieser Code hat einen Fehler in Bootstrap 3.3.6, siehe den Fix unten in dieser Antwort)

$('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');
        }
    });

Für JS-generierte Popover Verwenden Sie '[data-original-title]'anstelle von'[data-toggle="popover"]'

Vorsichtsmaßnahme: Mit der obigen Lösung können mehrere Popover gleichzeitig geöffnet werden.

Ein Popover nach dem anderen bitte:

Update: Bootstrap 3.0.x, siehe Code oder Geige 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');
        }
    });
});

Dies behandelt das Schließen von Popovers, die bereits geöffnet und nicht angeklickt sind oder deren Links nicht angeklickt wurden.


Update: Bootstrap 3.3.6, siehe Geige

Behebt ein Problem, bei dem nach dem Schließen 2 Klicks zum erneuten Öffnen erforderlich sind

$(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
        }

    });
});

Update: Unter der Bedingung der vorherigen Verbesserung wurde diese Lösung erreicht. Beheben Sie das Problem von Doppelklick und Ghost Popover:

$(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
Ich hänge an $(document)statt $('body')da manchmal bodyerstreckt sich das nicht über die gesamte Seite.
Jasop

6
Nach dem Aktivieren des Popovers (und der anschließenden Aktion zum Ausblenden) wird das Popover nicht vollständig ausgeblendet. es ist einfach nicht sichtbar. Das Problem ist, dass Inhalte unter dem unsichtbaren, aber vorhandenen Popover nicht angeklickt oder bewegt werden können. Problem tritt auf neuesten Chrome Build, neuesten Bootstrap 3 .js (könnte auch andere Browser sein, konnte nicht überprüft werden, da diese
Problemumgehung

6
Anstatt '[data-toggle="popover"]', was nicht mit JavaScript generierten Popovers funktioniert, habe ich '[data-original-title]'als Selektor verwendet.
Nathan

4
Weiß jemand, warum diese Lösung mit der neuesten Version von Bootstrap nicht funktioniert? Folgendes geschieht: Klicken Sie auf die Schaltfläche, um das Popover anzuzeigen, und klicken Sie dann auf den Text, um das Popover zu schließen. Klicken Sie dann auf die Schaltfläche, um das Popover anzuzeigen, und das Popover wird nicht angezeigt. Nachdem es einmal fehlgeschlagen ist, wird es angezeigt, wenn Sie erneut darauf klicken. Es ist sehr seltsam.
JTunney

3
@JTunney Ich verwende BS 3.3.6 und sehe immer noch dieses Verhalten, bei dem zwei Klicks erforderlich sind, um ein Popoever zu öffnen, nachdem eines geschlossen wurde.
Sersun

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

Dadurch werden alle Popovers geschlossen, wenn Sie auf eine beliebige Stelle außer auf ein Popover klicken

UPDATE für Bootstrap 4.1

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

Ich habe der Schaltfläche eine Klasse hinzugefügt, die das Popover (pop-btn) auslöst, damit es nicht enthalten ist ... if (! $ (E.target) .closest ('. Popover'). Length &&! $ (E. Ziel) .closest ('. btn'). hasClass ('pop-btn'))
Mozgras

2
Mit 3 Popover-Schaltflächen macht dieser Code Probleme. In einigen Fällen kann ich nicht auf die Schaltfläche klicken und die Schaltflächen blinken.
OpenCode

1
Dieser Code funktioniert nicht ... Überprüfen Sie diese Geige und fügen Sie Ihrer Antwort eine Geige hinzu. jsfiddle.net/C5GBU/102
mattdlockyer

Perfekt für mich. Andere Antworten hatten Nebenwirkungen, als mein "Klicken von außen" ein neues Popover öffnete.
Facio Ratio

Dies funktioniert hervorragend, muss jedoch angepasst werden können, damit es nicht geschlossen wird, wenn Sie auf den Inhalt des Popovers klicken. zB wenn Sie auf Text in einem <b> -Tag im Popover klicken ...
Ben in CA

40

Die einfachste und ausfallsicherste Version funktioniert mit jeder Bootstrap-Version.

Demo: http://jsfiddle.net/guya/24mmM/

Demo 2: Nicht schließen, wenn Sie in den Popover-Inhalt klicken http://jsfiddle.net/guya/fjZja/

Demo 3: Mehrere Popover: http://jsfiddle.net/guya/6YCjW/


Durch einfaches Aufrufen dieser Leitung werden alle Popover geschlossen:

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

Schließen Sie alle Popover, wenn Sie mit diesem Code nach draußen klicken:

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

Das obige Snippet fügt dem Körper ein Klickereignis hinzu. Wenn der Benutzer auf ein Popover klickt, verhält es sich wie gewohnt. Wenn der Benutzer auf etwas klickt, das kein Popover ist, werden alle Popover geschlossen.

Es funktioniert auch mit Popovers, die mit Javascript initiiert wurden, im Gegensatz zu einigen anderen Beispielen, die nicht funktionieren. (siehe Demo)

Wenn Sie beim Klicken in den Popover-Inhalt nicht schließen möchten, verwenden Sie diesen Code (siehe Link zur 2. Demo):

$('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
Hatte ein ähnliches Problem und dies funktionierte in Bootstrap 3.
wsams

Wenn Sie die Popover näher heranbringen, sodass sich die Popover überlappen, funktioniert einer der Links nicht mehr, wenn Sie ein Popover durch Klicken auf eine beliebige Stelle außerhalb verbergen. Überprüfen Sie: jsfiddle.net/qjcuyksb/1
Sandeep Giri

1
Die letzte Version funktioniert nicht, wenn Bootstrap-Datepicker im Popover verwendet wird.
Dbinott

1
Ich mochte diese Lösung am besten, weil die akzeptierte Antwort mit etwa 30 Popups ein bisschen wie ein Ressourcenfresser wurde
David G

1
Vielleicht !$(e.target).closest('.popover.in').lengthwäre effizienter als !$(e.target).parents().is('.popover.in').
Joeytwiddle

19

Mit Bootstrap 2.3.2 können Sie den Trigger auf "Fokus" setzen und es funktioniert einfach:

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

1
+1, aber wichtige Randnotiz: Dadurch wird das Popover nicht geschlossen, wenn Sie erneut auf die Schaltfläche oder den Anker klicken, während die akzeptierte Antwort dies tut.
Christian Gollhardt

18

Dies ist im Grunde nicht sehr komplex, aber es gibt einige Überprüfungen, um Störungen zu vermeiden.

Demo (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
Dies
schließt

Ist es möglich, dies mit einem popover()Klick zu tun, anstatt mit dem Mauszeiger darüber zu fahren?
Zaki Aziz

3
Natürlich, aber müssen Sie rufen Sie stopPropagation()über das Ereignis an den Click - Handler übergeben (wenn nicht, das Versteck verstecken Handler sofort den popover). Demo (jsfiddle)
Sherbrow

Ich habe die gleiche Funktionalität unten in weit weniger Code. Diese Antwort ist aufgebläht und ein bisschen lächerlich für die Frage ... Alles, was er will, ist, Popover zu schließen, wenn Sie nach draußen klicken ... Das ist übertrieben und hässlich!
Mattdlockyer

2
Korrektur, ich glaube, ich habe BESSERE Funktionalität in weit weniger Code. Es wird davon ausgegangen, dass jeweils nur ein Popup angezeigt werden soll. Wenn Ihnen das gefällt, stimmen Sie bitte meiner Antwort unten zu: jsfiddle.net/P3qRK/1 Antwort: stackoverflow.com/a/14857326/1060487
mattdlockyer

16

Keine der vermeintlich hochstimmigen Lösungen hat bei mir richtig funktioniert. Jedes führt zu einem Fehler, wenn das Popover nach dem ersten Öffnen und Schließen (durch Klicken auf andere Elemente) zum ersten Mal wieder geöffnet wird, bis Sie zwei erstellen Klicks auf den auslösenden Link anstatt auf einen machen.

Also habe ich es leicht modifiziert:

$(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
Schön, es funktioniert bei mir. Übrigens hast du vergessen a); am Ende Ihres Codes nach dem letzten}
Merlin

1
Hatte das gleiche Problem im Zusammenhang mit dem zweiten Klick. Dies sollte die ausfallsichere Antwort sein!
Felipe Leão

Ich habe auch die vorherigen Lösungen ausprobiert, aber als Leitfaden für diejenigen, die ab 2016 auch nach einer Lösung suchen, ist dies eine bessere Lösung.
Dariru

Top-Antwort, funktioniert wie angegeben. wie bereits erwähnt, taten andere dies nicht. Dies sollte die beste Antwort sein
Duggi

Funktioniert einwandfrei, außer dass ich data-toggel = "popover" nicht verwendet habe. Sie können jedoch einen beliebigen Selektor angeben, der Ihren Popover-Triggerelementen entspricht. Gute Lösung und die einzige, die das Zwei-Klick-Problem für mich gelöst hat.
Schock_gone_wild

11

Ich habe eine jsfiddle gemacht, um dir zu zeigen, wie es geht:

http://jsfiddle.net/3yHTH/

Die Idee ist, das Popover anzuzeigen, wenn Sie auf die Schaltfläche klicken, und das Popover auszublenden, wenn Sie außerhalb der Schaltfläche klicken.

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');
});

schöne Demo. Ich frage mich, wie Sie Popover für das Jquery-Objekt aufrufen können. Popover ist ein Bootstrap-JS-Plugin, aber Sie fügen dort keine Bootstrap-JS-Datei hinzu.
Bingjie2680

In der jsfiddle befindet sich eine js-Datei. Schauen Sie sich die linke Spalte an -> Ressourcen verwalten.
Pigueiras

Ok, ich sehe, es gibt einen Bootstrap js. aber es ist nicht geprüft, es funktioniert immer noch?
Bingjie2680

Ja es funktioniert. Wie auch immer, ich habe in Google gesucht: jsfiddle bootstrapund es gab mir das Skelett von Bootstrap CSS + JS in JSfiddle.
Pigueiras

2
Mein einziges Problem dabei ist, dass Sie das Popover ausblenden, wenn Sie darauf klicken. Sie können auch einfach einen Tooltip verwenden.
NoBrainer

7

Fügen Sie dieses Attribut einfach dem Element hinzu

data-trigger="focus"

Anfangs funktionierte dies bei Bootstrap 3.3.7 nicht, aber dann las ich die Dokumente und sie haben einige Anleitungen, die hier eine Erwähnung wert sind. Aus dem Popover-Beispiel "Abweisbar" in den Dokumenten "Für ein korrektes browser- und plattformübergreifendes Verhalten müssen Sie das <a> -Tag und nicht das <button> -Tag verwenden und außerdem die Attribute role =" button "und tabindex angeben . "
Jeff

3

Dies wurde vor gefragt hier . Die gleiche Antwort, die ich damals gegeben habe, gilt immer noch:

Ich hatte ein ähnliches Bedürfnis und fand diese tolle kleine Erweiterung des Twitter Bootstrap Popover von Lee Carmichael namens BootstrapX - Clickover . Er hat hier auch einige Anwendungsbeispiele . Grundsätzlich wird das Popover in eine interaktive Komponente umgewandelt, die geschlossen wird, wenn Sie auf eine andere Stelle auf der Seite oder auf eine Schaltfläche zum Schließen innerhalb des Popovers klicken. Dies ermöglicht auch das gleichzeitige Öffnen mehrerer Popover und eine Reihe weiterer nützlicher Funktionen.


3

Das ist spät zur Party ... aber ich dachte, ich würde es teilen. Ich liebe das Popover, aber es hat so wenig eingebaute Funktionalität. Ich habe eine Bootstrap-Erweiterung .bubble () geschrieben, die genau das ist, was Popover sein soll. Vier Möglichkeiten zu entlassen. Klicken Sie nach draußen, schalten Sie den Link um, klicken Sie auf das X und drücken Sie die Esc-Taste.

Es wird automatisch positioniert, sodass es nie von der Seite verschwindet.

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

Dies ist keine unentgeltliche Eigenwerbung ... Ich habe so oft in meinem Leben den Code anderer Leute gepackt, dass ich meine eigenen Anstrengungen anbieten wollte. Probieren Sie es aus und sehen Sie, ob es für Sie funktioniert.


3

Laut http://getbootstrap.com/javascript/#popovers ,

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

Verwenden Sie den Fokus-Trigger, um Popover beim nächsten Klick des Benutzers zu schließen.

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

2
Funktioniert nicht in Mac-Browsern, die dem systemeigenen Verhalten von OS X folgen (die beim Klicken weder fokussieren noch Schaltflächen verwischen). Dazu gehören Firefox und Safari. Bootstrap-Leute haben hier einen großen Fehler gemacht, da diese Popover nicht einmal geöffnet oder gar entlassen werden können.
Ante Vrli

2
@AnteVrli Vielleicht war dies noch nicht in der Dokumentation enthalten, als Sie Ihren Kommentar geschrieben haben, aber jetzt heißt es in den Dokumenten: "Für ein korrektes browser- und plattformübergreifendes Verhalten müssen Sie das <a>Tag verwenden, nicht das <button>Tag, und Sie müssen auch das role="button"und einschließen tabindexAttribute. " Haben Sie es mit diesen Spezifikationen versucht?
Louis

3
Nun, es gibt ein Problem mit dieser Antwort, das nichts mit der Plattformkompatibilität zu tun hat: Durch Drücken einer Maustaste in einem Popover wird das Popover geschlossen, da das Element, das das Popover auslöst, den Fokus verliert. Vergessen Sie, dass Benutzer Popovers kopieren und einfügen können: Sobald Sie die Maustaste gedrückt halten, wird das Popover geschlossen. Wenn das Popover umsetzbare Elemente enthält (Schaltflächen, Links), können Benutzer diese nicht verwenden.
Louis

Soviel zu 'plattformübergreifend', weil ich in Bootstrap 4.0.0-Beta und 4.0.0-Beta.2 dies nicht für Mac in Chrome zum Laufen bringen kann :(
rmcsharry

3

Modifizierte akzeptierte Lösung. Was ich erlebt habe war, dass einige Popover, nachdem sie ausgeblendet wurden, zweimal angeklickt werden mussten, um wieder angezeigt zu werden. Folgendes habe ich getan, um sicherzustellen, dass Popover ('hide') nicht für bereits versteckte Popover aufgerufen wird.

$('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

Diese Lösung funktioniert gut:

$("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

Sie können auch Ereignisblasen verwenden, um das Popup aus dem DOM zu entfernen. Es ist ein bisschen schmutzig, funktioniert aber gut.

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

Fügen Sie in Ihrem HTML-Code die .popover-close-Klasse zum Inhalt des Popovers hinzu, der das Popover schließen soll.


2

Es scheint, dass die Methode 'hide' nicht funktioniert, wenn Sie das Popover mit Selektordelegation erstellen. Stattdessen muss 'destroy' verwendet werden.

Ich habe es so gemacht:

$('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 hier


2

Wir fanden heraus, dass wir ein Problem mit der Lösung von @mattdlockyer hatten (danke für die Lösung!). Wenn Sie die Selector-Eigenschaft für den Popover-Konstruktor wie folgt verwenden ...

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

... die vorgeschlagene Lösung für BS3 wird nicht funktionieren. Stattdessen wird eine zweite lokale Popover-Instanz erstellt $(this). Hier ist unsere Lösung, um dies zu verhindern:

$(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();
        }
    });
});

Wie bereits erwähnt, $(this).popover('hide');wird aufgrund des delegierten Listeners eine zweite Instanz erstellt. Die bereitgestellte Lösung verbirgt nur Popovers, die bereits instanziiert sind.

Ich hoffe ich konnte euch etwas Zeit sparen.


2

Bootstrap unterstützt dies nativ :

JS Bin Demo

Spezifisches Markup für das Schließen beim nächsten Klicken erforderlich

Für ein korrektes browser- und plattformübergreifendes Verhalten müssen Sie das <a>Tag und nicht das <button>Tag verwenden und die Attribute role="button"und einschließen tabindex.


In Bootstrap 4.0.0-Beta und 4.0.0-Beta.2 kann ich dies nicht auf Mac in Chrome zum
Laufen bringen

Wenn Sie auf eine beliebige Stelle klicken, wird dieses Popover geschlossen. Der Fragesteller benötigt "Klicken außerhalb des Popovers, um es zu schließen", was anders ist.
Philw

2

Diese Lösung beseitigt den lästigen zweiten Klick, wenn das Popover zum zweiten Mal angezeigt wird

getestet mit mit 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

Ich habe viele der vorherigen Antworten ausprobiert, wirklich nichts funktioniert für mich, aber diese Lösung hat:

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

Sie empfehlen, das Ankertag nicht die Schaltfläche zu verwenden und sich um die Attribute role = "button" + data-trigger = "focus" + tabindex = "0" zu kümmern.

Ex:

<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>

Versuchen Sie auch diese Referenz: stackoverflow.com/questions/20466903/…
Ahmed El Damasy

1

Ich habe mir Folgendes ausgedacht: Mein Szenario enthielt mehr Popover auf derselben Seite, und das Ausblenden machte sie nur unsichtbar. Aus diesem Grund war es nicht möglich, auf Elemente hinter dem Popover zu klicken. Die Idee ist, den spezifischen Popover-Link als "aktiv" zu markieren und dann können Sie den aktiven Popover einfach "umschalten". Dadurch wird das Popover vollständig geschlossen. $ ('. 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

Ich entferne einfach andere aktive Popover, bevor das neue Popover angezeigt wird (Bootstrap 3):

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

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

1

getestet mit 3.3.6 und zweiter Klick ist ok

        $('[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

Demo: 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;
});

}}

Das ist meine Lösung dafür.


0

Dieser Ansatz stellt sicher, dass Sie ein Popover schließen können, indem Sie auf eine beliebige Stelle auf der Seite klicken. Wenn Sie auf eine andere anklickbare Entität klicken, werden alle anderen Popover ausgeblendet. Die Animation: false ist erforderlich, andernfalls wird in Ihrer Konsole der Fehler jquery .remove angezeigt.

$('.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, dies ist mein erster Versuch, tatsächlich etwas über den Stapelüberlauf zu beantworten. Hier geht also nichts: P.

Es scheint nicht ganz klar zu sein, dass diese Funktionalität auf dem neuesten Bootstrap sofort funktioniert (na ja, wenn Sie bereit sind, Kompromisse einzugehen, wo die der Benutzer klicken kann. Ich bin mir nicht sicher, ob Sie klicken müssen Bewegen Sie den Mauszeiger per se, aber auf einem iPad funktioniert das Klicken als Umschalter.

Das Endergebnis ist, dass Sie auf einem Desktop den Mauszeiger bewegen oder klicken können (die meisten Benutzer bewegen den Mauszeiger). Wenn Sie auf einem Touch-Gerät das Element berühren, wird es aufgerufen, und wenn Sie es erneut berühren, wird es heruntergenommen. Natürlich ist dies ein kleiner Kompromiss gegenüber Ihrer ursprünglichen Anforderung, aber zumindest ist Ihr Code jetzt sauberer :)

$ (". my-popover"). popover ({trigger: 'click hover'});


0

Ich habe Matt Lockyers Code genommen und einen einfachen Reset durchgeführt, damit der Dom nicht durch das versteckte Element abgedeckt wird.

Matts Code: http://mattlockyer.com/2013/04/08/close-a-twitter-bootstrap-popover-when-clicking-outside/

Geige: 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

Versuchen Sie dies, dies wird ausgeblendet, indem Sie nach draußen klicken.

$('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

Ich hatte Probleme mit der Lösung von mattdlockyer, weil ich Popover-Links dynamisch mit Code wie dem folgenden eingerichtet habe:

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

Also musste ich es so modifizieren. Es hat viele Probleme für mich behoben:

$('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');
    }
  });
});

Denken Sie daran, dass durch Zerstören das Element entfernt wird. Daher ist der Auswahlteil beim Initialisieren der Popovers wichtig.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.