2012-11-18 13 views
28

Ho un elemento $('#anElement') con un potenziale popover attaccato, comeCome verificare se un popover di bootstrap twitter è visibile o no?

<div id="anElement" data-original-title="my title" data-trigger="manual" data-content="my content" rel="popover"></div> 

Vorrei solo sapere come controllare se il popover è visibile o meno: come questo può essere realizzato con jQuery?

+3

Si prega di prodivde più mark-up. –

+2

@bram: in circostanze normali sarei pienamente d'accordo con te. Tuttavia, in questo caso, il markup è il markup standard di bootstrap (twitter). – Lix

+1

@Lix Per chi non ha familiarità con Bootstrap potrebbe essere utile avere qualche idea di cosa sia il markup –

risposta

43

Se questa funzionalità non è incorporata nel quadro che si sta utilizzando (non è più twitter bootstrap, solo bootstrap), quindi sarà necessario ispezionare l'HTML generato/modificato per creare questa funzionalità di bootstrap.

Dai uno sguardo allo popupver documentation. C'è un pulsante che puoi usare per vederlo in azione. Questo è un ottimo posto per esaminare gli elementi HTML che sono al lavoro dietro la scena.

Apri crack gli strumenti degli sviluppatori di Chrome o firebug (di firefox) e dai un'occhiata a cosa sta succedendo. Sembra che ci sia semplicemente una <div> essere inserito dopo che il pulsante -

<div class="popover fade right in" style="... /> 

Tutto quello che dovete fare è verificare l'esistenza di tale elemento. A seconda di come il vostro codice è scritto, si potrebbe usare qualcosa di simile -

if ($("#popoverTrigger").next('div.popover:visible').length){ 
    // popover is visible 
} 

#popoverTrigger è l'elemento che ha attivato che popover di apparire in primo luogo e, come abbiamo notato in precedenza, bootstrap accoda semplicemente il div popover dopo la elemento.

+0

Questo non funziona per IE8 e sotto. – hofnarwillie

+0

@hof - forse bootstrap gestisce IE8 in un modo diverso ... – Lix

+0

Sì, forse. Non riesco a eseguire il debug correttamente. Utilizzo del debugger IE9 in modalità IE8, ma non è possibile visualizzare le modifiche apportate al DOM mentre è visibile il popover. – hofnarwillie

4

Controlla se il div specificato è visibile.

if ($('#div:visible').length > 0) 

o

if ($('#div').is(':visible')) 
25

Non esiste un metodo implementato in modo esplicito nel plugin boostrap popover quindi è necessario trovare un modo per aggirare questo. Ecco un trucco che ritorna vero o falso se il plugin è visibile o meno.

var isVisible = $('#anElement').data('bs.popover').tip().hasClass('in'); 
console.log(isVisible); // true or false 

Si accede ai dati memorizzati dal plugin popover che è in realtà un oggetto Popover, chiama il metodo dell'oggetto tip() che è responsabile per il recupero l'elemento punta, e poi controlla se l'elemento restituito ha la classe in, che è indicativo che il popover collegato a quell'elemento è visibile.


Si dovrebbe anche controllare se c'è un popover attaccato per assicurarsi che si può chiamare il metodo tip():

if ($('#anElement').data('bs.popover') instanceof Popover) { 
    // do your popover visibility check here 
} 
+17

BOOTSTRAP 3 NOTA: in BS3 lo hanno cambiato in bs.popover anziché in popover. Esempio: '$ ('# anElement'). Data ('bs.popover')' – Kyle

+0

Grazie per questa soluzione, ma questo è ancora un trucco. Mi imbatto in questa esigenza perché hide non pulisce correttamente il DOM HTML mentre lo fa. –

3

Nella versione corrente di Bootstrap, è possibile verificare se il proprio elemento ha impostato aria-describedby. Il valore dell'attributo è id del popover effettivo.

Così, per esempio, se si desidera modificare il contenuto del popover visibile, si può fare:

var popoverId = $('#myElement').attr('aria-describedby'); 
$('#myElement').next(popoverid, '.popover-content').html('my new content'); 
-1

Utilizzando un popover con boostrap 4, punta() non sembra essere una funzione più . Questo è un modo per verificare se un popover è abilitato, in sostanza, se ha cliccato ed è attiva:

if ($('#element').data('bs.popover')._activeTrigger.click == true){ 
...do something 
} 
+0

Le proprietà Underscore sono dettagli di implementazione interni. Devono essere trattati come tali e possono essere modificati in qualsiasi momento, il che significa che il tuo piccolo frammento di codice può (a caso: si) interrompersi in modo casuale in un momento futuro senza avviso (come un avviso di modifica delle modifiche o dell'errore API). –

1

forse l'opzione più affidabile sarebbe ascoltando eventi nascoste mostrati /, come illustrato di seguito. Ciò eliminerebbe la necessità di scavare in profondità nel DOM che potrebbe essere soggetto a errori.

var isMyPopoverVisible = false;//assuming popovers are hidden by default 

$("#myPopoverElement").on('shown.bs.popover',function(){ 
isMyPopoverVisible = true; 
}); 

$("#myPopoverElement").on('hidden.bs.popover',function(){ 
isMyPopoverVisible = false; 
}); 

Questi eventi sembrano essere attivato anche se si nasconde/mostra/alternare la popover a livello di codice, senza l'interazione dell'utente.

P. S. testato con BS3.

Problemi correlati