Tengo un diálogo de interfaz de usuario de jQuery que se muestra cuando se hace clic en elementos específicos. Me gustaría cerrar el cuadro de diálogo si se produce un clic en cualquier lugar que no sea en los elementos desencadenantes o en el cuadro de diálogo en sí.
Aquí está el código para abrir el diálogo:
$(document).ready(function() {
var $field_hint = $('<div></div>')
.dialog({
autoOpen: false,
minHeight: 50,
resizable: false,
width: 375
});
$('.hint').click(function() {
var $hint = $(this);
$field_hint.html($hint.html());
$field_hint.dialog('option', 'position', [162, $hint.offset().top + 25]);
$field_hint.dialog('option', 'title', $hint.siblings('label').html());
$field_hint.dialog('open');
});
/*$(document).click(function() {
$field_hint.dialog('close');
});*/
});
Si quito el comentario de la última parte, el cuadro de diálogo nunca se abre. Supongo que es porque el mismo clic que abre el cuadro de diálogo lo cierra nuevamente.
Nota final sobre el código de trabajo
: se utiliza el complemento de eventos externos de jQuery
$(document).ready(function() {
// dialog element to .hint
var $field_hint = $('<div></div>')
.dialog({
autoOpen: false,
minHeight: 0,
resizable: false,
width: 376
})
.bind('clickoutside', function(e) {
$target = $(e.target);
if (!$target.filter('.hint').length
&& !$target.filter('.hintclickicon').length) {
$field_hint.dialog('close');
}
});
// attach dialog element to .hint elements
$('.hint').click(function() {
var $hint = $(this);
$field_hint.html('<div style="max-height: 300px;">' + $hint.html() + '</div>');
$field_hint.dialog('option', 'position', [$hint.offset().left - 384, $hint.offset().top + 24 - $(document).scrollTop()]);
$field_hint.dialog('option', 'title', $hint.siblings('label').html());
$field_hint.dialog('open');
});
// trigger .hint dialog with an anchor tag referencing the form element
$('.hintclickicon').click(function(e) {
e.preventDefault();
$($(this).get(0).hash + ' .hint').trigger('click');
});
});
Lamento arrastrar esto después de tanto tiempo, pero usé el siguiente. ¿Alguna desventaja? Ver la función abierta ...
fuente
$('.ui-widget-overlay').bind('click', function () { $(this).siblings('.ui-dialog').find('.ui-dialog-content').dialog('close'); });
Olvídese de usar otro complemento:
Aquí hay 3 métodos para cerrar un diálogo de interfaz de usuario de jquery al hacer clic fuera de la ventana emergente:
Si el cuadro de diálogo es modal / tiene una superposición de fondo: http://jsfiddle.net/jasonday/6FGqN/
Si el diálogo no es modal Método 1: método 1: http://jsfiddle.net/jasonday/xpkFf/
Método de diálogo no modal 2: http://jsfiddle.net/jasonday/eccKr/
fuente
open : function () { $('.ui-widget-overlay').on('click', function () { $(this).parents("body").find(".ui-dialog-content").dialog("close"); }); }
click.myNamespace
Simplemente agregue este script global, que cierra todos los diálogos modales simplemente haciendo clic fuera del sitio.
fuente
$(document).on('click', '.ui-widget-overlay', function() { $('#'+$('.ui-dialog-content')[0].id).dialog('close'); });
Fiddle mostrando el código anterior en acción.
fuente
Tuve que hacer dos partes. Primero, el controlador de clic externo:
Esto llama
dialog('close')
a laui-dialog-content
clase genérica y, por lo tanto, cerrará todos los cuadros de diálogo si el clic no se originó en uno. También funcionará con cuadros de diálogo modales, ya que la superposición no es parte del.ui-dialog
cuadro.El problema es:
Para solucionar esto, tuve que agregar stopPropagation a esos controladores de clic:
fuente
$('body').on('click', '.ui-widget-overlay', function () { $('#myDialog').dialog('close'); });
Esta pregunta es un poco antigua, pero en caso de que alguien quiera cerrar un cuadro de diálogo que NO es modal cuando el usuario hace clic en algún lugar, puede usar esto que tomé del complemento JQuery UI Multiselect . La principal ventaja es que el clic no se "pierde" (si el usuario desea hacer clic en un enlace o un botón, la acción se realiza).
fuente
var $dialog = $(this).dialog('widget');
dentro del controlador de eventos al hacer clicPuede hacer esto sin utilizar ningún complemento adicional
Aquí $ dialog es el diálogo. Básicamente, lo que estamos haciendo es obtener el último widget de superposición cada vez que se abre este cuadro de diálogo y vincular un controlador de clic a esa superposición para cerrar $ dialog cuando se hace clic en la superposición.
fuente
no es necesario el complemento de eventos externos ...
simplemente agregue un controlador de eventos al div .ui-widget-overlay:
solo asegúrese de que cualquier selector que utilizó para el diálogo de la interfaz de usuario de jQuery, también se llame para cerrarlo .. es decir, # ui-dialog-selector-va-aquí
fuente
Esto no usa jQuery UI, pero usa jQuery, y puede ser útil para aquellos que no usan jQuery UI por cualquier motivo. Hazlo así:
Entonces, una vez que he mostrado un cuadro de diálogo, agrego un controlador de clic que solo busca el primer clic en cualquier cosa.
Ahora, sería mejor si pudiera hacer que ignorara los clics en cualquier cosa en #dialog y su contenido, pero cuando intenté cambiar $ ('*') con $ (': not ("# dialog, # dialog *") '), aún detectó # clics de diálogo.
De todos modos, estaba usando esto únicamente para una caja de luz de fotos, así que funcionó bien para ese propósito.
fuente
Los ejemplos dados usan un diálogo con id '#dialog', necesitaba una solución que cerrara cualquier diálogo:
Gracias a mi colega Youri Arkesteijn por la sugerencia de usar el prototipo.
fuente
Este es el único método que me funcionó para mi cuadro de diálogo NO MODAL
Todo el crédito va a Axle
Haga clic fuera del cuadro de diálogo no modal para cerrar
fuente
Para aquellos que estén interesados, he creado un complemento genérico que permite cerrar un cuadro de diálogo al hacer clic fuera de él, ya sea un cuadro de diálogo modal o no modal. Admite uno o varios diálogos en la misma página.
Más información aquí: http://www.coheractio.com/blog/closing-jquery-ui-dialog-widget-when-clicking-outside
Laurent
fuente
Utilizo esta solución basada en una publicada aquí:
fuente
Tuve el mismo problema al hacer la vista previa modal en una página. Después de mucho buscar en Google, encontré esta solución muy útil. Con evento y destino, está comprobando dónde ocurrió el clic y, dependiendo de ello, activa la acción o no hace nada.
Sitio de la biblioteca de fragmentos de código
fuente
Es simple, en realidad no necesita ningún complemento, solo jquery o puede hacerlo con un simple javascript.
fuente
No creo que encontrar cosas de diálogo usando $ ('. Any-selector') de todo el DOM sea tan brillante.
Tratar
Realmente está obteniendo la superposición de la instancia de diálogo a la que pertenece, las cosas nunca saldrán mal de esta manera.
fuente
Con el siguiente código, puede simular un clic en el botón 'cerrar' del diálogo (cambie la cadena 'MY_DIALOG' por el nombre de su propio diálogo)
fuente
Código inteligente: estoy usando el siguiente código para que todo quede claro y legible. out side body cerrará el cuadro de diálogo.
fuente
Terminé usando este código que debería funcionar en cualquier cuadro de diálogo abierto en la página, ignora los clics en la información sobre herramientas y también limpia los recursos del cuadro de diálogo que se cierra.
fuente