Saat ini saya menggunakan popover dengan Twitter Bootstrap, dimulai seperti ini:
$('.popup-marker').popover({
html: true,
trigger: 'manual'
}).click(function(e) {
$(this).popover('toggle');
e.preventDefault();
});
Seperti yang Anda lihat, mereka dipicu secara manual, dan mengklik .popup-marker (yang merupakan div dengan gambar latar belakang) mengaktifkan popover. Ini berfungsi dengan baik, tetapi saya ingin juga dapat menutup popover dengan klik di tempat lain pada halaman (tetapi tidak pada popover itu sendiri!).
Saya sudah mencoba beberapa hal yang berbeda, termasuk yang berikut, tetapi tanpa hasil untuk menunjukkan untuk itu:
$('body').click(function(e) {
$('.popup-marker').popover('hide');
});
Bagaimana saya bisa menutup popover dengan klik di tempat lain pada halaman, tetapi tidak dengan klik pada popover itu sendiri?
javascript
jquery
twitter-bootstrap
Travis Northcutt
sumber
sumber
Jawaban:
Menganggap bahwa hanya satu popover dapat terlihat kapan saja, Anda dapat menggunakan satu set bendera untuk menandai ketika ada popover yang terlihat, dan hanya kemudian menyembunyikannya.
Jika Anda mengatur pendengar acara di badan dokumen, itu akan memicu ketika Anda mengklik elemen yang ditandai dengan 'popup-marker'. Jadi, Anda harus menelepon
stopPropagation()
objek acara. Dan terapkan trik yang sama ketika mengklik popover itu sendiri.Di bawah ini adalah kode JavaScript yang berfungsi yang melakukan ini. Ini menggunakan jQuery> = 1.7
http://jsfiddle.net/AFffL/539/
Satu-satunya peringatan adalah bahwa Anda tidak akan dapat membuka 2 popover secara bersamaan. Tapi saya pikir itu akan membingungkan bagi pengguna :-)
sumber
Ini bahkan lebih mudah:
sumber
html
karenae.stopPropagation();
Alih - alih, saya menggunakan sesuatu seperti$('.popup-marker').on('show', function(event) { $('.popup-marker').filter(function(index, element) { return element != event.target; }).popover('hide'); });
yang melakukan pekerjaan dengan baik juga (tidak tahu apakah ada perbedaan kinerja)$(this).popover('toggle');
bagian. Kemudian, jika Anda memiliki beberapa objek 'popup-marker', mengklik masing-masing akan menutup yang lain.Saya memiliki kebutuhan yang serupa, dan menemukan ekstensi kecil yang luar biasa dari Popover Bootstrap Twitter oleh Lee Carmichael, yang disebut BootstrapX - clickover . Dia juga memiliki beberapa contoh penggunaan di sini . Pada dasarnya itu akan mengubah popover menjadi komponen interaktif yang akan ditutup ketika Anda mengklik di tempat lain pada halaman, atau pada tombol tutup di dalam popover. Ini juga akan memungkinkan beberapa popover terbuka sekaligus dan banyak fitur bagus lainnya.
Plugin dapat ditemukan di sini .
Contoh penggunaan
javascript:
sumber
Solusi yang diterima memberi saya beberapa masalah (mengklik elemen '.popup-marker' pada popover yang terbuka membuat popover tidak berfungsi setelahnya). Saya datang dengan solusi lain ini yang bekerja sempurna untuk saya dan itu cukup sederhana (saya menggunakan Bootstrap 2.3.1):
UPDATE: Kode ini juga berfungsi dengan Bootstrap 3!
sumber
if (!$(e.target).is('.popup-marker') && !$(e.target).parents('.popover').length > 0)
cara itu popup tidak akan menutup bahkan jika itu memiliki konten htmlif (!$(e.target).is('.popup-marker') && $(e.target).closest('.popover').length === 0)
baca "Abaikan klik berikutnya" di sini http://getbootstrap.com/javascript/#popovers
Anda dapat menggunakan pemicu fokus untuk mengabaikan popover pada klik berikutnya, tetapi Anda harus menggunakan
<a>
tag, bukan<button>
tag, dan Anda juga harus menyertakantabindex
atribut ...Contoh:
sumber
tooltip
, meskipun tidak disebutkan secara jelas di dokumen yang sebenarnya.Semua jawaban yang ada cukup lemah, karena mereka mengandalkan menangkap semua peristiwa dokumen kemudian menemukan popover aktif, atau mengubah panggilan ke
.popover()
.Pendekatan yang jauh lebih baik adalah dengan mendengarkan
show.bs.popover
acara di badan dokumen lalu bereaksi sesuai. Di bawah ini adalah kode yang akan menutup popover ketika dokumen diklik atau escditekan, hanya mengikat pendengar acara ketika popover ditampilkan:sumber
$(event.target).data("bs.popover").inState.click = false;
ke fungsi onPopoverHide sehingga Anda tidak perlu mengklik dua kali untuk membuka kembali setelah ditutup.https://github.com/lecar-red/bootstrapx-clickover
Ini adalah ekstensi popover bootstrap twitter dan akan memecahkan masalah dengan sangat sederhana.
sumber
Untuk beberapa alasan tidak ada solusi lain di sini yang berfungsi untuk saya. Namun, setelah banyak pemecahan masalah, akhirnya saya sampai pada metode ini yang berfungsi dengan baik (setidaknya untuk saya).
Dalam kasus saya, saya menambahkan popover ke tabel dan benar-benar memposisikannya di atas / di bawah
td
yang diklik. Pilihan tabel ditangani oleh jQuery-UI Dipilih jadi saya tidak yakin apakah itu mengganggu. Namun setiap kali saya mengklik di dalam popover handler klik saya yang ditargetkan$('.popover')
tidak pernah bekerja dan penanganan acara selalu didelegasikan ke$(html)
penangan klik. Saya cukup baru di JS jadi mungkin saya hanya melewatkan sesuatu?Bagaimanapun saya harap ini membantu seseorang!
sumber
Saya memberikan semua popovers saya jangkar kelas
activate_popover
. Saya mengaktifkan semuanya sekaligus onload$('body').popover({selector: '.activate-popover', html : true, container: 'body'})
agar fungsi klik jauhnya berfungsi, saya menggunakan (dalam skrip kopi):
Yang berfungsi dengan sangat baik dengan bootstrap 2.3.1
sumber
.prev()
pertamaif
. Saya menggunakan Bootstrap 3.2.0.2, mungkin ada perbedaan? Selain itu, Anda bisa mengabaikan seluruhif
klausa kedua jika Anda ingin dapat membuka beberapa pop-up secara bersamaan. Cukup klik di mana saja yang bukan elemen popover-activating (kelas 'activ-popover' dalam contoh ini) untuk menutup semua popover yang terbuka. Bagus sekali!Meskipun ada banyak solusi di sini, saya ingin mengusulkan juga, saya tidak tahu apakah ada solusi di sana yang menyelesaikan semuanya, tetapi saya mencoba 3 dari mereka dan mereka memiliki masalah, seperti mengklik pada popover itu membuatnya bersembunyi, yang lain bahwa jika saya memiliki tombol popover lain diklik keduanya / beberapa popover akan tetap muncul (seperti dalam solusi yang dipilih), Bagaimana pun, yang satu ini memperbaiki semuanya
sumber
Saya akan mengatur fokus ke pop-over yang baru dibuat dan menghapusnya pada blur. Dengan begitu tidak perlu memeriksa elemen DOM mana yang telah diklik dan pop-over dapat diklik, dan dipilih juga: elemen tidak akan kehilangan fokus dan tidak akan hilang.
Kode:
sumber
Inilah solusi yang bekerja sangat baik untuk saya, jika dapat membantu:
sumber
Inilah solusi saya, untuk apa nilainya:
sumber
Saya punya beberapa masalah untuk membuatnya bekerja pada bootstrap 2.3.2. Tetapi saya melakukannya dengan cara ini:
sumber
tweaked @David Wolever solusi sedikit:
sumber
Pertanyaan ini juga ditanyakan di sini dan jawaban saya tidak hanya menyediakan cara untuk memahami metode traversal DOM jQuery tetapi 2 opsi untuk menangani penutupan popover dengan mengklik di luar.
Buka beberapa popover sekaligus atau satu popover sekaligus.
Plus potongan kode kecil ini dapat menangani penutupan tombol yang berisi ikon!
https://stackoverflow.com/a/14857326/1060487
sumber
Yang ini berfungsi seperti mantra dan saya menggunakannya.
Ini akan membuka popover ketika Anda mengklik dan jika Anda mengklik lagi itu akan ditutup, juga jika Anda mengklik di luar popover popover akan ditutup.
Ini juga berfungsi dengan lebih dari 1 popover.
sumber
Solusi lain, itu mencakup masalah yang saya miliki dengan mengklik keturunan popover:
sumber
Saya melakukannya seperti di bawah ini
Semoga ini membantu!
sumber
Jika Anda mencoba menggunakan popover bootstrap twitter dengan pjax, ini berhasil bagi saya:
sumber
@ RayOnAir, saya memiliki masalah yang sama dengan solusi sebelumnya. Saya mendekati solusi @RayOnAir juga. Satu hal yang ditingkatkan adalah tutup popover yang sudah dibuka ketika mengklik penanda popover lainnya. Jadi kode saya adalah:
sumber
Saya menemukan ini menjadi solusi modifikasi dari saran pbaron di atas, karena solusinya mengaktifkan popover ('hide') pada semua elemen dengan kelas 'popup-marker'. Namun, ketika Anda menggunakan popover () untuk konten html alih-alih data-konten, seperti yang saya lakukan di bawah, setiap klik di dalam popup html tersebut sebenarnya mengaktifkan popover ('sembunyikan'), yang segera menutup jendela. Metode di bawah ini mengulangi setiap elemen .popup-marker dan menemukan terlebih dahulu jika induknya terkait dengan id .popup-marker yang diklik, dan jika demikian maka tidak menyembunyikannya. Semua div lainnya disembunyikan ...
sumber
Saya datang dengan ini:
Skenario saya mencakup lebih banyak popover di halaman yang sama, dan menyembunyikannya hanya membuat mereka tidak terlihat dan karena itu, mengklik item di belakang popover itu tidak mungkin. Idenya adalah untuk menandai tautan popover tertentu sebagai 'aktif' dan kemudian Anda cukup 'mengganti' popover aktif. Melakukannya akan menutup popover sepenuhnya.
sumber
Saya mencoba membuat solusi sederhana untuk masalah sederhana. Posting di atas baik tetapi sangat rumit untuk masalah sederhana. Jadi saya membuat hal yang sederhana. Baru saja menambahkan tombol tutup. Sempurna untukku.
sumber
Saya suka ini, sederhana namun efektif ..
sumber
Tambahkan
btn-popover
kelas ke tombol / tautan popover Anda yang membuka popover. Kode ini akan menutup popover ketika mengklik di luarnya.sumber
Solusi yang bahkan lebih mudah, hanya mengulangi semua popover dan bersembunyi jika tidak
this
.sumber
Agar jelas, cukup picu popover
sumber
Ini seharusnya bekerja di Bootstrap 4:
Penjelasan:
sumber
Coba
data-trigger="focus"
alih-alih"click"
.Ini memecahkan masalah bagi saya.
sumber