Come eliminare un popover Bootstrap di Twitter facendo clic all'esterno?


289

Possiamo far sì che i popover siano liquidabili allo stesso modo dei modali, ad es. farli chiudere quando l'utente fa clic da qualche parte al di fuori di loro?

Sfortunatamente non posso semplicemente usare il vero modale invece del popover, perché modale significa posizione: fisso e non sarebbe più un popover. :(



Prova questo stackoverflow.com/a/40661543/5823517 . Non comporta il looping attraverso i genitori
Tunn,

data-trigger="hover"e data-trigger="focus"sono un'alternativa integrata per la chiusura del popover, se non si desidera utilizzare l'interruttore. A mio avviso, data-trigger="hover"offre la migliore esperienza utente ... non è necessario scrivere un codice .js aggiuntivo ...
Hooman Bahreini,

Risposte:


461

Aggiornamento: una soluzione leggermente più robusta: http://jsfiddle.net/mattdlockyer/C5GBU/72/

Per i pulsanti che contengono solo testo:

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

Per l'uso di pulsanti contenenti icone (questo codice presenta un bug in Bootstrap 3.3.6, vedere la correzione di seguito in questa risposta)

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

Per Popovers generati da JS Utilizzare '[data-original-title]'al posto di'[data-toggle="popover"]'

Avvertenza: la soluzione di cui sopra consente di aprire più popover contemporaneamente.

Una sosta alla volta per favore:

Aggiornamento: Bootstrap 3.0.x, vedi codice o violino 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');
        }
    });
});

Gestisce la chiusura di popover già aperti e non cliccati o i cui collegamenti non sono stati cliccati.


Aggiornamento: Bootstrap 3.3.6, vedi violino

Risolve il problema per cui, dopo la chiusura, richiede 2 clic per riaprire

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

    });
});

Aggiornamento: utilizzando la condizione del miglioramento precedente, questa soluzione è stata raggiunta. Risolvi il problema del doppio clic e del popover fantasma:

$(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
Vi allego $(document)invece che da $('body')quando a volte il bodynon si estende lungo l'intera pagina.
Jasop,

6
Dopo aver attivato il popover (e la successiva azione nascondi), il popover non è completamente nascosto; non è appena visibile. Il problema è che il contenuto al di sotto del popover invisibile ma presente non può essere cliccato o spostato. Il problema si verifica sull'ultima build di Chrome, sull'ultimo bootstrap 3 .js (potrebbero essere anche altri browser, non potrebbe essere disturbato da controllare poiché questa soluzione alternativa dovrebbe essere richiesta comunque)
ravb79

6
Invece '[data-toggle="popover"]', che non funziona con i popover generati da JavaScript, ho usato '[data-original-title]'come selettore.
Nathan,

4
Qualcuno sa perché questa soluzione non funziona con l'ultima versione di bootstrap? Succede quanto segue: Fare clic sul pulsante per mostrare popover, quindi fare clic su body per chiudere popover, quindi fare clic sul pulsante per mostrare popover e popover non viene visualizzato. Dopo che fallisce una volta se fai clic di nuovo, viene visualizzato. E 'molto strano.
JTunney,

3
@JTunney Sto eseguendo BS 3.3.6 e sto ancora vedendo quel comportamento in cui sono necessari due clic per aprire un popoever dopo averlo eliminato.
sersun,

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

Ciò chiude tutti i popover se si fa clic in un punto qualsiasi tranne che in un popover

AGGIORNAMENTO per 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");
        });
    }
});

Ho aggiunto una classe al pulsante che attiva il popover (pop-btn) in modo che non sia incluso ... if (! $ (E.target) .closest ('. Popover'). Length &&! $ (E. target) .closest ('. btn'). hasClass ('pop-btn'))
mozgras

2
con 3 pulsanti popover, questo codice crea problemi. in alcuni casi non riesco a fare clic sul pulsante e i pulsanti lampeggiano.
aperto

1
Non riesco a far funzionare questo codice ... controlla questo violino e per favore aggiungi un violino alla tua risposta. jsfiddle.net/C5GBU/102
mattdlockyer

Perfetto per me. Altre risposte hanno avuto effetti collaterali quando il mio "clic esterno" è riuscito ad aprire un nuovo popover.
Facio Ratio

Funziona alla grande, ma deve avere un modo per adattarlo in modo che se si fa clic sul contenuto del popover, non si chiude. ad esempio, se fai clic sul testo all'interno di un tag <b> all'interno del popover ...
Ben in CA,

