Eu tenho um jQuery UI Dialog que é exibido quando elementos específicos são clicados. Gostaria de fechar a caixa de diálogo se ocorrer um clique em qualquer lugar que não seja nesses elementos de acionamento ou na própria caixa de diálogo.
Este é o código para abrir a caixa de 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');
});*/
});
Se eu remover o comentário da última parte, a caixa de diálogo nunca será aberta. Presumo que seja porque o mesmo clique que abre a caixa de diálogo está fechando-a novamente.
Nota de código de trabalho final
: Isso está usando o plugin jQuery de eventos externos
$(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');
});
});
Desculpe arrastar isso depois de tanto tempo, mas usei o abaixo. Quaisquer desvantagens? Veja a função aberta ...
fonte
$('.ui-widget-overlay').bind('click', function () { $(this).siblings('.ui-dialog').find('.ui-dialog-content').dialog('close'); });
Esqueça o uso de outro plugin:
Aqui estão três métodos para fechar uma caixa de diálogo da IU do jquery ao clicar fora do popin:
Se a caixa de diálogo for modal / tiver sobreposição de fundo: http://jsfiddle.net/jasonday/6FGqN/
Se a caixa de diálogo for não modal Método 1: método 1: http://jsfiddle.net/jasonday/xpkFf/
Método 2 de diálogo não modal: http://jsfiddle.net/jasonday/eccKr/
fonte
open : function () { $('.ui-widget-overlay').on('click', function () { $(this).parents("body").find(".ui-dialog-content").dialog("close"); }); }
click.myNamespace
Basta adicionar este script global, que fecha todos os diálogos modais apenas clicando fora deles.
fonte
$(document).on('click', '.ui-widget-overlay', function() { $('#'+$('.ui-dialog-content')[0].id).dialog('close'); });
Fiddle mostrando o código acima em ação.
fonte
Tive que fazer duas partes. Primeiro, o manipulador de cliques externo:
Isso chama
dialog('close')
aui-dialog-content
classe genérica e, portanto, fechará todos os diálogos se o clique não tiver origem em um. Também funcionará com diálogos modais, uma vez que a sobreposição não faz parte da.ui-dialog
caixa.O problema é:
Para corrigir isso, tive que adicionar stopPropagation a esses gerenciadores de clique:
fonte
$('body').on('click', '.ui-widget-overlay', function () { $('#myDialog').dialog('close'); });
Esta questão é um pouco antiga, mas caso alguém queira fechar uma caixa de diálogo que NÃO é modal quando o usuário clica em algum lugar, você pode usar isso que tirei do plugin JQuery UI Multiselect . A principal vantagem é que o clique não é "perdido" (se o usuário quiser clicar em um link ou botão, a ação está concluída).
fonte
var $dialog = $(this).dialog('widget');
no manipulador de eventos on-clickVocê pode fazer isso sem usar nenhum plug-in adicional
Aqui, $ diálogo é o diálogo. Basicamente, o que estamos fazendo é obter o último widget de sobreposição sempre que esta caixa de diálogo for aberta e vincular um manipulador de cliques a essa sobreposição para fechar $ diálogo sempre que clicar na sobreposição.
fonte
não há necessidade do plugin de eventos externos ...
basta adicionar um manipulador de eventos ao div .ui-widget-overlay:
apenas certifique-se de que qualquer seletor que você usou para a caixa de diálogo da interface do usuário do jQuery também é chamado para fechá-la .. ou seja, # ui-dialog-selector-goes-here
fonte
Isso não usa jQuery UI, mas usa jQuery e pode ser útil para aqueles que não estão usando jQuery UI por qualquer motivo. Faça assim:
Assim, depois de mostrar uma caixa de diálogo, adiciono um manipulador de clique que procura apenas o primeiro clique em qualquer coisa.
Agora, seria melhor se eu pudesse fazer com que ele ignorasse os cliques em qualquer coisa em #dialog e seu conteúdo, mas quando tentei trocar $ ('*') por $ (': not ("# diálogo, # diálogo *") '), ele ainda detectou #dialog cliques.
De qualquer forma, eu estava usando isso puramente para uma mesa de luz de fotos, então funcionou bem para esse propósito.
fonte
Os exemplos fornecidos usam uma caixa de diálogo com id '#dialog', eu precisava de uma solução que fechasse qualquer caixa de diálogo:
Agradeço ao meu colega Youri Arkesteijn pela sugestão de uso de protótipo.
fonte
Este é o único método que funcionou para mim para meu diálogo NÃO MODAL
Todo o crédito vai para o eixo
Clique fora da caixa de diálogo não modal para fechar
fonte
Para aqueles que estão interessados, criei um plugin genérico que permite fechar um diálogo ao clicar fora dele, seja um diálogo modal ou não modal. Ele suporta um ou vários diálogos na mesma página.
Mais informações aqui: http://www.coheractio.com/blog/closing-jquery-ui-dialog-widget-when-clicking-outside
Laurent
fonte
Eu uso essa solução com base em uma postada aqui:
fonte
Eu tive o mesmo problema ao fazer a visualização modal em uma página. Depois de muito pesquisar no Google, achei essa solução muito útil. Com o evento e o alvo, ele verifica onde o clique aconteceu e, dependendo disso, aciona a ação ou não faz nada.
Site da biblioteca de trechos de código
fonte
É simples, na verdade você não precisa de nenhum plug-in, apenas do jquery ou você pode fazer isso com um javascript simples.
fonte
Eu não acho que encontrar coisas de diálogo usando $ ('. Any-selector') de todo o DOM seja tão brilhante.
Experimentar
Você está realmente obtendo a sobreposição da instância de diálogo à qual ela pertence, as coisas nunca darão errado desta maneira.
fonte
Com o código a seguir, você pode simular um clique no botão 'fechar' da caixa de diálogo (altere a string 'MY_DIALOG' pelo nome de sua própria caixa de diálogo)
fonte
Código inteligente: estou usando o seguinte código para que tudo permaneça claro e legível. o corpo externo fechará a caixa de diálogo.
fonte
Acabei usando este código que deve funcionar em qualquer caixa de diálogo aberta na página, ignora cliques nas dicas de ferramentas e limpa os recursos da caixa de diálogo que está sendo fechada também.
fonte