繁体   English   中英

jQuery UI模态对话框全局单击覆盖关闭

[英]jQuery UI modal dialog global close on overlay click

我的页面上有几个模式对话框,将来还会有更多。 我计划对它们全部使用模式对话框,并在单击叠加时关闭它们。 我不想在实例化对话框的每个地方都绑定overlay click事件,所以我想扩展对话框原型或类似的东西,使其在所有模式对话框中全局绑定click事件。

http://jsfiddle.net/jurchiks/kLBJm/1/

假设我有以下对话框构造函数:

$('#dialog').dialog({
    modal: true,
    open: function()
    {
        $(this).find('input[type=text]').focus();
    }
});

我尝试将这段代码放在对话框实例化之前:

$.extend(
    $.ui.dialog.prototype.options,
    {
        open: function()
        {
            var dialog = this;
            $('.ui-widget-overlay').on('click', function()
            {
                $(dialog).dialog('close');
            });
        }
    }
);

但它不起作用,jQuery仅调用在对话框参数中传递的open函数。 我怀疑这只会更改默认的打开函数,而传递给构造函数的任何内容都将覆盖此函数。

$.widget(
    "ui.dialog",
    $.ui.dialog,
    {
        open: function()
        {
            this._super();
            var dialog = this;
            $('.ui-widget-overlay').on('click', function()
            {
                $(dialog).dialog('close');
            });
        }
    }
);

这也不起作用; jQuery吐出一个错误-“在初始化之前无法在对话框上调用方法;​​试图调用方法'close'”-即使弹出窗口处于打开状态。 我该如何做才能使覆盖点击和关闭事件是全局且不可替代的?

PS为什么jQuery UI库没有提供此功能? 我认为这很受欢迎。

好的,我制定了自己的略带hackish的解决方案,但似乎只适用于我的jQuery(1.10.3)版本。 我使用jsfiddle提供的jQuery UI 1.9.2尝试了完全相同的代码,但它只是没有调用该函数。 我猜函数名称已在1.10中重命名。

无论如何,这是代码:

$.widget(
    'ui.dialog',
    $.ui.dialog,
    {
        _createOverlay: function()
        {
            this._super();

            if (!this.options.modal)
            {
                return;
            }

            this._on(this.overlay, { click: 'close' });
        }
    }
);

和测试提琴: http : //jsfiddle.net/jurchiks/R944y/1/

不得不向其添加外部jQuery UI 1.10.3 CDN链接以使其正常运行,但是-至少它可以正常运行,并且这是一个非常简单的解决方案,只需要深入研究jQuery UI的代码以找出最简单的方法即可。

PS这将花费很少的精力构建到对话框插件本身中,这是很明显的,没有人做。 您所需要做的就是添加一个选项,以启用/禁用重叠点击关闭功能;如果要检查该选项是否启用,我的函数的最后一行在IF中,总计为max。 4行。

编辑:为当前的jQuery UI创建了一个补丁: https : //gist.github.com/jurchiks/7264596

这不是覆盖,但是您可以听文档上的某些事件:

$(function() {
  var theDialog;
  $( document ).on("click",
    ".ui-widget-overlay",function(){
      $(theDialog).dialog("close");
  });
  $( document ).on( "dialogopen", function( event, ui ) {
    theDialog=$(event.target);
  });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM