2013-09-01 19 views
5

mio sito ha più popovers su una mappa (solo un div immagine di sfondo con) con icone cliccabili:Bootstrap Popover contenuto cliccabile quando nascosti

http://f.cl.ly/items/44382Q2Y3U3t2S450r3w/Skjermbilde%202013-09-01%20kl.%2023.15.58.png

Cliccando le icone, un popover viene mostrato. Questo popover ha una giostra che contiene il testo con link:

http://f.cl.ly/items/0s2v2i193z0u1D0N163D/Skjermbilde%202013-09-01%20kl.%2023.35.34.png

Quando clicco fuori del popover, tutte le popovers sono nascosti. Questo presumibilmente funziona ok. Ho ricevuto il codice da this Stack Overflow question.

Ma il vero problema si verifica quando si fa clic all'esterno del popover per nasconderlo di nuovo. Il popover è nascosto, ma è ancora nel DOM. Ciò significa che i collegamenti sono ancora cliccabili!

http://f.cl.ly/items/0T0p422c1A202b2M1J20/Skjermbilde%202013-09-01%20kl.%2023.34.28.png

Quando scatto l'icona più per nascondere il popover, il popover è nascosta (rimosso?), Ma quando si fa clic al di fuori del segno più (vale a dire qualsiasi punto della pagina), il popover è ancora presente (ma non visibile) sopra lo </body>.

Si prega di aiuto! Questo infastidisce l'inferno fuori di me .. :(

Edit: Potrebbe valere la pena ricordare che le popovers sono dinamicamente aggiunti:

$('.plus').each(function(i) { 

    var $self = $(this); 

    $self.popover({ 
     html: true, 
     title: false, 
     placement: function() { 
      return 'auto left'; // TODO: calculate placing 
     }, 
     content: function() { 

      var html = '<div id="carousel-' + i + '" class="carousel slide">'; 
      var list = '<ol class="carousel-indicators">'; 
      var slides = '<div class="carousel-inner">'; 

      var count = 0; 

      $('.post[data-category="' + $(this).data('category') + '"]').each(function(j) { 

       // add indicator for slide 
       list += '<li data-target="#carousel-' + i + '" data-slide-to="' + count + '"' + (count == 0 ? ' class="active"' : '') + '></li>'; 

       // add html for slide 
       slides += '<div class="item' + (count == 0 ? ' active' : '') + '">' + $(this).html() + '</div>'; 

       // increase counter 
       count++; 

      }); 

      // merge all html 
      html += list + '</ol>' + slides + '</div></div>'; 

      return html; 
     } 
    }); 

risposta

0

penso che è necessario "distruggere" la popover, non solo per " nascondere" si

Vedi l'API qui:. http://getbootstrap.com/2.3.2/javascript.html#popovers

+1

Grazie per il suggerimento, ma ci ho provato, e il risultato è che i popover non vengono mai più visualizzati. –

+0

@rebellion mi spiace sentirlo, ma popover ('destroy') dovrebbe funzionare come descritto nella documentazione. Se non funziona, il bug deve essere da qualche altra parte, a meno che non si usi un Bootstrap precedente: http://stackoverflow.com/questions/12130265/javascript-error-when-destroying-bootstrap-popover – Hans

+0

Grazie a @Hans, I ' Ho aggiornato la mia domanda con il codice per il popover aggiunto dinamicamente. Pensi che abbia qualcosa a che fare con il problema 'destroy'? –

3

ho avuto un problema simile, forte mal di testa, e la ricerca ho avuto modo di questa pagina:

https://github.com/twbs/bootstrap/issues/4215

A quanto pare quando si aggiunge Popovers a contenuto dinamico è necessario aggiungere questa opzione:

selector: '[rel="popover"]' 

nel tuo caso sarebbe

$self.popover({ 
    selector: '[rel="popover"]' 
    html: true, 
    title: false, 
    ... 

Questo risolto tutto il mio "rilevamento click popover nascosti" problemi.

+0

Grazie per averlo scoperto. Questa soluzione ha funzionato per i miei popover creati dinamicamente. Il problema che stavo affrontando emergeva durante la creazione di un popover che creava dinamicamente un popover per i risultati della ricerca automatica e un altro per la convalida del modulo sullo stesso elemento. Stavo usando "destroy" per rimuovere il popover, tuttavia ero ancora in grado di fare clic sui contenuti che hanno attivato altre azioni. Questa risposta dovrebbe essere aumentata di più a causa del riferimento al log dei problemi di BS. – Josh

2

Questo è quello che ho fatto al fine di evitare che elementi all'interno della popover nascosta da essere cliccato

$('button.new-history').on('hidden.bs.popover', function() { 
    $(this).next().remove(); 
}) 

L'idea è che quando il popover è nascosto, è necessario rimuoverlo dal DOM.

Spero che aiuti!

+0

Vorrei semplicemente aggiungere il selettore ".popover" alla chiamata alla funzione next() per impedire la rimozione di altri elementi DOM se il popover era già stato rimosso: ** $ (this) .next ('. Popover'). Remove(); ** –

+0

Non è necessario l'elemento .popover si trova sempre vicino all'elemento su cui è applicato il popover. La maggior parte delle volte utilizziamo il contenitore di opzioni popover in cui è associato ad altri elementi nella dom per es. Body! –

2

Nessuna delle altre soluzioni ha funzionato per me perché sto utilizzando altre funzioni per consentire solo un popover alla volta e per nascondere il popover quando perde lo stato attivo (sono anche generati dinamicamente).

Ma ho trovato una soluzione molto semplice usando i CSS per 'risolvere' il problema:

.popover.fade { 
    z-index:-1; 
} 

.popover.fade.in { 
    z-index:2; 
} 

Basta assicurarsi che il .popover.in ha un z-index superiore a quella di altri elementi, e allo stesso modo che la uno senza .in ha uno z-index più basso.

0

Ho affrontato lo stesso problema e dopo aver cercato per un po 'in modalità F12 in Chrome, ho trovato che la seguente soluzione funzionava per me.

Dopo aver chiuso manualmente la popover con un pulsante:

<button 
    type=button 
    class="btn btn-default pull-right" 
    onclick="$('.mypopoverclass').popover('hide');"> 
    Close 
</button> 

il contenuto del popover era ancora lì, invisibile e nascondere gli altri elementi della pagina.

ho cambiato il tasto un po 'come questo:

<button 
    type=button 
    class="btn btn-default pull-right" 
    onclick="$('.mypopoverclass').popover('hide'); $('.popover.fade').remove()"> 
    Close 
</button> 

Aggiungendo

$('.popover.fade').remove() 

al gestore onClick tasto, la finestra popover è stato rimosso e non è più nascondere gli elementi sullo schermo. Inoltre, le chiamate successive alla finestra popover lo mostreranno di nuovo.

Spero che funzionerà anche per te!

Problemi correlati