Ich verwende derzeit Popover mit Twitter Bootstrap, die wie folgt initiiert wurden:
$('.popup-marker').popover({
html: true,
trigger: 'manual'
}).click(function(e) {
$(this).popover('toggle');
e.preventDefault();
});
Wie Sie sehen können, werden sie manuell ausgelöst, und durch Klicken auf .popup-marker (ein Div mit einem Hintergrundbild) wird ein Popover umgeschaltet. Das funktioniert gut, aber ich möchte das Popover auch mit einem Klick an einer anderen Stelle auf der Seite schließen können (aber nicht auf dem Popover selbst!).
Ich habe ein paar verschiedene Dinge ausprobiert, darunter die folgenden, aber keine Ergebnisse zu zeigen:
$('body').click(function(e) {
$('.popup-marker').popover('hide');
});
Wie kann ich das Popover mit einem Klick an einer anderen Stelle auf der Seite schließen, jedoch nicht mit einem Klick auf das Popover selbst?
javascript
jquery
twitter-bootstrap
Travis Northcutt
quelle
quelle
Antworten:
Unter der Annahme, dass immer nur ein Popover sichtbar sein kann, können Sie mithilfe einer Reihe von Flags markieren, wann ein Popover sichtbar ist, und diese erst dann ausblenden.
Wenn Sie den Ereignis-Listener im Dokumentkörper festlegen, wird er ausgelöst, wenn Sie auf das mit 'Popup-Marker' gekennzeichnete Element klicken. Also musst du anrufen
stopPropagation()
das Ereignisobjekt . Wenden Sie denselben Trick an, wenn Sie auf das Popover selbst klicken.Unten finden Sie einen funktionierenden JavaScript-Code, der dies tut. Es verwendet jQuery> = 1.7
http://jsfiddle.net/AFffL/539/
Die einzige Einschränkung ist, dass Sie nicht 2 Popover gleichzeitig öffnen können. Aber ich denke, das wäre für den Benutzer trotzdem verwirrend :-)
quelle
Das ist noch einfacher:
quelle
html
weile.stopPropagation();
ich stattdessen etwas verwendet habe,$('.popup-marker').on('show', function(event) { $('.popup-marker').filter(function(index, element) { return element != event.target; }).popover('hide'); });
das den Job auch gut gemacht hat (ich weiß nicht, ob es einen Leistungsunterschied gibt)$(this).popover('toggle');
Teil. Wenn Sie dann mehrere "Popup-Marker" -Objekte haben, werden durch Klicken auf jedes die anderen geschlossen.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.
Plugin finden Sie hier .
Anwendungsbeispiel
Javascript:
quelle
Die akzeptierte Lösung gab mir einige Probleme (durch Klicken auf das Element '.popup-marker' des geöffneten Popovers funktionierten die Popover danach nicht mehr). Ich habe mir diese andere Lösung ausgedacht, die perfekt für mich funktioniert und recht einfach ist (ich verwende Bootstrap 2.3.1):
UPDATE: Dieser Code funktioniert auch mit Bootstrap 3!
quelle
if (!$(e.target).is('.popup-marker') && !$(e.target).parents('.popover').length > 0)
dass das Popup nicht geschlossen wird, selbst wenn es HTML-Inhalt hatif (!$(e.target).is('.popup-marker') && $(e.target).closest('.popover').length === 0)
Lesen Sie hier "Beim nächsten Klick schließen" http://getbootstrap.com/javascript/#popovers
Sie können den Fokus-Trigger verwenden, um Popover beim nächsten Klick zu schließen. Sie müssen jedoch das
<a>
Tag verwenden, nicht das<button>
Tag, und Sie müssen auch eintabindex
Attribut einfügen ...Beispiel:
quelle
tooltip
, auch wenn es im eigentlichen Dokument nicht eindeutig erwähnt ist.Alle vorhandenen Antworten sind ziemlich schwach, da sie darauf beruhen, alle Dokumentereignisse zu erfassen, dann aktive Popovers zu finden oder den Aufruf von zu ändern
.popover()
.Ein viel besserer Ansatz besteht darin, auf
show.bs.popover
Ereignisse im Hauptteil des Dokuments zu achten und dann entsprechend zu reagieren. Unten finden Sie Code, der Popovers schließt, wenn auf das Dokument geklickt oder escgedrückt wird, und nur Ereignis-Listener bindet, wenn Popover angezeigt werden:quelle
$(event.target).data("bs.popover").inState.click = false;
Fügen Sie die Funktion onPopoverHide hinzu, damit Sie nicht zweimal klicken müssen, um nach dem Schließen erneut zu öffnen.https://github.com/lecar-red/bootstrapx-clickover
Es ist eine Erweiterung von Twitter Bootstrap Popover und wird das Problem sehr einfach lösen.
quelle
Aus irgendeinem Grund hat keine der anderen Lösungen hier für mich funktioniert. Nach vielen Fehlerbehebungen bin ich jedoch endlich zu dieser Methode gekommen, die perfekt funktioniert (zumindest für mich).
In meinem Fall habe ich einer Tabelle ein Popover hinzugefügt und es absolut über / unter dem
td
angeklickten positioniert . Die Tabellenauswahl wurde von jQuery-UI Selectable übernommen, daher bin ich mir nicht sicher, ob dies störend war. Wenn ich jedoch in das Popover klickte, funktionierte mein gezielter Klick-Handler$('.popover')
nie und die Ereignisbehandlung wurde immer an das delegiert$(html)
Click-Handler . Ich bin ziemlich neu bei JS, also vermisse ich vielleicht nur etwas?Wie auch immer, ich hoffe das hilft jemandem!
quelle
Ich gebe allen meinen Popover-Ankern die Klasse
activate_popover
. Ich aktiviere sie alle auf einmal beim Laden$('body').popover({selector: '.activate-popover', html : true, container: 'body'})
Um die Click-Away-Funktion zum Laufen zu bringen, verwende ich (im Kaffeeskript):
Was mit Bootstrap 2.3.1 einwandfrei funktioniert
quelle
.prev()
in der erstenif
Klausel loswerden musste . Ich verwende Bootstrap 3.2.0.2. Vielleicht gibt es einen Unterschied? Sie können auch einfach die gesamte zweiteif
Klausel weglassen, wenn Sie möchten, dass mehrere Popups gleichzeitig geöffnet sind. Klicken Sie einfach auf eine beliebige Stelle, die kein Popover-aktivierendes Element ist (in diesem Beispiel die Klasse 'Popover aktivieren'), um alle geöffneten Popover zu schließen. Funktioniert super!Obwohl es hier viele Lösungen gibt, möchte ich auch meine vorschlagen. Ich weiß nicht, ob es dort oben eine Lösung gibt, die alles löst, aber ich habe 3 davon ausprobiert und sie hatten Probleme, wie das Klicken Auf dem Popover wird es selbst ausgeblendet, andere, die, wenn ich auf andere Popover-Schaltflächen geklickt hätte, beide / mehrere Popover immer noch angezeigt würden (wie in der ausgewählten Lösung). Wie auch immer, dieser hat alles behoben
quelle
Ich würde den Fokus auf das neu erstellte Popup setzen und es bei Unschärfe entfernen. Auf diese Weise muss nicht überprüft werden, auf welches Element des DOM geklickt wurde, und das Popup kann angeklickt und auch ausgewählt werden: Es verliert nicht den Fokus und verschwindet nicht.
Der Code:
quelle
Hier ist die Lösung, die für mich sehr gut funktioniert hat, wenn sie helfen kann:
quelle
Hier ist meine Lösung für das, was es wert ist:
quelle
Ich hatte ein Problem damit, dass es auf Bootstrap 2.3.2 funktioniert. Aber ich habe es so geschoben:
quelle
@David Wolever-Lösung leicht optimiert:
quelle
Diese Frage wurde auch hier gestellt und meine Antwort bietet nicht nur eine Möglichkeit, die jQuery DOM-Traversal-Methoden zu verstehen, sondern auch zwei Optionen zum Behandeln des Schließens von Popovers durch Klicken nach außen.
Öffnen Sie mehrere Popover gleichzeitig oder jeweils ein Popover.
Außerdem können diese kleinen Codefragmente das Schließen von Schaltflächen mit Symbolen übernehmen!
https://stackoverflow.com/a/14857326/1060487
quelle
Dieser funktioniert wie ein Zauber und ich benutze ihn.
Es öffnet das Popover, wenn Sie klicken, und wenn Sie erneut klicken, wird es geschlossen. Auch wenn Sie außerhalb des Popovers klicken, wird das Popover geschlossen.
Dies funktioniert auch mit mehr als 1 Popover.
quelle
Eine andere Lösung, die das Problem abdeckte, das ich beim Klicken auf Nachkommen des Popovers hatte:
quelle
Ich mache es wie unten
Hoffe das hilft!
quelle
Wenn Sie versuchen, Twitter Bootstrap Popover mit pjax zu verwenden, hat dies für mich funktioniert:
quelle
@ RayOnAir, ich habe das gleiche Problem mit früheren Lösungen. Ich komme auch der @ RayOnAir-Lösung nahe. Eine Sache, die verbessert wurde, ist das Schließen eines bereits geöffneten Popovers, wenn Sie auf einen anderen Popover-Marker klicken. Mein Code lautet also:
quelle
Ich fand, dass dies eine modifizierte Lösung des obigen Vorschlags von pbaron ist, da seine Lösung das Popover ('hide') für alle Elemente mit der Klasse 'popup-marker' aktiviert hat. Wenn Sie jedoch popover () für HTML-Inhalte anstelle von Dateninhalten verwenden, wie unten beschrieben, aktivieren alle Klicks in diesem HTML-Popup tatsächlich das Popover ('hide'), wodurch das Fenster sofort geschlossen wird. Diese Methode unten durchläuft jedes .popup-marker-Element und ermittelt zuerst, ob das übergeordnete Element mit der angeklickten .popup-marker-ID zusammenhängt, und wenn ja, wird es nicht ausgeblendet. Alle anderen Divs sind versteckt ...
quelle
Ich habe mir das 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.
quelle
Ich habe versucht, eine einfache Lösung für ein einfaches Problem zu finden. Die obigen Beiträge sind gut, aber für ein einfaches Problem so kompliziert. Also habe ich eine einfache Sache gemacht. Ich habe gerade eine Schaltfläche zum Schließen hinzugefügt. Es ist perfekt für mich.
quelle
Ich mag das, einfach und doch effektiv.
quelle
Fügen Sie
btn-popover
Ihrer Popover-Schaltfläche / Ihrem Popover-Link eine Klasse hinzu, die das Popover öffnet. Dieser Code schließt die Popover, wenn Sie außerhalb klicken.quelle
Eine noch einfachere Lösung: Durchlaufen Sie einfach alle Popover und verstecken Sie sie, wenn nicht
this
.quelle
Um klar zu sein, lösen Sie einfach das Popover aus
quelle
Dies sollte in Bootstrap 4 funktionieren:
Erläuterung:
quelle
Versuchen Sie
data-trigger="focus"
statt"click"
.Dies löste das Problem für mich.
quelle