Obecnie używam popoverów w Twitter Bootstrap, zainicjowanych w ten sposób:
$('.popup-marker').popover({
html: true,
trigger: 'manual'
}).click(function(e) {
$(this).popover('toggle');
e.preventDefault();
});
Jak widać, są uruchamiane ręcznie, a kliknięcie .popup-marker (który jest elementem div z obrazem w tle) włącza okienko. To działa świetnie, ale chciałbym również móc zamknąć popover jednym kliknięciem w dowolnym innym miejscu na stronie (ale nie w samym popover!).
Wypróbowałem kilka różnych rzeczy, w tym poniższe, ale bez wyników do wyświetlenia:
$('body').click(function(e) {
$('.popup-marker').popover('hide');
});
Jak zamknąć okno popover jednym kliknięciem w dowolnym innym miejscu strony, ale nie jednym kliknięciem samego okna popover?
javascript
jquery
twitter-bootstrap
Travis Northcutt
źródło
źródło
Odpowiedzi:
Zakładając, że tylko jedno okno popover może być widoczne w dowolnym momencie, możesz użyć zestawu flag, aby zaznaczyć, kiedy widoczne jest popover, a dopiero potem je ukryć.
Jeśli ustawisz detektor zdarzeń w treści dokumentu, będzie on uruchamiany po kliknięciu elementu oznaczonego „popup-marker”. Musisz więc wywołać
stopPropagation()
obiekt zdarzenia. I zastosuj tę samą sztuczkę, klikając sam popover.Poniżej znajduje się działający kod JavaScript, który to robi. Używa jQuery> = 1.7
http://jsfiddle.net/AFffL/539/
Jedynym zastrzeżeniem jest to, że nie będziesz w stanie otworzyć dwóch okien popover w tym samym czasie. Ale myślę, że to i tak byłoby mylące dla użytkownika :-)
źródło
To jest jeszcze łatwiejsze:
źródło
html
ponieważe.stopPropagation();
Zamiast tego użyłem czegoś takiego,$('.popup-marker').on('show', function(event) { $('.popup-marker').filter(function(index, element) { return element != event.target; }).popover('hide'); });
co również wykonało pracę (nie wiem, czy jest różnica w wydajności)$(this).popover('toggle');
częścią Następnie, jeśli masz wiele obiektów „popup-marker”, klikając każdy z nich będzie zamknięcie innych..Miałem podobną potrzebę i znalazłem to świetne, małe rozszerzenie Twitter Bootstrap Popover autorstwa Lee Carmichaela, o nazwie BootstrapX - clickover . Ma też kilka przykładów wykorzystania tutaj . Zasadniczo zmieni popover w interaktywny komponent, który zamknie się po kliknięciu w innym miejscu strony lub na przycisku zamykania w wyskakującym okienku. Pozwoli to również na jednoczesne otwarcie wielu okien popover i kilka innych fajnych funkcji.
Wtyczkę można znaleźć tutaj .
Przykład użycia
javascript:
źródło
Zaakceptowane rozwiązanie przyniosło mi pewne problemy (kliknięcie elementu „.popup-marker” w otwartym oknie popover sprawiło, że popover przestał działać). Wymyśliłem inne rozwiązanie, które działa idealnie dla mnie i jest dość proste (używam Bootstrap 2.3.1):
UPDATE: Ten kod działa również z Bootstrap 3!
źródło
if (!$(e.target).is('.popup-marker') && !$(e.target).parents('.popover').length > 0)
ten sposób, wyskakujące okienko nie zamknie się, nawet jeśli ma zawartość HTMLif (!$(e.target).is('.popup-marker') && $(e.target).closest('.popover').length === 0)
przeczytaj „Zamknij po następnym kliknięciu” tutaj http://getbootstrap.com/javascript/#popovers
Możesz użyć aktywatora fokusu, aby odrzucić wyskakujące okienka przy następnym kliknięciu, ale musisz użyć
<a>
tagu, a nie<button>
tagu, a także musisz dołączyćtabindex
atrybut ...Przykład:
źródło
tooltip
, nawet jeśli nie jest to wyraźnie wymienione w rzeczywistym dokumencie.Wszystkie istniejące odpowiedzi są dość słabe, ponieważ polegają na przechwytywaniu wszystkich zdarzeń w dokumencie, a następnie znajdowaniu aktywnych okien popover lub modyfikowaniu wywołania
.popover()
.Znacznie lepszym podejściem jest nasłuchiwanie
show.bs.popover
wydarzeń w treści dokumentu, a następnie odpowiednia reakcja. Poniżej znajduje się kod, który zamyka wyskakujące okienka po kliknięciu lub escnaciśnięciu dokumentu, tylko wiążące nasłuchiwania zdarzeń, gdy wyświetlane są wyskakujące okienka:źródło
$(event.target).data("bs.popover").inState.click = false;
do funkcji onPopoverHide, aby nie trzeba było dwukrotnie klikać, aby ponownie otworzyć po zamknięciu.https://github.com/lecar-red/bootstrapx-clickover
Jest to rozszerzenie popovera bootstrap na Twitterze i rozwiąże problem w bardzo prosty sposób.
źródło
Z jakiegoś powodu żadne inne rozwiązanie tutaj nie zadziałało. Jednak po wielu rozwiązywaniu problemów w końcu dotarłem do tej metody, która działa idealnie (przynajmniej dla mnie).
W moim przypadku dodawałem popover do tabeli i ustawiałem go absolutnie powyżej / poniżej tego,
td
co zostało kliknięte. 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 wewnątrz popover, mój program obsługi kliknięcia, który był ukierunkowany,$('.popover')
nigdy nie działał, a obsługa zdarzenia była zawsze delegowana do modułu$(html)
obsługi kliknięcia. Jestem całkiem nowy w JS, więc może po prostu czegoś mi brakuje?W każdym razie mam nadzieję, że to komuś pomoże!
źródło
Daję wszystkim moim kotwicom popover klasę
activate_popover
. Włączam je wszystkie na raz onload$('body').popover({selector: '.activate-popover', html : true, container: 'body'})
aby funkcja Click away działała, której używam (w skrypcie kawy):
Co działa doskonale z bootstrapem 2.3.1
źródło
.prev()
w pierwszejif
klauzuli. Używam Bootstrap 3.2.0.2, może jest jakaś różnica? Możesz też po prostu pominąć całą drugąif
klauzulę, jeśli chcesz mieć możliwość jednoczesnego otwierania wielu wyskakujących okienek. Po prostu kliknij w dowolnym miejscu, które nie jest elementem aktywującym okienko popover (w tym przykładzie klasa „aktywuj-popover”), aby zamknąć wszystkie otwarte okna popover. Działa świetnie!Chociaż jest tu wiele rozwiązań, chciałbym również zaproponować moje, nie wiem, czy jest tam jakieś rozwiązanie, które rozwiązuje wszystko, ale wypróbowałem 3 z nich i mieli problemy, takie jak klikanie w wyskakującym okienku sam się ukrywa, inne, że gdybym miał inny przycisk popover, kliknął oba / wiele okienek popover, nadal pojawiałyby się (tak jak w wybranym rozwiązaniu), Jednak ten naprawił to wszystko
źródło
Skupiłbym się na nowo utworzonym wyskakującym okienku i usunąłem go w przypadku rozmycia. Dzięki temu nie trzeba sprawdzać, który element DOM został kliknięty, a pop-over można kliknąć, a także zaznaczyć: nie straci on swojej aktywności i nie zniknie.
Kod:
źródło
Oto rozwiązanie, które zadziałało dla mnie bardzo dobrze, jeśli może pomóc:
źródło
Oto moje rozwiązanie, jakie jest warte:
źródło
Miałem problem z uruchomieniem go na bootstrap 2.3.2. Ale zrobiłem to w ten sposób:
źródło
nieznacznie poprawiono rozwiązanie @David Wolever:
źródło
To pytanie również zostało tutaj zadane, a moja odpowiedź dostarcza nie tylko sposobu na zrozumienie metod przechodzenia przez jQuery DOM, ale także 2 opcje obsługi zamykania okien popover przez kliknięcie na zewnątrz.
Otwieraj wiele okien podręcznych jednocześnie lub jedno okno podręczne na raz.
Dodatkowo te małe fragmenty kodu mogą obsługiwać zamykanie przycisków zawierających ikony!
https://stackoverflow.com/a/14857326/1060487
źródło
Ten działa jak urok i używam go.
Otworzy popover po kliknięciu, a jeśli klikniesz ponownie, zamknie się, również jeśli klikniesz poza popover, popover zostanie zamknięty.
Działa to również z więcej niż 1 popover.
źródło
Inne rozwiązanie, obejmowało problem, który miałem z klikaniem potomków popover:
źródło
Robię to jak poniżej
Mam nadzieję że to pomoże!
źródło
Jeśli próbujesz użyć wyskakującego okienka bootstrap na Twitterze z pjaxem, to zadziałało:
źródło
@RayOnAir, mam ten sam problem z poprzednimi rozwiązaniami. Zbliżam się również do rozwiązania @RayOnAir. Jedną z ulepszeń jest zamykanie już otwartego okna popover po kliknięciu innego znacznika. Więc mój kod to:
źródło
Okazało się, że jest to zmodyfikowane rozwiązanie powyższej sugestii pbarona, ponieważ jego rozwiązanie aktywowało popover („ukryj”) na wszystkich elementach z klasą „popup-marker”. Jednakże, gdy używasz popover () do treści html zamiast danych-content, jak robię to poniżej, wszelkie kliknięcia wewnątrz tego wyskakującego okienka HTML faktycznie aktywują wyskakujące okienko („ukryj”), które natychmiast zamyka okno. Poniższa metoda iteruje przez każdy element .popup-marker i najpierw odkrywa, czy element nadrzędny jest powiązany z identyfikatorem klikniętego znacznika .popup-markera, a jeśli tak, to go nie ukrywa. Wszystkie inne elementy DIV są ukryte ...
źródło
Wymyśliłem to:
Mój scenariusz obejmował więcej wyskakujących okienek na tej samej stronie i ukrycie ich po prostu sprawiło, że stały się niewidoczne iz tego powodu klikanie elementów za wyskakującym okienkiem nie było możliwe. Chodzi o to, aby oznaczyć określony link popover jako „aktywny”, a następnie po prostu „przełączyć” aktywny popover. Spowoduje to całkowite zamknięcie popover.
źródło
Próbowałem znaleźć proste rozwiązanie prostego problemu. Powyższe posty są dobre, ale tak skomplikowane, jak na prosty problem. Zrobiłem więc prostą rzecz. Właśnie dodałem przycisk zamykania. To dla mnie idealne.
źródło
Podoba mi się to, proste, ale skuteczne ...
źródło
Dodaj
btn-popover
klasę do przycisku / linku popover, który otwiera okienko. Ten kod zamknie wyskakujące okienka po kliknięciu poza nim.źródło
Jeszcze łatwiejsze rozwiązanie, po prostu przejrzyj wszystkie wyskakujące okienka i ukryj, jeśli nie
this
.źródło
Aby było jasne, po prostu uruchom popover
źródło
To powinno działać w Bootstrap 4:
Wyjaśnienie:
źródło
Spróbuj
data-trigger="focus"
zamiast"click"
.To rozwiązało problem.
źródło