2012-07-19 17 views
55

Ho un elemento a per modale invocare:Come ottenere l'elemento di invoker di Twitter Bootstrap Modal?

<a class="btn" data-toggle="modal" data-target="#myModal" href="http://some-url" >Launch Modal</a> 

E, dire che questo è il mio modal:

<div class="modal hide" id="myModal"> 
    <div class="modal-header"> 
    <button type="button" class="close" data-dismiss="modal">×</button> 
    <h3>Modal header</h3> 
    </div> 
    <div class="modal-body"> 
    <p>One fine body…</p> 
    </div> 
    <div class="modal-footer"> 
    <a href="#" class="btn" data-dismiss="modal">Close</a> 
    <a href="#" class="btn btn-primary">Save changes</a> 
    </div> 
</div> 

posso associare funzioni per eventi generati da modale:

$('#myModal').on('hidden', function() { 
    // do something… 
}) 

La mia domanda è: Come posso accedere all'elemento a -che ha richiamato il modale- dalla funzione di sottoscrizione evento del mio evento?

+0

'$ (" a [href = "# myModal '] ")' selezionerà il tag 'a'. E 'quello che stai cercando? – sachleen

+0

No, non è in realtà. Perché può essere qualsiasi cosa invece di #mymodal. Quello che sto cercando è come: event.relatedTarget o event.OriginalTarget o qualcosa del genere. – cnkt

+0

Non deve essere '# mymodal' perché possa avviare il modale' mymodal'? È possibile sostituire "mymodal" con una variabile contenente l'ID dell'elemento di cui si è verificato l'evento. – sachleen

risposta

91

È stato risolto in Bootstrap 3.0.0 grazie a event.relatedTarget.

$('#your-modal').on('show.bs.modal', function (e) { 
    var $invoker = $(e.relatedTarget); 
}); 
+5

e se mi piacerebbe conoscere l'elemento che ha invocato il nascondiglio del modale? – axel

+0

Buona domanda axel, al momento non sembra esserci ancora niente. –

+2

C'è qualche soluzione per questo in bootstrap 2.3? – Ashimema

1

Attualmente non è disponibile immediatamente. Esiste una richiesta di funzionalità e una soluzione alternativa per modificare autonomamente il codice modale di bootstrap.

Vedi here

+1

È stata inviata una [richiesta pull] (https://github.com/twitter/bootstrap/pull/6256), ma è stata rifiutata per qualche motivo. Questa è una caratteristica che mi piacerebbe molto vedere. – Bojangles

1

ho avuto una situazione in cui ho dovuto legare alcuni dati relativi alla "invoker", proprio come hai detto. Sono riuscito a risolverlo legando un evento "click" ad esso e lavorare con i dati in questo modo:

L'invoker

<img id="element" src="fakepath/icon-add.png" title="add element" data-toggle="modal" data-target="#myModal" class="add"> 

Il JS per la cattura dei dati relativi al invoker (Solo qualche esempio di codice)

$('#element').on('click', function() { // Had to use "on" because it was ajax generated content (just an example) 
    var self = $(this); 
}); 

In questo modo, è possibile gestire i dati relativi al vostro invoker comunque si desidera.

16

Devi ascoltare:

$('[data-toggle="modal"]').on('click', function() { 
    $($(this).attr('href')).data('trigger', this); 
}); 
$('.modal').on('show.bs.modal', function() { 
    console.log('Modal is triggered by ' + $(this).data('trigger')); 
}); 

Ovviamente si può sostituire con show.bs.modal shown.bs.modal o qualsiasi altro evento sparano. Si noti che questo è per Bootstrap 3.0.0. Se stai usando 2.3.2 devi liberarti di .bs.modal (penso).

Quello che mi piace di questa soluzione: non c'è bisogno di ricordare chi è questo, , che e altre procura chiama soluzioni alternative.

Ovviamente, è necessario verificare se l'attributo href non è un collegamento reale (l'opzione di caricamento modale dinamico).

+0

Le migliori opzioni per il mio caso. E, sì, in 2.3.2 è necessario rimuovere .bs.modal. –

+0

Soluzione straordinariamente intelligente! Vorrei poter revocare questa soluzione più volte. Il mio problema era che un modale veniva attivato da più elementi e io volevo l'elemento trigger su un clic su un pulsante all'interno del modale. Sebbene, la via convenzionale dell'uso di 'show.bs.modal' e' event.relatedTarget' sia possibile, finirò per fare inutili chiamate 'unbind()' e/o per compromettere le prestazioni. Di nuovo! – Fr0zenFyr

6

L'elemento modale ha un oggetto dati denominato modal che salva tutte le opzioni che sono passati. È possibile impostare un attributo di dati 'origine' sull'elemento che attiva la modale, impostarla sull'ID della sorgente e quindi recuperarla in seguito dalla variabile options.

L'innesco sarebbe:

<a id="launch-modal-1" class="btn" data-toggle="modal" data-target="#myModal" href="http://some-url" data-source="#launch-modal-1">Launch Modal</a> 

Nel callback di evento, ottenere l'oggetto di dati modal, e guardare l'opzione source:

$('#myModal').on('hidden', function() { 
    var modal = $(this).data('modal'); 
    var $trigger = $(modal.options.source); 
    // $trigger is the #launch-modal-1 jQuery object 
}); 
+2

Inizialmente sembrava funzionare per me, ma non appena ho avuto più di una fonte ha smesso di funzionare. Sembra che la modale mantenga le opzioni dalla prima volta in cui è stata invocata, quindi, qualunque sia l'ancoraggio che fai clic per primo, utilizzerà la sorgente di dati da quella in tutte le operazioni successive. – izak

Problemi correlati