40

Versione più semplice, più sicura , funziona con qualsiasi versione bootstrap.

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

Demo 2: non eliminare quando si fa clic all'interno del contenuto del popover http://jsfiddle.net/guya/fjZja/

Demo 3: Popovers multipli: http://jsfiddle.net/guya/6YCjW/


Chiamare semplicemente questa linea per eliminare tutti i popover:

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

Chiudi tutti i popover facendo clic all'esterno con questo codice:

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

Lo snippet qui sopra allega un evento click sul corpo. Quando l'utente fa clic su un popover, si comporterà normalmente. Quando l'utente fa clic su qualcosa che non è un popover, chiuderà tutti i popover.

Funzionerà anche con i popover che sono stati avviati con Javascript, al contrario di altri esempi che non funzioneranno. (vedi la demo)

Se non vuoi chiudere quando fai clic all'interno del contenuto del popover, usa questo codice (vedi link alla seconda 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
Aveva un problema simile e funzionava in Bootstrap 3.
wsams,

Se avvicini i popover in modo tale che i popover si sovrappongano, quando nascondi un popover facendo clic da qualche parte all'esterno, uno dei link smette di funzionare. Controlla: jsfiddle.net/qjcuyksb/1
Sandeep Giri il

1
L'ultima versione non funziona quando si utilizza bootstrap-datepicker nel popover.
Dbinott

1
Questa soluzione mi è piaciuta al meglio, perché la risposta accettata ha iniziato ad essere un po 'un porco di risorse con circa 30 popup
David G

1
Forse !$(e.target).closest('.popover.in').lengthsarebbe più efficiente di !$(e.target).parents().is('.popover.in').
joeytwiddle

19

Con bootstrap 2.3.2 puoi impostare il trigger su 'focus' e funziona:

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

1
+1, ma nota a margine importante: questo non chiude il popover, se si fa di nuovo clic sul pulsante o sull'ancora, mentre la risposta accettata è valida.
Christian Gollhardt,

18

Fondamentalmente questo non è molto complesso, ma ci sono alcuni controlli da fare per evitare problemi.

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
questo licenzia il modale facendo clic ovunque non all'esterno
hienbt88,

È possibile farlo con un popover()clic anziché con il passaggio del mouse?
Zaki Aziz,

3
Certo, ma è necessario chiamare stopPropagation()l'evento passato al gestore clic (in caso contrario, il gestore nascosto nasconde immediatamente il popover). Demo (jsfiddle)
Sherbrow

Ho la stessa funzionalità in basso con molto meno codice. Questa risposta è gonfia e un po 'ridicola per la domanda ... Tutto quello che vuole è chiudere i popover quando si fa clic all'esterno ... Questo è eccessivo e brutto!
mattdlockyer,

2
Correzione, credo di avere una MIGLIORE funzionalità in FAR meno codice. Presuppone che tu voglia vedere solo un popup alla volta. Se ti piace questo si prega di upvote mia risposta qui sotto: jsfiddle.net/P3qRK/1 risposta: stackoverflow.com/a/14857326/1060487
mattdlockyer

16

Nessuna delle supposte soluzioni di alto livello ha funzionato correttamente per me. Ognuno porta ad un bug quando dopo aver aperto e chiuso (facendo clic su altri elementi) il popover per la prima volta, non si riapre, fino a quando non ne fai due clic sul collegamento di attivazione anziché uno.

Quindi l'ho modificato leggermente:

$(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
Bello, funziona per me. A proposito, hai dimenticato a); alla fine del codice dopo l'ultimo}
Merlin,

1
Ha avuto lo stesso problema relativo al secondo clic. Questa dovrebbe essere la risposta sicura!
Felipe Leão

Ho anche provato le precedenti soluzioni di cui sopra, ma come guida per coloro che cercano anche una soluzione a partire dal 2016, questa è una soluzione migliore.
Dariru

risposta migliore, funziona come pubblicizzato. come notato, altri no. questa dovrebbe essere la risposta migliore
duggi

Funziona perfettamente tranne che non ho usato data-toggel = "popover". Ma puoi specificare qualsiasi selettore corrispondente agli elementi del trigger popover. Bella soluzione e l'unica che ha risolto il problema dei due clic per me.
shock_gone_wild

11

Ho creato un jsfiddle per mostrarti come farlo:

http://jsfiddle.net/3yHTH/

L'idea è di mostrare il popover quando si fa clic sul pulsante e di nascondere il popover quando si fa clic all'esterno del pulsante.

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

