单击外部时关闭对话框

我有一个 jQueryUI 对话框,它在单击特定元素时显示。我想关闭对话框,如果一个点击发生在任何地方,而不是在这些触发元素或对话框本身。

下面是打开对话框的代码:

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

如果取消最后一部分的注释,对话框将永远不会打开。我假设这是因为打开对话框的同一次点击又关闭了对话框。


最终工作守则
注意: 这是使用 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');
});
});
141105 次浏览

看看 JQuery 外部事件插件

让你做:

$field_hint.bind('clickoutside',function(){
$field_hint.dialog('close');
});
$(".ui-widget-overlay").click (function () {
$("#dialog-id").dialog( "close" );
});

Fiddle 显示了上面的代码。

很抱歉拖了这么长时间,但我使用了下面的。有什么缺点吗? 看到开放函数..。

$("#popup").dialog(
{
height: 670,
width: 680,
modal: true,
autoOpen: false,
close: function(event, ui) { $('#wrap').show(); },
open: function(event, ui)
{
$('.ui-widget-overlay').bind('click', function()
{
$("#popup").dialog('close');
});
}
});

这不使用 jQueryUI,但是使用 jQuery,并且对于那些由于某种原因不使用 jQueryUI 的人可能很有用。这样做:

function showDialog(){
$('#dialog').show();
$('*').on('click',function(e){
$('#zoomer').hide();
});
}


$(document).ready(function(){


showDialog();


});

因此,一旦我显示了一个对话框,我就添加一个单击处理程序,它只查找对任何内容的第一次单击。

现在,如果我能让它忽略 # 对话框及其内容上的任何点击,那就更好了,但是当我尝试用 $(’: not (“ # Dialogue,# Dialogue *”)’切换 $(’*’)时,它仍然检测到 # 对话框点击。

不管怎样,我纯粹是用这个来做照片灯箱,所以这个功能还不错。

我必须做两个部分,首先是外部的点击处理程序:

$(document).on('click', function(e){
if ($(".ui-dialog").length) {
if (!$(e.target).parents().filter('.ui-dialog').length) {
$('.ui-dialog-content').dialog('close');
}
}
});

This calls dialog('close') on the generic ui-dialog-content class, and so will close 所有 dialogs if the click didn't originate in one. It will work with modal dialogs too, since the overlay is not part of the .ui-dialog box.

问题是:

  1. 大多数对话框是由于在对话框外单击而创建的
  2. 这个处理程序在这些单击创建了一个对话框并冒泡到文档之后运行,因此它会立即关闭这些对话框。

为了解决这个问题,我不得不在那些单击处理程序中添加停止传播:

moreLink.on('click', function (e) {
listBox.dialog();
e.stopPropagation(); //Don't trigger the outside click handler
});

这个问题有点老,但是如果有人想关闭一个对话框,这个对话框在用户点击某个地方时是非模态的,你可以使用我从 多选插件中获得的这个。主要的优点是点击不会“丢失”(如果用户想要点击一个链接或按钮,操作就完成了)。

$myselector.dialog({
title: "Dialog that closes when user clicks outside",
modal:false,
close: function(){
$(document).off('mousedown.mydialog');
},
open: function(event, ui) {
var $dialog = $(this).dialog('widget');
$(document).on('mousedown.mydialog', function(e) {
// Close when user clicks elsewhere
if($dialog.dialog('isOpen') && !$.contains($myselector.dialog('widget')[0], e.target)){
$myselector.dialog('close');
}
});
}
});

忘记使用其他插件吧:

这里有3种方法可以在单击外部 popin 时关闭 jquery UI 对话框:

如果对话框是模式/有背景覆盖: http://jsfiddle.net/jasonday/6FGqN/

jQuery(document).ready(function() {
jQuery("#dialog").dialog({
bgiframe: true,
autoOpen: false,
height: 100,
modal: true,
open: function(){
jQuery('.ui-widget-overlay').bind('click',function(){
jQuery('#dialog').dialog('close');
})
}
});
});

If dialog is non-modal Method 1: method 1: http://jsfiddle.net/jasonday/xpkFf/

 // Close Pop-in If the user clicks anywhere else on the page
jQuery('body')
.bind(
'click',
function(e){
if(
jQuery('#dialog').dialog('isOpen')
&& !jQuery(e.target).is('.ui-dialog, a')
&& !jQuery(e.target).closest('.ui-dialog').length
){
jQuery('#dialog').dialog('close');
}
}
);

非模态对话框方法2: http://jsfiddle.net/jasonday/eccKr/

  $(function() {
$( "#dialog" ).dialog({
autoOpen: false,
minHeight: 100,
width: 342,
draggable: true,
resizable: false,
modal: false,
closeText: 'Close',
open: function() {
closedialog = 1;
$(document).bind('click', overlayclickclose);
},
focus: function() {
closedialog = 0;
},
close: function() {
$(document).unbind('click');
}






});


$('#linkID').click(function() {
$('#dialog').dialog('open');
closedialog = 0;
});


var closedialog;


function overlayclickclose() {
if (closedialog) {
$('#dialog').dialog('close');
}


//set to one because click on dialog box sets to zero
closedialog = 1;
}




});

只要添加这个全局脚本,就可以关闭所有的模态对话框,只需点击它们。

$(document).ready(function()
{
$(document.body).on("click", ".ui-widget-overlay", function()
{
$.each($(".ui-dialog"), function()
{
var $dialog;
$dialog = $(this).children(".ui-dialog-content");
if($dialog.dialog("option", "modal"))
{
$dialog.dialog("close");
}
});
});;
});

您可以在不使用任何其他插件的情况下完成此操作

var $dialog= $(document.createElement("div")).appendTo(document.body);
var dialogOverlay;


$dialog.dialog({
title: "Your title",
modal: true,
resizable: true,
draggable: false,
autoOpen: false,
width: "auto",
show: "fade",
hide: "fade",
open:function(){
$dialog.dialog('widget').animate({
width: "+=300",
left: "-=150"
});


//get the last overlay in the dom
$dialogOverlay = $(".ui-widget-overlay").last();
//remove any event handler bound to it.
$dialogOverlay.unbind();
$dialogOverlay.click(function(){
//close the dialog whenever the overlay is clicked.
$dialog.dialog("close");
});
}
});

这里的对话框就是。 What we are basically doing is to get the last overlay widget whenever this dialog is opened and binding a click handler to that overlay to close $dialog as anytime the overlay is clicked.

不需要外部事件插件..。

只需向. ui-widget-overlay div 添加一个事件处理程序:

jQuery(document).on('click', 'body > .ui-widget-overlay', function(){
jQuery("#ui-dialog-selector-goes-here").dialog("close");
return false;
});

只需要确保无论您在 jQueryui 对话框中使用什么选择器,都会被调用来关闭它。.即 # ui-Dialogue-selector-goes-here

在给定的例子中,使用一个对话框 id’# 对话框’,我需要一个解决方案,关闭任何对话框:

$.extend($.ui.dialog.prototype.options, {
modal: true,
open: function(object) {
jQuery('.ui-widget-overlay').bind('click', function() {
var id = jQuery(object.target).attr('id');
jQuery('#'+id).dialog('close');
})
}
});

感谢我的同事 Youri Arkesteijn 关于使用原型的建议。

对于那些你感兴趣的,我已经创建了一个通用的插件,使得能够关闭一个对话框时,点击外面,无论它是一个模态或非模态的对话框。它支持同一页上的一个或多个对话框。

More information here: http://www.coheractio.com/blog/closing-jquery-ui-dialog-widget-when-clicking-outside

Laurent

I use this solution based in one posted here:

var g_divOpenDialog = null;
function _openDlg(l_d) {


// http://stackoverflow.com/questions/2554779/jquery-ui-close-dialog-when-clicked-outside
jQuery('body').bind(
'click',
function(e){
if(
g_divOpenDialog!=null
&& !jQuery(e.target).is('.ui-dialog, a')
&& !jQuery(e.target).closest('.ui-dialog').length
){
_closeDlg();
}
}
);


setTimeout(function() {
g_divOpenDialog = l_d;
g_divOpenDialog.dialog();
}, 500);
}
function _closeDlg() {
jQuery('body').unbind('click');
g_divOpenDialog.dialog('close');
g_divOpenDialog.dialog('destroy');
g_divOpenDialog = null;
}

İt's simple actually you don't need any plugins, just jquery or you can do it with simple javascript.

$('#dialog').on('click', function(e){
e.stopPropagation();
});
$(document.body).on('click', function(e){
master.hide();
});

我不认为使用 $(’. any-selector’)从整个 DOM 中查找对话框是如此明亮。

试试看

$('<div />').dialog({
open: function(event, ui){
var ins = $(this).dialog('instance');
var overlay = ins.overlay;
overlay.off('click').on('click', {$dialog: $(this)}, function(event){
event.data.$dialog.dialog('close');
});
}
});

You're really getting the overlay from the dialog instance it belongs to, things will never go wrong this way.

使用以下代码,您可以模拟单击对话框 (change the string 'MY_DIALOG' for the name of your own dialog)的“关闭”按钮

$("div[aria-labelledby='ui-dialog-title-MY_DIALOG'] div.ui-helper-clearfix a.ui-dialog-titlebar-close")[0].click();

我有同样的问题,而使预览模式在一个网页。经过大量的谷歌搜索,我找到了这个非常有用的解决方案。对于事件和目标,它检查点击发生的位置,并根据它触发动作或什么也不做。

代码段库网站

$('#modal-background').mousedown(function(e) {
var clicked = $(e.target);
if (clicked.is('#modal-content') || clicked.parents().is('#modal-content'))
return;
} else {
$('#modal-background').hide();
}
});

这是唯一的方法,为我的工作为我的非模态对话框

$(document).mousedown(function(e) {
var clicked = $(e.target); // get the element clicked
if (clicked.is('#dlg') || clicked.parents().is('#dlg') || clicked.is('.ui-dialog-titlebar')) {
return; // click happened within the dialog, do nothing here
} else { // click was outside the dialog, so close it
$('#dlg').dialog("close");
}
});

所有功劳都归埃克斯利
Click outside non-modal dialog to close

智能密码: 我使用以下代码,以便每件事情仍然清晰可读。 外侧体将关闭对话框。

$(document).ready(function () {
$('body').on('click', '.ui-widget-overlay', closeDialogBox);
});


function closeDialogBox() {
$('#dialog-message').dialog('close');
}

我最终使用了这段代码,它可以处理页面上任何打开的对话框,忽略对工具提示的点击,并清理正在关闭的对话框的资源。


$(document).mousedown(function(e) {
var clicked = $(e.target); // get the element clicked
if (clicked.is('.ui-dialog-content, .ui-dialog-titlebar, .ui-tooltip') || clicked.parents().is('.ui-dialog-content, .ui-dialog-titlebar, .ui-tooltip')) {
return; // click happened within the dialog, do nothing here
} else { // click was outside the dialog, so close it
$('.ui-dialog-content').dialog("close");
$('.ui-dialog-content').dialog("destroy");
$('.ui-dialog-content').detach();


}
});

我只是碰巧需要关门。单击元素外的对话框。我有一个页面有很多信息对话框,所以我需要一些东西来处理它们。我是这么处理的:

$(document).ready(function () {
$(window).click(function (e) {
$(".dialogGroup").each(function () {
$(this).dialog('close');
})
});
$("#lostEffClick").click(function () {
event.stopPropagation();
$("#lostEffDialog").dialog("open");
};
});