jQuery UI modal dialog global close on overlay click
我的页面上有几个模式对话框,将来还会更多。我计划对它们全部使用模式对话框,并在单击覆盖时将其关闭。我不想在实例化对话框的每个地方都绑定overlay click事件,因此我想扩展对话框原型或类似的东西,以使其全局绑定所有模式对话框的click事件。
http://jsfiddle.net/jurchiks/kLBJm/1/
假设我有以下对话框构造函数:
1 2 3 4 5 6 7 | $('#dialog').dialog({ modal: true, open: function() { $(this).find('input[type=text]').focus(); } }); |
我尝试将这段代码放在对话框实例化之前:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $.extend( $.ui.dialog.prototype.options, { open: function() { var dialog = this; $('.ui-widget-overlay').on('click', function() { $(dialog).dialog('close'); }); } } ); |
但它不起作用,jQuery仅调用在对话框参数中传递的open函数。我怀疑这只会更改默认的打开函数,而传递给构造函数的任何内容都将覆盖此函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $.widget( "ui.dialog", $.ui.dialog, { open: function() { this._super(); var dialog = this; $('.ui-widget-overlay').on('click', function() { $(dialog).dialog('close'); }); } } ); |
这也不起作用; jQuery吐出一个错误-"初始化前无法在对话框上调用方法;??试图打开方法\\'close \\'"-即使弹出窗口处于打开状态。
我怎么做才能使覆盖层点击
好吧,我制作了自己的略带hackish的解决方案,但似乎只适用于我的jQuery(1.10.3)版本。我使用jsfiddle提供的jQuery UI 1.9.2尝试了完全相同的代码,但它只是没有调用该函数。我猜测函数名称已在1.10中重命名。
无论如何,这是代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $.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的代码以找出最简单的方法即可做到。
P.S。只需很少的努力就可以将其内置到对话框插件中,这是很明显的,没有人做过。您需要做的就是添加一个选项,以启用/禁用重叠点击关闭功能,以及我函数的最后一行(如果检查该选项是否已启用),总计IF。 4行。
编辑:为当前的jQuery UI创建一个补丁:https://gist.github.com/jurchiks/7264596
这不是优先级,但是您可以听文档上的某些事件:
1 2 3 4 5 6 7 8 9 10 | $(function() { var theDialog; $( document ).on("click", ".ui-widget-overlay",function(){ $(theDialog).dialog("close"); }); $( document ).on("dialogopen", function( event, ui ) { theDialog=$(event.target); }); }); |