bella demo. Mi chiedo come si possa chiamare popover sull'oggetto Jquery, popover è un plugin js bootstrap, ma non si include alcun file js bootstrap lì?
bingjie2680,

C'è un file js nel jsfiddle. Guarda la colonna di sinistra -> Gestisci risorse.
Pigueiras,

Ok, vedo che c'è un bootstrap js. ma non è controllato, funziona ancora?
bingjie2680,

Sì funziona. Comunque, ho cercato su google: jsfiddle bootstrape mi ha dato lo scheletro di bootstrap css + js in jsfiddle.
Pigueiras,

2
Il mio unico problema è che nascondi il popover quando fai clic su di esso. Potrebbe anche usare una descrizione comandi.
NoBrainer

7

aggiungi semplicemente questo attributo con l'elemento

data-trigger="focus"

Inizialmente questo non ha funzionato per me con Bootstrap 3.3.7, ma poi ho letto i documenti e hanno alcune indicazioni che vale la pena menzionare qui. Dall'esempio di popover non consentito nei documenti "Per un corretto comportamento tra browser e multipiattaforma, è necessario utilizzare il tag <a>, non il tag <button> e inoltre è necessario includere gli attributi role =" button "e tabindex ".
Jeff,

3

Questo è stato chiesto prima qui . La stessa risposta che ho dato quindi vale ancora:

Avevo un bisogno simile e ho trovato questa piccola grande estensione del Twitter Bootstrap Popover di Lee Carmichael, chiamato BootstrapX - clickover . Ha anche alcuni esempi di utilizzo qui . Fondamentalmente cambierà il popover in un componente interattivo che si chiuderà quando clicchi altrove sulla pagina o su un pulsante di chiusura all'interno del popover. Ciò consentirà inoltre di aprire più popover contemporaneamente e un sacco di altre belle funzionalità.


3

È tardi per la festa ... ma ho pensato di condividerlo. Adoro il popover ma ha così poche funzionalità integrate. Ho scritto un'estensione bootstrap .bubble () che è tutto ciò che vorrei che fosse popover. Quattro modi per licenziare. Fai clic all'esterno, attiva o disattiva il collegamento, fai clic sulla X e premi Esc.

Si posiziona automaticamente in modo da non andare mai fuori dalla pagina.

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

Questa non è un'auto promo gratuita ... Ho afferrato il codice di altre persone così tante volte nella mia vita, volevo offrire i miei sforzi. Fai un giro rapido e vedi se funziona per te.


3

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

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

Utilizzare il trigger di messa a fuoco per eliminare i popover al clic successivo eseguito dall'utente.

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

2
Non funziona sui browser Mac che seguono il comportamento nativo di OS X (che non mette a fuoco né sfoca i pulsanti al clic). Questi includono Firefox e Safari. I ragazzi di Bootstrap hanno fatto un grosso errore qui, poiché questi popover non possono nemmeno essere aperti, e tanto meno respinti.
Ante Vrli,

2
@AnteVrli Forse questo non era ancora nella documentazione quando hai scritto il tuo commento ma ora i documenti dicono: "Per un corretto comportamento tra browser e multipiattaforma, devi usare il <a>tag, non il <button>tag, e devi anche includere il role="button"e tabindexattributi ". L'hai provato con queste specifiche?
Louis,

3
Bene, c'è un problema con questa risposta, che non ha nulla a che fare con la compatibilità della piattaforma: la pressione di un pulsante del mouse all'interno di un popover sarà respingere il popover perché l'elemento che fa scattare il popover verrà perdere la concentrazione. Dimentica che gli utenti siano in grado di copiare e incollare dai popover: non appena il pulsante del mouse è abbassato, il popover si chiude. Se hai elementi utilizzabili nel popover (pulsanti, collegamenti), gli utenti non saranno in grado di usarli.
Louis,

