2012-07-19 29 views
55

Tengo un elemento a de modal invocación:¿Cómo obtener el elemento invocador de Twitter Bootstrap Modal?

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

Y, decir que este es mi 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> 

puedo obligar a las funciones de eventos disparados por modal:

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

Mi pregunta es: ¿Cómo puedo acceder al elemento a -que invocó el modal- de mi función de suscriptor de eventos?

+0

'$ (" A [href = '# myModal '] ")' seleccionará esa etiqueta 'a'. ¿Es eso lo que estás buscando? – sachleen

+0

No, no es en realidad. Porque puede ser cualquier cosa en lugar de #mymodal. Lo que estoy buscando es como: event.relatedTarget o event.OriginalTarget o algo así. – cnkt

+0

¿No tiene que ser '# mymodal' para que ejecute el modal' mymodal'? Puede reemplazar "mymodal" con una variable que contenga la ID del elemento cuyo evento está en. – sachleen

Respuesta

91

Se resolvió en Bootstrap 3.0.0 gracias a event.relatedTarget.

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

y qué pasa si me gustaría saber el elemento que invocó el ocultamiento del modal? – axel

+0

Buena pregunta axel, actualmente parece que todavía no hay nada para eso. –

+2

¿Hay algún problema para esto en bootstrap 2.3? – Ashimema

1

Actualmente no está disponible de fábrica. Hay una solicitud de función para ello y una solución alternativa si desea editar el código de arranque-modal usted mismo.

Ver here

+1

Hubo una [solicitud de extracción] (https://github.com/twitter/bootstrap/pull/6256) enviada, pero fue rechazada por algún motivo. Esta es una característica que me gustaría mucho ver. – Bojangles

1

tuve una situación en la que tenía que unir algunos datos relacionados con el "invocador", tal como dijiste. He conseguido resolverlo mediante la unión de un evento de "clic" a él y trabajar con los datos como estos:

El invocador

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

El JS para coger los datos relacionados con el invocador (Sólo algunos ejemplo de código)

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

de esta manera, usted puede manejar los datos relacionados con su invocador tantas veces como quiera.

16

Hay que escuchar a:

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

Por supuesto, puede reemplazar show.bs.modal con shown.bs.modal o cualquier otro evento que el fuego. Tenga en cuenta que esto es para Bootstrap 3.0.0. Si está utilizando 2.3.2 necesita deshacerse de .bs.modal (creo).

Lo que me gusta de esta solución: usted no tiene que recordar que es este, auto, que y otra de proxy llama soluciones.

Por supuesto, debe probar si el atributo href no es un enlace real (la opción de carga modal dinámica).

+0

Las mejores opciones para mi caso. Y, sí, en 2.3.2 necesita eliminar .bs.modal. –

+0

Solución increíblemente inteligente! Me gustaría poder recomendar esta solución varias veces. Mi problema era que se desencadenaba un modal de varios elementos y quería que el elemento disparador al hacer clic en un botón dentro del modal. Aunque, la ruta convencional de usar 'show.bs.modal' y' event.relatedTarget' es posible, terminaría haciendo innecesarias llamadas 'unbind()' y/o pondría en peligro el rendimiento. ¡Salud de nuevo! – Fr0zenFyr

6

El elemento modal tiene un objeto de datos denominado modal que guarda todas las opciones que se pasan. Puede establecer un atributo de datos 'fuente' en el elemento que desencadena el modal, configurarlo en el ID de la fuente y luego recuperarlo más tarde desde la variable options.

El disparador sería:

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

En la devolución de llamada caso, obtener el objeto de datos modal, y un vistazo a la opción source:

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

Esto inicialmente pareció funcionar para mí, pero tan pronto como tuve más de una fuente dejó de funcionar. Parece que el modal mantiene las opciones desde la primera vez que se invocó, por lo que el anclaje que haga clic primero, utilizará la fuente de datos de ese en todas las operaciones posteriores. – izak