Dışarıya tıklayarak bir Twitter Bootstrap popover'ı nasıl kapatabilirim?


290

Popoverlerin modals ile aynı şekilde görevden alınmasını sağlayabilir miyiz, yani. kullanıcı dışında bir yere tıkladığında onları kapatır mısın?

Ne yazık ki popover yerine sadece gerçek modal kullanamıyorum, çünkü modal pozisyon anlamına gelir: sabit ve artık popover olmaz. :(



Bu stackoverflow.com/a/40661543/5823517 deneyin . Ebeveynler arasında döngü
kurmayı

data-trigger="hover"ve data-trigger="focus"geçiş yapmak istemiyorsanız, popover'ı kapatmak için yerleşik bir alternatiftir. Bence data-trigger="hover"en iyi kullanıcı deneyimini sağlıyor ... ekstra .js kodu yazmaya gerek yok ...
Hooman Bahreini

Yanıtlar:


461

Güncelleme: Biraz daha sağlam bir çözüm: http://jsfiddle.net/mattdlockyer/C5GBU/72/

Yalnızca metin içeren düğmeler için:

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

Simgeleri içeren düğmeler için (bu kod Bootstrap 3.3.6'da bir hata içeriyorsa , bu yanıtta aşağıdaki düzeltmeye bakın)

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

JS Popovers Oluşturulan için kullanın '[data-original-title]'yerine'[data-toggle="popover"]'

Uyarı: Yukarıdaki çözüm, birden fazla poposun aynı anda açılmasına izin verir.

Bir seferde bir popover lütfen:

Güncelleme: Bootstrap 3.0.x, kod veya keman bakın 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');
        }
    });
});

Bu, zaten açık olan ve tıklanmayan popover'ların kapanmasını veya bağlantılarının tıklanmadığını ele alır.


Güncelleme: Bootstrap 3.3.6, keman

Kapandıktan sonra yeniden açmak için 2 tıklama alması sorunu giderildi

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

    });
});

Güncelleme: Önceki iyileştirmenin koşullarını kullanarak bu çözüme ulaşıldı. Çift tıklama ve hayalet popover sorununu giderin:

$(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
Bazen sayfanın tamamını genişletmediği için $(document)yerine ekliyorum . $('body')body
jasop

6
Popover'ı (ve sonraki gizleme eylemini) etkinleştirdikten sonra, popover tamamen gizlenmez; sadece görünür değil. Sorun, görünmez ancak mevcut popover'ın altındaki içeriğin tıklanamaması veya üzerine gelememesi. Sorun en son Chrome derlemesinde, en son bootstrap 3 .js'de ortaya çıkıyor (diğer tarayıcılar da olabilir, bu geçici çözüm zaten gerekli olduğundan kontrol etmek için rahatsız
edilemedi

6
'[data-toggle="popover"]'JavaScript tarafından oluşturulan popovers ile çalışmayan yerine '[data-original-title]', seçici olarak kullandım .
Nathan

4
Bu çözümün neden bootstrap'ın en son sürümüyle çalışmadığını bilen var mı? Aşağıdakiler gerçekleşiyor: Popover'ı göstermek için düğmesine tıklayın, popover'ı kapatmak için gövdeye tıklayın, sonra popover'ı göstermek için düğmesine tıklayın ve popover gösterilmiyor. Bir kez başarısız olduktan sonra tekrar tıklarsanız gösterir. Bu çok garip.
JTunney

3
@JTunney BS 3.3.6 çalıştırıyorum ve hala bir davranış reddetti sonra bir popoever açmak için iki tıklama gerektirir bu davranış görüyorum.
sersun

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

Bir popover dışında herhangi bir yeri tıklarsanız tüm popovers kapanır

Bootstrap 4.1 için GÜNCELLEME

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

Düğmeye popover'ı (pop-btn) tetikleyen bir sınıf ekledim, bu yüzden dahil edilmez ... if (! $ (E.target) .closest ('. Popover'). Uzunluk &&! $ (E. hedef) .closest ('. btn'). hasClass ('pop-btn'))
mozgras

2
3 popover düğmesi ile bu kod sorun çıkarır. bazı durumlarda düğmeye basamıyorum ve düğmeler yanıp sönüyor.
OpenCode

1
Bu kodun çalışması mümkün değil ... bu kemanı kontrol edin ve lütfen cevabınıza bir keman ekleyin. jsfiddle.net/C5GBU/102
mattdlockyer 18:14

Benim için mükemmel. Diğer yanıtlar yeni bir popover açmak için "dış tıklama" oldu yan etkileri oldu.
Facio Ratio

Bu harika çalışıyor, ancak popover içeriğini tıklarsanız kapanmaması için bunu uyarlamanın bir yolu olması gerekir. örneğin, popover içindeki bir <b> etiketinin içindeki metne tıklarsanız ...
Ben

40

En basit, en başarısız güvenli sürüm , herhangi bir bootstrap sürümü ile çalışır.

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

Demo 2: Popover içeriğinin içini tıklarken reddetmemek http://jsfiddle.net/guya/fjZja/

Demo 3: Birden çok popover: http://jsfiddle.net/guya/6YCjW/


Bu hattı çağırmak tüm popovers'ları yok edecek:

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

Bu kodla dışarıya tıkladığınızda tüm popovers'ları yoksay:

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

Yukarıdaki snippet, gövdeye bir tıklama etkinliği ekler. Kullanıcı bir popover'ı tıkladığında normal şekilde davranır. Kullanıcı popover olmayan bir şeye tıkladığında tüm popovers kapanacaktır.

Ayrıca, çalışmayacak diğer bazı örneklerin aksine, Javascript ile başlatılan popoverlarla da çalışacaktır. (demoya bakınız)

Popover içeriğinin içini tıklarken reddetmek istemiyorsanız, bu kodu kullanın (2. demo bağlantısına bakın):

$('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
Benzer bir sorun vardı ve bu Bootstrap 3'te çalıştı.
wsams

Popovers'ı popovers çakışacak şekilde yaklaştırırsanız, dışarıda bir yere tıklayarak bir popover gizlediğinizde bağlantılardan biri çalışmayı durdurur. Kontrol: jsfiddle.net/qjcuyksb/1
Sandeep Giri

1
Popover'da bootstrap-datepicker kullanılırken son sürüm çalışmaz.
dbinott

1
Bu çözümü en çok sevdim, çünkü kabul edilen cevap 30 kadar pop-up'la bir kaynak domuzu olmaya başladı
David G

1
Belki !$(e.target).closest('.popover.in').lengthbundan daha etkili olur !$(e.target).parents().is('.popover.in').
joeytwiddle

19

Bootstrap 2.3.2 ile tetiği 'odaklama' olarak ayarlayabilirsiniz ve sadece çalışır:

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

1
+1, ancak önemli bir not: Kabul edilen yanıt yanıtlanırken düğmeyi veya bağlantıyı tekrar tıklarsanız popover kapatılmaz.
Christian Gollhardt

18

Bu temelde çok karmaşık değil, ancak aksaklıklardan kaçınmak için bazı kontroller var.

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
Bu, dışarıda değil her yerde tıklayarak modal işten
çıkarıyor

popover()Fareyle üzerine gelmek yerine bir tıklamayla bunu yapmak mümkün müdür ?
Zaki Aziz

3
Tabii ki, ancak stopPropagation()tıklama işleyicisine geçen olayı çağırmanız gerekir (eğer değilse, gizleme işleyicisi hemen popover'ı gizler). Demo (jsfiddle)
Sherbrow

Ben aynı işlevselliği aşağıda çok daha az kod var. Bu cevap şişirilmiş ve soru için biraz saçma ... Tek istediği dışarıya tıkladığınızda popovers kapatmaktır ... Bu aşırı ve Çirkin!
mattdlockyer

2
Düzeltme, daha az kodda daha iyi bir işleve sahip olduğuna inanıyorum. Her seferinde yalnızca bir pop-up'ın görünmesini istediğinizi varsayar. Bunu beğendiyseniz lütfen aşağıdaki cevabımı oylayın : jsfiddle.net/P3qRK/1 cevap: stackoverflow.com/a/14857326/1060487
mattdlockyer

17

Sözde yüksek oy alan çözümlerin hiçbiri benim için doğru sonuç vermedi. Her biri, popover'ı ilk kez açıp kapattıktan sonra (diğer öğeleri tıklatarak) bir hataya neden olur, siz tetikleyici bağlantıya bir yerine iki tıklama yapana kadar tekrar açılmaz .

Bu yüzden biraz değiştirdim:

$(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
Güzel, benim için çalışıyor. BTW unuttuğunuz a); sondan sonra kodunuzun sonunda}
Merlin

1
İkinci tıklama ile ilgili aynı problem vardı. Bu güvenli bir cevap olmalı!
Felipe Leão

Yukarıdaki çözümleri de denedim, ancak 2016'dan beri çözüm arayanlara rehberlik etmek için bu daha iyi bir çözüm.
dariru

üst cevap, reklamı gibi çalışır. belirtildiği gibi, diğerleri yapmadı. bu en iyi cevap olmalı
duggi

Veri-toggel = "popover" kullanmadım dışında mükemmel çalışır. Ancak popover tetikleyici öğelerinizle eşleşen herhangi bir seçici belirtebilirsiniz. Güzel çözüm ve benim için iki tıklama sorunu çözen tek.
shock_gone_wild

11

Size nasıl yapılacağını göstermek için bir jsfiddle yaptım:

http://jsfiddle.net/3yHTH/

Fikir, düğmeyi tıkladığınızda popover'ı göstermek ve düğmenin dışını tıkladığınızda popover'ı gizlemektir.

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

güzel demo. Jquery nesnesinde popover nasıl çağırabileceğini merak ediyorum, popover bir bootstrap js eklentisidir, ancak orada herhangi bir bootstrap js dosyası içermiyor musunuz?
bingjie2680

Jsfiddle içinde bir js dosyası var. Soldaki sütuna bakın -> Kaynakları yönet.
Pigueiras

Tamam, bir bootstrap js olduğunu görüyorum. ama işaretli değil, hala çalışıyor mu?
bingjie2680

Evet çalışıyor. Her neyse, google'da aradım: jsfiddle bootstrapve bana jsfiddle'da bootstrap css + js iskeletini verdi.
Pigueiras

2
Bu benim tek sorunum tıkladığında popover gizlemek olmasıdır. Sadece bir araç ipucu da kullanabilir.
NoBrainer

7

bu özelliği öğeyle birlikte eklemeniz yeterlidir

data-trigger="focus"

Başlangıçta bu benim için Bootstrap 3.3.7 ile işe yaramadı ama sonra belgeleri okudum ve burada bahsetmeye değer bazı rehberlikleri var. "Düzgün tarayıcılar arası ve platformlar arası davranışlar için <button> etiketini değil <a> etiketini kullanmanız ve ayrıca role =" button "ve tabindex niteliklerini de eklemeniz gerekir. ."
Jeff

3

Bu daha önce burada sorulmuştu . Verdiğim aynı cevap hala geçerli:

Benzer bir ihtiyacım vardı ve Lee Carmichael'ın BootstrapX - clickover adlı Twitter Bootstrap Popover'ın bu küçük uzantısını buldum . Burada da bazı kullanım örnekleri var . Temel olarak, popover'ı sayfanın başka bir yerine veya popover içindeki bir kapat düğmesine tıkladığınızda kapanacak etkileşimli bir bileşene dönüştürür. Bu aynı zamanda birden fazla poposun aynı anda açılmasına ve diğer birçok güzel özelliğe izin verecektir.


3

Bu partiye geç kaldı ... ama paylaşacağımı düşündüm. Popover'ı seviyorum ama çok az yerleşik işlevselliğe sahip. Popover olmasını istediğim her şey olan bir bootstrap uzantısı .bubble () yazdım. İşten çıkarmanın dört yolu. Dışarıya tıklayın, bağlantıya geçin, X'e tıklayın ve kaçışa basın.

Hiçbir zaman sayfadan çıkmaması için otomatik olarak konumlandırılır.

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

Bu zahmetli bir öz tanıtım değil ... Hayatımda birçok kez başkalarının kodlarını aldım, kendi çabalarımı sunmak istedim. Bir koşuşturma verin ve sizin için işe yarayıp yaramadığını görün.


3

Göre http://getbootstrap.com/javascript/#popovers ,

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

Kullanıcının bir sonraki tıklamasında popo'ları kapatmak için odak tetikleyicisini kullanın.

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

2
OS X yerel davranışını izleyen Mac tarayıcılarda çalışmaz (bu, tıklatmada odaklanmayan veya düğmeleri bulanıklaştırmaz). Bunlara Firefox ve Safari dahildir. Bootstrap çocuklar burada büyük bir hata yaptı, çünkü bu popolar açılmayacak olsalar bile açılamazlar.
Ante Vrli

2
Yorumunuzu yazarken @AnteVrli Belki bu belgelerde henüz değildi ama şimdi dokümanlar ki: "Doğru çapraz tarayıcı ve çapraz platform davranış için, kullanmanız gerekir <a>etiketi, değil <button>etiket ve ayrıca içermelidir role="button"ve tabindexÖznitellikler." Bu özelliklerle denediniz mi?
Louis

3
Öyleyse, var olan bir fare düğmesine basarak: platform uyumluluğu ile ilgisi yok bu cevap ile ilgili bir sorun popover tetikler eleman odağı kaybeder çünkü popover görevden alacak popover. Kullanıcıların popover'lardan kopyalayıp yapıştırabilmesini sağlayın: fare düğmesi aşağı iner, popover kapanır. Popover'da işlem yapılabilir öğeler (düğmeler, bağlantılar) varsa, kullanıcılar bunları kullanamaz.
Louis

'Çapraz platform' için çok fazla çünkü bootstrap 4.0.0-beta ve 4.0.0-beta.2'de bunu Chrome'da Mac'te çalıştıramıyorum :(
rmcsharry

3

Değiştirilmiş kabul edilmiş çözüm. Yaşadığım şey, bazı popovers gizlendikten sonra tekrar göstermek için iki kez tıklanması gerektiğiydi. İşte popover'ın ('hide') zaten gizli popoverlarda çağrılmadığından emin olmak için yaptığım şey.

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

Bu çözüm iyi çalışıyor:

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

Ayrıca, açılır pencereyi DOM'dan kaldırmak için etkinlik köpürmeyi de kullanabilirsiniz. Biraz kirli, ama iyi çalışıyor.

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

Html'nizde, popover'ın içindeki popover'ı kapatması gereken içeriğe .popover-close sınıfını ekleyin.


2

Seçici temsilci ile popover oluşturursanız, 'hide' yöntemi işe yaramaz gibi görünür, bunun yerine 'destroy' kullanılmalıdır.

Ben böyle yaptım:

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

JS Burada keman yapın


2

@Mattdlockyer'den çözümle ilgili bir sorun yaşadığımızı öğrendik (çözüm için teşekkürler!). Böyle popover yapıcısı için selector özelliğini kullanırken ...

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

... BS3 için önerilen çözüm işe yaramaz. Bunun yerine, yerel bir ikinci popover örneği oluşturur $(this). İşte bunu önlemek için çözümümüz:

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

Belirtildiği gibi $(this).popover('hide');, delege edilen dinleyici nedeniyle ikinci bir örnek oluşturur. Sunulan çözüm yalnızca önceden başlatılmış popovers gizler.

Umarım sizleri biraz kurtarabilirim.


2

Bootstrap bunu doğal olarak destekler :

JS Bin Demosu

Bir sonraki tıklamayla reddetme için özel işaretleme gerekir

Uygun çapraz tarayıcı ve çapraz platform davranış için, kullanmanız gerekir <a>etiketi, değil<button> etiket ve ayrıca içermelidir role="button"ve tabindexözelliklerini.


Bootstrap 4.0.0-beta ve 4.0.0-beta.2'de bunu Chrome'da Mac'te çalıştıramadım :(
rmcsharry

Herhangi bir yeri tıklamak bu popover'ı kapatır, sorgulayan kişi "popover'ın dışını tıklamak onu kapatır", ki bu da farklıdır.
philw

2

bu çözüm popover ikinci kez gösterilirken sinir bozucu 2. tıklama kurtulmak

Bootstrap v3.3.7 ile test edilmiştir

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

Önceki cevapların çoğunu denedim, gerçekten hiçbir şey benim için çalışmıyor ama bu çözüm işe yaradı:

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

Düğmeyi değil bağlantı etiketini kullanmanızı ve role = "button" + data-trigger = "focus" + tabindex = "0" özelliklerine dikkat etmelerini önerirler.

Ör:

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


1

Ben bununla geldim: Senaryomda aynı sayfada daha fazla popover vardı ve onları gizlemek onları görünmez yaptı ve bu nedenle popover'ın arkasındaki öğelere tıklamak mümkün değildi. Fikir, belirli popover bağlantısını 'aktif' olarak işaretlemektir ve daha sonra aktif popover'ı 'değiştirebilirsiniz'. Bunu yapmak popover'ı tamamen kapatacak $ ('. 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

Ben sadece yeni popover gösterilmeden önce diğer aktif popovers kaldırmak (bootstrap 3):

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

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

1

3.3.6 ile test edildi ve ikinci tıklama tamam

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

}

bu benim çözümüm.


0

Bu yaklaşım, sayfanın herhangi bir yerini tıklayarak bir popover'ı kapatmanızı sağlar. Başka bir tıklanabilir varlığı tıklarsanız, diğer tüm popovers gizlenir. Animasyon: false gereklidir, aksi takdirde konsolunuzda bir jquery .remove hatası alırsınız.

$('.clickable').popover({
 trigger: 'manual',
 animation: false
 }).click (evt) ->
  $('.clickable').popover('hide')
  evt.stopPropagation()
  $(this).popover('show')

$('html').on 'click', (evt) ->
  $('.clickable').popover('hide')

0

Tamam bu aslında stackoverflow bir şey cevaplamak için ilk denemem bu yüzden burada hiçbir şey gitmez

Görünüşe göre bu işlevin aslında en son önyüklemedeki kutudan çıktığı açıkça görülmüyor (yani, nerede uzlaşmak istiyorsanız kullanıcının tıklayabileceği istiyorsanız, 'click' fareyle üzerine gelindiğinde, ancak bir iPad'de, tıklatma geçiş olarak çalışır.

Sonuç, masaüstünde fareyle üzerine gelinebilir veya tıklayabilirsiniz (çoğu kullanıcı fareyle üzerine gelir). Dokunmatik bir cihazda, öğeye dokunmak öğeyi getirir ve tekrar dokunmak öğeyi aşağı indirir. Tabii ki, bu orijinal gereksiniminizden hafif bir uzlaşma ama en azından kodunuz artık daha temiz :)

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


0

Matt Lockyer'ın kodunu alarak, basit bir sıfırlama yaptım, böylece dom gizle üzerindeki öğe tarafından kaplanmıyor.

Matt'in kodu: http://mattlockyer.com/2013/04/08/close-a-twitter-bootstrap-popover-when-clicking-outside/

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

Bunu deneyin, bu dışarıya tıklayarak gizlenecektir.

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

Ben dinamik olarak böyle kodu kullanarak popover bağlantıları kuruyordum çünkü mattdlockyer çözüm ile ilgili sorunlar yaşıyordu:

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

Bu yüzden böyle değiştirmek zorunda kaldım. Benim için birçok sorunu düzeltti:

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

Yıkmanın elemandan kurtulduğunu unutmayın, bu yüzden seçici kısım popovers'ı başlatmada önemlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.