jQuery UI Dialog 创建友好的弹出对话框实现代码


Posted in Javascript onApril 12, 2012

主要参数
jQuery UI Dialog常用的参数有:

1、autoOpen:默认true,即dialog方法创建就显示对话框
2、buttons:默认无,用于设置显示的按钮,可以是JSON和Array形式:
{"确定":function(){},"取消":function(){}}
[{text:"确定", click: function(){}},{text:"取消",click:function(){}}]
3、modal:默认false,是否模态对话框,如果设置为true则会创建一个遮罩层把页面其他元素遮住
4、title:标题
5、draggable:是否可手动,默认true
6、resizable:是否可调整大小,默认true
7、width:宽度,默认300
8、height:高度,默认"auto"
其他一些不太常用的参数:

1、closeOnEscape:默认true,按esc键关闭对话框
2、show:打开对话框的动画效果
3、hide:关闭对话框的动画效果
4、position:对话框显示的位置,默认"center",可以设置成字符串或数组:
'center', 'left', 'right', 'top', 'bottom'
['right','top'],通过上面的几个字符串组合(x,y)
[350,100],绝对的数值(x,y)
5、minWidth:默认150,最小宽度
6、minHeight:默认150,最小高度
使用方法:

$("...").dialog({ 
title: "标题", 
//...更多参数 
});

主要方法
jQuery UI Dialog提供了一些方法来控制对话框,仅列出常用的:

open:打开对话框
close:关闭对话框(通过close不会销毁,还能继续使用)
destroy:销毁对话框
option:设置参数,即前面列出的参数
使用的时候作为dialog方法的参数:

var dlg = $("...").dialog({ 
//...各种参数 
}); 
dlg.dialog("option", { title: "标题" }); // 设置参数 
dlg.dialog("open"); // 使用open方法打开对话框

主要事件
jQuery UI Dialog提供了一些事件,比如打开、关闭对话框的时候做一些额外的事情:

open:打开时
close:关闭时
create:创建时
resize:调整大小时
drag:拖动时
使用方法同参数的使用方法,比如在打开时隐藏关闭按钮:

$("...").dialog({ 
//...各种参数 
open: function(event, ui) { 
$(".ui-dialog-titlebar-close", $(this).parent()).hide(); 
} 
});

