jQuery UI – closures对话框当单击外部
我有一个jQuery UI对话框,当特定的元素被点击时显示。 如果点击发生在触发元素或对话框本身以外的任何地方,我想closures对话框。
以下是打开对话框的代码:
$(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'); });*/ });
如果我取消注释最后一部分,对话框永远不会打开。 我认为这是因为打开对话框的同样的点击是再次closures它。
最后工作代码
注意:这是使用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'); }); });
查看jQuery Outside Events插件
让你做:
$field_hint.bind('clickoutside',function(){ $field_hint.dialog('close'); });
对不起,拖了这么长时间,但我用下面。 任何缺点? 看到打开的function…
$("#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'); }); } });
忘记使用另一个插件:
这里有3个方法来closures一个jQuery UI对话框,当点击外面的popin时:
如果对话框是模式/有背景覆盖: 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'); }) } }); });
如果对话框是非模态的方法1:方法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; } });
只需添加这个全局脚本,closures所有的modal dialog,只需点击它们。
$(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"); } }); });; });
$(".ui-widget-overlay").click (function () { $("#dialog-id").dialog( "close" ); });
小提琴上演示了上面的代码。
我必须做两件事。 首先是外部点击处理程序:
$(document).on('click', function(e){ if ($(".ui-dialog").length) { if (!$(e.target).parents().filter('.ui-dialog').length) { $('.ui-dialog-content').dialog('close'); } } });
这会在通用的ui-dialog-content
类上调用dialog('close')
,如果点击不是从一个对话框开始的话,closures所有的对话框。 它也将与modal dialog一起工作,因为叠加层不是.ui-dialog
一部分。
问题是:
- 大多数对话框是由于对话框外的点击而创build的
- 这个处理程序在这些点击创build一个对话框之后运行,并冒泡到文档中,所以它立即closures它们。
要解决这个问题,我必须添加stopPropagation到这些点击处理程序:
moreLink.on('click', function (e) { listBox.dialog(); e.stopPropagation(); //Don't trigger the outside click handler });
这个问题有点老了,但是如果有人想closures一个用户在某处点击的非modal dialog时,可以使用我从JQuery UI Multiselect插件中获取的对话框。 主要优点是点击不是“丢失”(如果用户想点击一个链接或一个button,操作完成)。
$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'); } }); } });
你可以做到这一点,而不使用任何额外的插件
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"); }); } });
这里$对话框是对话框。 我们基本上做的是每当打开对话框时获取最后一个覆盖小部件,并将点击处理程序绑定到该覆盖上,以随时closures$对话框。
不需要外部事件插件…
只需添加一个事件处理程序到.ui-widget-overlay div:
jQuery(document).on('click', 'body > .ui-widget-overlay', function(){ jQuery("#ui-dialog-selector-goes-here").dialog("close"); return false; });
只要确保无论您用于jQuery ui对话框的select器是否也被调用来closures它。即#ui-dialog-selector-goes-here
这不使用jQuery UI,而是使用jQuery,对于那些因为任何原因不使用jQuery UI的人可能会有用。 这样做:
function showDialog(){ $('#dialog').show(); $('*').on('click',function(e){ $('#zoomer').hide(); }); } $(document).ready(function(){ showDialog(); });
所以,一旦我显示一个对话框,我添加一个点击处理程序,只查找任何东西的第一次点击。
现在,如果我可以忽略对#dialog及其内容的任何点击,但是当我尝试用$(':'(“#dialog,#dialog *”)切换$('*') '),它仍然检测到#dialog点击。
无论如何,我是用这个纯粹的照片灯箱,所以它为此目的行得通。
给定的例子使用一个id为“#dialog”的对话框,我需要一个closures任何对话框的解决scheme:
$.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提出使用原型的build议。
对于那些你感兴趣的人,我创build了一个通用插件,当点击它的外部时可以closures对话框,无论是模态还是非modal dialog。 它支持在同一页面上的一个或多个对话框。
更多信息在这里: http : //www.coheractio.com/blog/closing-jquery-ui-dialog-widget-when-clicking-outside
洛朗
我在这里使用这个解决scheme:
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; }
在一个页面上制作预览模式时,我遇到了同样的问题。 经过大量的谷歌search,我发现这个非常有用的解决scheme。 事件和目标是检查点击发生的地方,并根据它触发行动或什么都不做。
代码片段库网站
$('#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"); } });
所有功劳都归Axle所有
点击外部非modal dialogclosures
İt的简单,其实你不需要任何插件,只是jQuery的,或者你可以用简单的JavaScript来做到这一点。
$('#dialog').on('click', function(e){ e.stopPropagation(); }); $(document.body).on('click', function(e){ master.hide(); });
我不认为使用$('。any-selector')从整个DOM中find对话框的东西是如此明亮。
尝试
$('<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'); }); } });
你真的从它所属的对话框实例中获得覆盖,事情永远不会出错。
使用下面的代码,你可以模拟点击对话框的“closures”button(改变string“MY_DIALOG”为你自己的对话框的名称)
$("div[aria-labelledby='ui-dialog-title-MY_DIALOG'] div.ui-helper-clearfix a.ui-dialog-titlebar-close")[0].click();