Tanto per 'multipiattaforma' perché in bootstrap 4.0.0-beta e 4.0.0-beta.2 non riesco a farlo funzionare su Mac in Chrome :(
rmcsharry,

3

Soluzione accettata modificata. Quello che ho sperimentato è che dopo che alcuni popover erano stati nascosti, dovevano essere cliccati due volte per mostrarsi di nuovo. Ecco cosa ho fatto per assicurarmi che popover ('hide') non venisse chiamato su popover già nascosti.

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

Questa soluzione funziona perfettamente:

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

Puoi anche utilizzare il bubbling di eventi per rimuovere il popup dal DOM. È un po 'sporco, ma funziona bene.

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

Nel tuo html aggiungi la classe .popover-close al contenuto all'interno del popover che dovrebbe chiudere il popover.


2

Sembra che il metodo "nascondi" non funzioni se si crea il popover con la delega del selettore, invece si deve usare "distruggi".

L'ho fatto funzionare così:

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

JSfondo qui


2

Abbiamo scoperto di avere un problema con la soluzione di @mattdlockyer (grazie per la soluzione!). Quando si utilizza la proprietà selector per il costruttore popover in questo modo ...

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

... la soluzione proposta per BS3 non funzionerà. Invece crea una seconda istanza di popover locale alla sua $(this). Ecco la nostra soluzione per evitare che:

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

Come accennato, $(this).popover('hide');verrà creata una seconda istanza a causa del listener delegato. La soluzione fornita nasconde solo i popover che sono già stati istanziati.

Spero di potervi risparmiare ragazzi un po 'di tempo.


2

Bootstrap supporta nativamente questo :

Demo Bin JS

Markup specifico richiesto per il licenziamento al clic successivo

Per un corretto comportamento tra browser e multipiattaforma, è necessario utilizzare il <a>tag, non il <button>tag, nonché includere gli attributi role="button"e tabindex.


In bootstrap 4.0.0-beta e 4.0.0-beta.2 non riesco a farlo funzionare su Mac in Chrome :(
rmcsharry

Facendo clic in qualsiasi punto si chiude questo popover, l'interrogante richiede "un clic al di fuori del popover lo chiude", che è diverso.
philw,

2

questa soluzione elimina il fastidioso secondo clic quando mostra il popover per la seconda volta

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

Ho provato molte delle risposte precedenti, davvero niente funziona per me ma questa soluzione ha fatto:

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

Raccomandano di usare il tag anchor not button e di occuparsi degli attributi role = "button" + data-trigger = "focus" + tabindex = "0".

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>

provare questo riferimento anche: stackoverflow.com/questions/20466903/...
Ahmed El Damasy

1

Ho pensato a questo: il mio scenario includeva più popover nella stessa pagina e nasconderli li rendeva semplicemente invisibili e per questo motivo non era possibile fare clic sugli oggetti dietro il popover. L'idea è di contrassegnare il collegamento popover specifico come "attivo" e quindi è possibile semplicemente "attivare" il popover attivo. In questo modo il popover verrà chiuso completamente $ ('. 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

Rimuovo solo altri popover attivi prima che venga mostrato il nuovo popover (bootstrap 3):

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

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

1

testato con 3.3.6 e il secondo clic è 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;
});

}

questa è la mia soluzione per questo.


0

Questo approccio consente di chiudere un popover facendo clic in qualsiasi punto della pagina. Se fai clic su un'altra entità cliccabile, nasconde tutti gli altri popover. L'animazione: false è necessaria altrimenti si otterrà un errore jquery .remove nella console.

$('.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, questo è il mio primo tentativo di rispondere a qualcosa su StackOverflow, quindi qui non c'è nulla: P

Sembra che non sia del tutto chiaro che questa funzionalità funzioni davvero pronta all'uso sull'ultimo bootstrap (beh, se sei disposto a scendere a compromessi dove l'utente può fare clic. Non sono sicuro se devi mettere "clic" passa il mouse di per sé ma su un iPad, fare clic su funziona come un interruttore.

Il risultato finale è che su un desktop è possibile passare con il mouse o fare clic (la maggior parte degli utenti passa il mouse). Su un dispositivo touch, toccando l'elemento verrà visualizzato e toccandolo di nuovo verrà rimosso. Naturalmente, questo è un leggero compromesso rispetto al requisito originale, ma almeno il tuo codice è ora più pulito :)

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


0

Prendendo il codice di Matt Lockyer, ho fatto un semplice reset in modo che il dom non venga coperto dall'elemento hide.

Codice di Matt: http://mattlockyer.com/2013/04/08/close-a-twitter-bootstrap-popover-when-clicking-outside/

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

Prova questo, questo si nasconderà facendo clic all'esterno.

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

Avevo problemi con la soluzione di mattdlockyer perché stavo configurando dinamicamente i collegamenti popover usando un codice come questo:

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

Quindi ho dovuto modificarlo in questo modo. Ha risolto molti problemi per me:

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

Ricorda che distruggere elimina l'elemento, quindi la parte del selettore è importante per l'inizializzazione dei popover.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.