具体使用
以下封装了一些常用的提示信息,不再详细解释:
jQuery.extend(jQuery, { 
// jQuery UI alert弹出提示 
jqalert: function(text, title, fn) { 
var html = 
'<div class="dialog" id="dialog-message">' + 
' <p>' + 
' <span class="ui-icon ui-icon-circle-check" style="float: left; margin: 0 7px 0 0;"></span>' + text + 
' </p>' + 
'</div>'; 
return $(html).dialog({ 
//autoOpen: false, 
resizable: false, 
modal: true, 
show: { 
effect: 'fade', 
duration: 300 
}, 
title: title || "提示信息", 
buttons: { 
"确定": function() { 
var dlg = $(this).dialog("close"); 
fn && fn.call(dlg); 
} 
} 
}); 
}, 
// jQuery UI alert弹出提示,一定间隔之后自动关闭 
jqtimeralert: function(text, title, fn, timerMax) { 
var dd = $( 
'<div class="dialog" id="dialog-message">' + 
' <p>' + 
' <span class="ui-icon ui-icon-circle-check" style="float: left; margin: 0 7px 0 0;"></span>' + text + 
' </p>' + 
'</div>'); 
dd[0].timerMax = timerMax || 3; 
return dd.dialog({ 
//autoOpen: false, 
resizable: false, 
modal: true, 
show: { 
effect: 'fade', 
duration: 300 
}, 
open: function(e, ui) { 
var me = this, 
dlg = $(this), 
btn = dlg.parent().find(".ui-button-text").text("确定(" + me.timerMax + ")"); 
--me.timerMax; 
me.timer = window.setInterval(function() { 
btn.text("确定(" + me.timerMax + ")"); 
if (me.timerMax-- <= 0) { 
dlg.dialog("close"); 
fn && fn.call(dlg); 
window.clearInterval(me.timer); // 时间到了清除计时器 
} 
}, 1000); 
}, 
title: title || "提示信息", 
buttons: { 
"确定": function() { 
var dlg = $(this).dialog("close"); 
fn && fn.call(dlg); 
window.clearInterval(this.timer); // 清除计时器 
} 
}, 
close: function() { 
window.clearInterval(this.timer); // 清除计时器 
} 
}); 
}, 
// jQuery UI confirm弹出确认提示 
jqconfirm: function(text, title, fn1, fn2) { 
var html = 
'<div class="dialog" id="dialog-confirm">' + 
' <p>' + 
' <span class="ui-icon ui-icon-alert" style="float: left; margin: 0 7px 20px 0;"></span>' + text + 
' </p>' + 
'</div>'; 
return $(html).dialog({ 
//autoOpen: false, 
resizable: false, 
modal: true, 
show: { 
effect: 'fade', 
duration: 300 
}, 
title: title || "提示信息", 
buttons: { 
"确定": function() { 
var dlg = $(this).dialog("close"); 
fn1 && fn1.call(dlg, true); 
}, 
"取消": function() { 
var dlg = $(this).dialog("close"); 
fn2 && fn2(dlg, false); 
} 
} 
}); 
}, 
// jQuery UI 弹出iframe窗口 
jqopen: function(url, options) { 
var html = 
'<div class="dialog" id="dialog-window" title="提示信息">' + 
' <iframe src="' + url + '" frameBorder="0" style="border: 0; " scrolling="auto" width="100%" height="100%"></iframe>' + 
'</div>'; 
return $(html).dialog($.extend({ 
modal: true, 
closeOnEscape: false, 
draggable: false, 
resizable: false, 
close: function(event, ui) { 
$(this).dialog("destroy"); // 关闭时销毁 
} 
}, options)); 
}, 
// jQuery UI confirm提示 
confirm: function(evt, text, title) { 
evt = $.event.fix(evt); 
var me = evt.target; 
if (me.confirmResult) { 
me.confirmResult = false; 
return true; 
} 
jQuery.jqconfirm(text, title, function(e) { 
me.confirmResult = true; 
if (e) { 
if (me.href && $.trim(me.href).indexOf("javascript:") == 0) { 
$.globalEval(me.href); 
me.confirmResult = false; 
return; 
} 
var t = me.type && me.type.toLowerCase(); 
if (t && me.name && (t == "image" || t == "submit" || t == "button")) { 
__doPostBack(me.name, ""); 
me.confirmResult = false; 
return; 
} 
if (me.click) me.click(evt); 
} 
return false; 
}); 
return false; 
} 
});

以上代码还存在一个问题,就是每次弹出框关闭之后都没有销毁。

解决办法有(具体不演示):

在close事件里面destroy
把alert/confirm提供里的dialog实例设置成静态的
在外部调用使用单个dialog实例
演示程序
html代码如下:

<div> 
<input type="button" id="button1" value="普通提示" /> 
<input type="button" id="button2" value="自动关闭提示" /> 
<input type="button" id="button3" value="确认提示" /> 
<input type="button" id="button4" value="确认提示2" /> 
<input type="button" id="button5" value="打开窗口" /> 
</div>

相应js代码如下:
$(function() { 
$("#button1").click(function() { 
$.jqalert("这是普通提示!"); 
}); 
$("#button2").click(function() { 
$.jqtimeralert("这是自动关闭的提示!", "自动关闭提示", 
function() { 
$.jqalert("时间到"); 
}); 
}); 
$("#button3").click(function() { 
$.jqconfirm("确定要这么做吗?", "确认提示", 
function() { 
$.jqalert("点了确定"); 
}, 
function() { 
$.jqalert("点了取消"); 
}); 
}); 
$("#button4").click(function(e) { 
if ($.confirm(e, "确定要这么做吗?")) 
$.jqalert("点了确定"); 
}); 
$("#button5").click(function(e) { 
$.jqopen("http://lwme.cnblogs.com/", { title: "我的博客", width: 700, height: 500 }); 
}); 
});

