J'ai une boîte de dialogue d'interface utilisateur jQuery qui s'affiche lorsque l'utilisateur clique sur des éléments spécifiques. Je voudrais fermer la boîte de dialogue si un clic se produit ailleurs que sur ces éléments déclencheurs ou sur la boîte de dialogue elle-même.
Voici le code pour ouvrir la boîte de dialogue:
$(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 je décommente la dernière partie, la boîte de dialogue ne s'ouvre jamais. Je suppose que c'est parce que le même clic qui ouvre la boîte de dialogue la ferme à nouveau.
Note sur le code de travail final
: Ceci utilise le plugin jQuery Outside Events
$(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');
});
});
Désolé de faire glisser cela après si longtemps, mais j'ai utilisé le ci-dessous. Des inconvénients? Voir la fonction ouverte ...
la source
$('.ui-widget-overlay').bind('click', function () { $(this).siblings('.ui-dialog').find('.ui-dialog-content').dialog('close'); });
Oubliez d'utiliser un autre plugin:
Voici 3 méthodes pour fermer une boîte de dialogue d'interface utilisateur jquery lorsque vous cliquez sur popin extérieur:
Si la boîte de dialogue est modale / a une superposition d'arrière-plan: http://jsfiddle.net/jasonday/6FGqN/
Si le dialogue n'est pas modal Méthode 1: méthode 1: http://jsfiddle.net/jasonday/xpkFf/
Méthode de dialogue non modale 2: http://jsfiddle.net/jasonday/eccKr/
la source
open : function () { $('.ui-widget-overlay').on('click', function () { $(this).parents("body").find(".ui-dialog-content").dialog("close"); }); }
click.myNamespace
Ajoutez simplement ce script global, qui ferme toutes les boîtes de dialogue modales en cliquant simplement sur leur site.
la source
$(document).on('click', '.ui-widget-overlay', function() { $('#'+$('.ui-dialog-content')[0].id).dialog('close'); });
Fiddle montrant le code ci-dessus en action.
la source
J'ai dû faire deux parties. D'abord le gestionnaire de clics extérieur:
Cela fait appel
dialog('close')
à laui-dialog-content
classe générique , et fermera donc toutes les boîtes de dialogue si le clic ne provenait pas d'une seule. Cela fonctionnera également avec les boîtes de dialogue modales, car la superposition ne fait pas partie de la.ui-dialog
boîte.Le problème est:
Pour résoudre ce problème, j'ai dû ajouter stopPropagation à ces gestionnaires de clics:
la source
$('body').on('click', '.ui-widget-overlay', function () { $('#myDialog').dialog('close'); });
Cette question est un peu ancienne, mais au cas où quelqu'un voudrait fermer une boîte de dialogue qui n'est PAS modale lorsque l'utilisateur clique quelque part, vous pouvez utiliser celle que j'ai tirée du plugin JQuery UI Multiselect . Le principal avantage est que le clic n'est pas "perdu" (si l'utilisateur veut cliquer sur un lien ou un bouton, l'action est terminée).
la source
var $dialog = $(this).dialog('widget');
dans le gestionnaire d'événements on-clickVous pouvez le faire sans utiliser de plug-in supplémentaire
Ici, $ dialog est le dialogue. Ce que nous faisons essentiellement est d'obtenir le dernier widget de superposition chaque fois que cette boîte de dialogue est ouverte et de lier un gestionnaire de clic à cette superposition pour fermer $ dialog à chaque fois que l'on clique sur la superposition.
la source
pas besoin du plugin d'événements extérieurs ...
ajoutez simplement un gestionnaire d'événements à la div .ui-widget-overlay:
assurez-vous simplement que le sélecteur que vous avez utilisé pour la boîte de dialogue jQuery ui, est également appelé pour le fermer .. ie # ui-dialog-selector-going-here
la source
Cela n'utilise pas l'interface utilisateur jQuery, mais utilise jQuery et peut être utile pour ceux qui n'utilisent pas l'interface utilisateur jQuery pour une raison quelconque. Faites-le comme ceci:
Donc, une fois que j'ai montré une boîte de dialogue, j'ajoute un gestionnaire de clics qui ne recherche que le premier clic sur quoi que ce soit.
Maintenant, ce serait mieux si je pouvais le faire ignorer les clics sur n'importe quoi sur #dialog et son contenu, mais quand j'essayais de changer $ ('*') avec $ (': not ("# dialog, # dialog *") '), il a quand même détecté des clics #dialog.
Quoi qu'il en soit, je l'utilisais uniquement pour une lightbox photo, donc cela fonctionnait bien dans ce but.
la source
Les exemples donnés utilisent une boîte de dialogue avec l'ID '#dialog', j'avais besoin d'une solution qui ferme toutes les boîtes de dialogue:
Merci à mon collègue Youri Arkesteijn pour la suggestion d'utiliser un prototype.
la source
C'est la seule méthode qui a fonctionné pour moi pour ma boîte de dialogue NON-MODALE
Tout le mérite revient à Axle
Cliquez en dehors de la boîte de dialogue non modale pour fermer
la source
Pour ceux qui vous intéressent, j'ai créé un plugin générique qui permet de fermer une boîte de dialogue en cliquant en dehors de celle-ci, qu'il s'agisse d'une boîte de dialogue modale ou non modale. Il prend en charge une ou plusieurs boîtes de dialogue sur la même page.
Plus d'informations ici: http://www.coheractio.com/blog/closing-jquery-ui-dialog-widget-when-clicking-outside
Laurent
la source
J'utilise cette solution basée sur celle publiée ici:
la source
J'ai eu le même problème lors de la création d'un aperçu modal sur une page. Après de nombreuses recherches sur Google, j'ai trouvé cette solution très utile. Avec l'événement et la cible, il vérifie où le clic s'est produit et, en fonction de cela, déclenche l'action ou ne fait rien.
Site de la bibliothèque d'extraits de code
la source
C'est simple en fait, vous n'avez pas besoin de plugins, juste jquery ou vous pouvez le faire avec un simple javascript.
la source
Je ne pense pas que trouver des dialogues en utilisant $ ('. Any-selector') de tout le DOM soit si brillant.
Essayer
Vous obtenez vraiment la superposition de l'instance de dialogue à laquelle elle appartient, les choses ne se passeront jamais de cette façon.
la source
Avec le code suivant, vous pouvez simuler un clic sur le bouton 'fermer' de la boîte de dialogue (changer la chaîne 'MY_DIALOG' pour le nom de votre propre boîte de dialogue)
la source
Smart Code: J'utilise le code suivant pour que tout reste clair et lisible. à l'extérieur du corps fermera la boîte de dialogue.
la source
J'ai fini par utiliser ce code qui devrait fonctionner sur toutes les boîtes de dialogue ouvertes sur la page, ignore les clics sur les info-bulles et nettoie également les ressources de la boîte de dialogue en cours de fermeture.
la source