对于服务器端控件使用confirm,可能需要如下方法:
$("#button4").click(function(e) { 
if (!$.confirm(e, "确定要这么做吗?")) { 
e.stopPropagation(); 
return false; 
} 
});

额外再提一下,jQuery UI使用的字体都是以em为单位,可能会导致平常使用时dialog变得比较大,可以额外设置以下样式:
body { font-size: 12px; } // 默认字体大小 
/*jQuery UI fakes*/ 
.ui-widget { font-size: 1em; } 
.ui-dialog .ui-dialog-buttonpane { padding-top: .1em; padding-bottom: .1em; }

这样子,dialog的大小看起来就比较正常了。
在Telerik RadControls for asp.net ajax中使用
主要是针对telerik RadButton控件,定义如下两个函数:
// 用于RadButton的confirm确认回调,即触发按钮点击 
function radcallback(s) { 
return Function.createDelegate(s, function(argument) { 
if (argument) { 
this.click(); 
} 
}); 
} 
// 用于为RadButton添加confirm提示 
function radconfirm2(textOrFn, title, callback) { 
return function(s, e) { 
$.jqconfirm(textOrFn, title, callback || radcallback(s)); 
//radconfirm(textOrFn, callback, 280, 50, null, title); 
e.set_cancel(true); 
}; 
}

然后可以这样使用:
<telerik:RadButton ... OnClientClicking="radconfirm2('确定要这么做吗?')" />

结尾
更多的资料请看jQuery UI Dialog官方演示:http://jqueryui.com/demos/dialog。
三水点靠木下载地址 https://3water.com/jiaoben/15574.html
本文演示下载 lwme-jquery-ui-dialog-demo.7z
作者:?逶
出处:http://lwme.cnblogs.com/

Javascript 相关文章推荐
js实现iframe动态调整高度的代码
Jan 06 Javascript
Javascript 错误处理的几种方法
Jun 13 Javascript
JS完成代码前最好对其做5件事
Apr 07 Javascript
jquery任意位置浮动固定层插件用法实例
May 29 Javascript
jquery获取url参数及url加参数的方法
Oct 26 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
Nov 15 Javascript
JS实现字符串转日期并比较大小实例分析
Dec 09 Javascript
jQuery Position方法使用和兼容性
Aug 23 jQuery
示例vue 的keep-alive缓存功能的实现
Dec 13 Javascript
node app 打包工具pkg的具体使用
Jan 17 Javascript
JS通过识别id、value值对checkbox设置选中状态
Feb 19 Javascript
我所理解的JavaScript中的this指向
Sep 04 Javascript
window.parent与window.openner区别介绍
Apr 12 #Javascript
JavaScript单元测试ABC
Apr 12 #Javascript
扩展JavaScript功能的正确方法(译文)
Apr 12 #Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
Apr 11 #Javascript
JQuery学习笔录 简单的JQuery
Apr 09 #Javascript
广泛收集的jQuery拖放插件集合
Apr 09 #Javascript
深入分析js中的constructor和prototype
Apr 07 #Javascript
You might like
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
vue切换菜单取消未完成接口请求的案例
2020/11/13 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
[03:00]2014DOTA2国际邀请赛 Titan淘汰潸然泪下Ohaiyo专访
2014/07/15 DOTA
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
布同自制Python函数帮助查询小工具
2011/03/13 Python
python分割文件的常用方法
2014/11/01 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
python实现发送邮件功能
2017/07/22 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
Django中Middleware中的函数详解
2019/07/18 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
Python编写memcached启动脚本代码实例
2020/08/14 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
中秋节超市促销方案
2014/01/30 职场文书
爱国演讲稿500字
2014/05/04 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
教师节寄语2015
2015/03/23 职场文书
居住证明范文
2015/06/17 职场文书
就业证明函
2015/06/17 职场文书
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL