学习从实践开始之jQuery插件开发 对话框插件开发


Posted in Javascript onApril 26, 2012

前言:

之所以写下这篇文章,是想将我的想法分享给大家;对于初学者,我希望他能从这篇文章中获取对他有用的东西,对于经验丰富的开发者,我希望他能指出我的不足,给我更多的意见和建议;目的就是共同进步。

一.要做什么插件?

我想要实现一个插件可以取代浏览器默认的弹出对话框或窗体,就是我们通过调用window.alert,window.confirm,window.prompt这些方法 所弹出的网页对话框,通过调用window.open,window.showModalDialog,window.showModelessDialog 所弹出的窗体。

之所以这样做是因为:浏览器默认的对话框功能简单,不能满足更多需要;用户体验差。现代浏览器很多都会默认阻止弹出窗体(可能是因为在以前弹出广告太猖獗的原因吧,还记得03,40年那阵,看个XX网站弹了一堆窗口,关都关不过来,浏览器都弄死了,甚至电脑都当机了。)。

二.想要的效果是什么?

关于对话框插件,我们都知道在不同的浏览器里显示样式是有一些分别的,但基本上布局结构都一样。我们的插件想要的效果是:在任何浏览器里显示的样式和布局结构都保持一致,位于浏览器正中央(这样用户能够第一时间看到)。

弹出窗体在实现上与对话框类似(我是指我们要开发的插件,并非是说浏览器默认的实现)。

三.设计一下功能
我们看着图片一步步来说:
学习从实践开始之jQuery插件开发 对话框插件开发
1、遮挡页面内容(图片上灰色半透明部分),透明度可以设置(不透明0-1完全透明),这样的好处是 在用户关闭对话框之前不能对页面进行操作。
2、对话框居中显示,对话框大小可以设置(长宽)。
3、图中(1)和(2)为对话框图标,都可以设置。
4、对话框标题可以内容都可以设置。
5、可以不显示关闭按钮(x)。
6、底部按钮可以为0个或多个,并且可以为其设置回调函数。

四.如何实现功能?

1.使用CSS样式控制外观。

*为了避免CSS命名冲突,我们需要为插件确定一个名字空间,其下所有样式都在该命名空间下。

2.遮挡所有内容

*我们在CSS里设置基本样式。

position:absolute; 
left:0; 
top:0; 
background-color:#000; 
z-index:99999;

*这里需要注意的是z-index的值有一个安全范围,来自微软的说明“The maximum value is 2147483647 for IE6, 7 and 8.But it is 16777271 for Safari 3, so a safe cross browser maximum value is 16777271.”大意是说ie6,7,8支持的最大值是2147483647,但是Safari 3是16777271,所以保险起见不要超过16777271。

*用js代码设置其宽和高,我们通过$(document).width()获取页面宽度,通过$(document).height()获取页面高度度。
3.对话框居中显示 

对于对话框居中显示,有两种方式实现。

一是通过CSS实现。

position:absolute;如果页面有滚动条的时,当滚动条滚动时,对话框也会移动。

position:fixed;比较理想,无论如何滚动,对话框始终停留在页面居中位置,唯一的缺点就是不支持IE6(网上有关于如果兼容IE6的方法,感兴趣的朋友可以自己去实现)。

二是通过js脚本控制。

通过计算页面长宽来定位,当改变页面大小时,对话框位置不会改变,效果不理想。(当然了,可以通过监听页面发生改变时,自动调整位置,但是实现起来比较麻烦,感兴趣的朋友可以自己去尝试)

五.浏览器兼容

浏览器兼容什么的最讨厌了,不过话说回来最理想的效果当然是能够兼容所有浏览器,事实上如果我们花更多的时间也确实可以做到兼容所有浏览器。但是这样做值得吗?如果问页面设计人员最讨厌的浏览器是什么?我想大多数都会回答是IE6,是的,这个曾经风靡全球,霸占全球超过90%用户电脑的浏览器,我们曾经觉得它很好,好吧,也许我该说不错,又或者还可以;不管怎么样,它曾经确实是全球最受欢迎的浏览器。但是现在,它是我们开发者眼中最不受欢迎的浏览器,在全球平均使用不超过5%的情况下,在天朝却仍然超过20%的用户在使用它(来自http://www.ie6countdown.com/的统计),这是为什么呢?同样一个功能如果要做到兼容IE6这些老版本的浏览器,我们大概要多花三分之一甚至更多的时间,生命是短暂的,同志们,为何不把有限的时间拿去做更有意义的事情呢?杀死IE6从我做起!

六.功能实现和调用

CSS部分

<style type="text/css"> /*为了避免命名冲突,我们将该插件所有样式都放在该类之下*/ 
.ctcx-dialog 
{ 
font-size:14px; 
} 
.ctcx-dialog .mark /*遮罩层样式*/ 
{ 
position:absolute; 
left:0; 
top:0; 
background-color:#000; 
z-index:99999; 
} 
.ctcx-dialog .dialog /*对话框样式*/ 
{ 
position:fixed; 
left:50%; 
top:50%; 
background-color:#FFF; 
z-index:99999; 
border:2px solid #000; 
padding:2px; 
} 
.ctcx-dialog .dialog .bar /*对话框标题栏*/ 
{ 
height:30px; 
background-color:#999; 
color:#FFF; 
} 
.ctcx-dialog .dialog .bar .icon /*对话框标题栏图标*/ 
{ 
width:25px; 
height:30px; 
background-repeat:no-repeat; 
background-position:center; 
display:inline-block; 
} 
.ctcx-dialog .dialog .bar .title /*对话框标题栏标题*/ 
{ 
width:340px; 
height:30px; 
line-height:30px; 
overflow:hidden; 
display:inline-block; 
vertical-align:top; 
font-weight:bold; 
} 
.ctcx-dialog .dialog .bar .close /*对话框标题栏关闭按钮*/ 
{ 
width:20px; 
height:30px; 
background-image:url(close.png); 
background-repeat:no-repeat; 
background-position:center; 
display:inline-block; 
cursor:pointer; 
} 
.ctcx-dialog .dialog .container /*对话框内容容器*/ 
{ 
margin-top:5px; 
overflow:auto; 
} 
.ctcx-dialog .dialog .container .icon /*对话框内容容器*/ 
{ 
background-image:url(icon-big.png); 
background-repeat:no-repeat; 
background-position:center; 
width:48px; 
height:48px; 
} 
.ctcx-dialog .dialog .container .content /*对话框内容容器*/ 
{ 
position:relative; 
} 
.ctcx-dialog .dialog .buttons /*对话框按钮栏*/ 
{ 
text-align:center; 
margin-top:5px; 
height:30px; 
position:relative; 
bottom:0px; 
} 
.ctcx-dialog .dialog .buttons a /*对话框按钮*/ 
{ 
background-color:#DDD; 
color:#000; 
text-decoration: none; 
display:inline-block; 
padding:5px; 
} 
.ctcx-dialog .dialog .buttons a:hover /*对话框按钮*/ 
{ 
background-color:#333; 
color:#FFF; 
} 
.ctcx-dialog .dialog .buttons a:active /*对话框按钮*/{} 
</style>

JS部分
(function ($) { 
$.alert = function (options) { if (typeof options === 'string') options = { content: options }; 
var opts = $.extend({}, $.alert.defaults, options); 
if (opts.content == null || opts.content.length == 0) return this; 
var me = $('<div></div>').addClass('ctcx-dialog').appendTo(document.body); 
var doc = $(document); 
$('<div class="mark"></div>').css({ opacity: opts.opacity }).width(doc.width()).height(doc.height()).appendTo(me); 
var _dialog_ = $('<div class="dialog"></div>').css({ 
width: opts.width, 
height: opts.height, 
marginLeft: 0 - opts.width / 2, 
marginTop: 0 - opts.height / 2 
}).appendTo(me); 
var _bar_ = $('<div class="bar"></div>').appendTo(_dialog_); 
var _titleWidth_ = opts.width - 0; 
if (opts.icon != null) { 
$('<div class="icon"></div>').css('background-image', 'url(' + opts.icon + ')').appendTo(_bar_); 
_titleWidth_ -= 25; 
} 
if (opts.close) _titleWidth_ -= 20; 
$('<div class="title"></div>').css({ width: _titleWidth_ }).html(opts.title).appendTo(_bar_); 
if (opts.close) { 
$('<div class="close"></div>').click(function () { 
me.remove(); 
}).appendTo(_bar_); 
} 
var _containerHeight_ = opts.height - 40; 
var _container_ = $('<div class="container"></div>').appendTo(_dialog_); 
var _contentCss_ = {}; 
if (opts.iconBig != null) { 
$('<div class="icon"></div>').css('background-image', 'url(' + opts.iconBig + ')').appendTo(_container_); 
_contentCss_.top = -48; 
_contentCss_.marginLeft = 48; 
} 
var _content_ = $('<div class="content"></div>').css(_contentCss_).html(opts.content).appendTo(_container_); 
if (opts.buttons != null && opts.buttons.length > 0) { 
_containerHeight_ -= 30; 
var _buttons_ = $('<div class="buttons"></div>').appendTo(_dialog_); 
$.each(opts.buttons, function (i, _button) { 
$('<a href="javascript:;">' + _button.text + '</a>').click(function () { 
_button.fn(me); 
}).appendTo(_buttons_); 
}) 
} 
_container_.css({ height: _containerHeight_ }); 
this.close = function () { 
me.remove(); 
} 
this.setContent = function (content) { 
_content_.html(content); 
} 
return this; 
} 
//设置默认参数 
$.alert.defaults = { 
title: '信息提示', //对话框标题 
content: null, //对话框内容 
width: 200, //宽 
height: 100, //高 
opacity: 0.5, //透明度 
icon: null, //显示在标题前面的小图标 
iconBig: null, //显示在内容左侧的大图标 
buttons: null, //按钮集合[{text:'按钮显示文字',fn:回调函数(event)}],event = {} 
close: true//是否显示关闭按钮 
} 
})(jQuery);

调用
$.alert({ 
title: '火星向你发出警告', //对话框标题 
content: '我们是火星人,我们就要入侵地球了,你们准备好了吗?', //对话框内容 
width: 300, //宽 
height: 150, //高 
opacity: 0.5, //透明度 
icon: 'icon.png', //显示在标题前面的小图标 
iconBig: 'icon-big.png', //显示在内容左侧的大图标 
buttons: [{ text: '好怕怕', fn: function () { $.alert('我好怕怕呀')} }], //按钮集合[{text:'按钮显示文字',fn:回调函数(event)}],event = {} 
close: true//是否显示关闭按钮 
});

七.下载

下面是我测试和使用的例子,感兴趣的朋友可以自己下载修改。

点击这里下载

Javascript 相关文章推荐
用js自动判断浏览器分辨率的代码
Jan 28 Javascript
js获取表格的行数和列数的方法
Oct 23 Javascript
js仿3366小游戏选字游戏
Apr 14 Javascript
JS查找字符串中出现次数最多的字符
Sep 05 Javascript
jquery实现转盘抽奖功能
Jan 06 Javascript
基于jquery日历价格、库存等设置插件
Jul 05 jQuery
jQuery选择器特殊字符与属性空格问题
Aug 14 jQuery
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
Sep 06 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
Sep 28 Javascript
详解iframe跨域的几种常用方法(小结)
Apr 29 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
Mar 09 Javascript
如何阻止移动端浏览器点击图片浏览
Aug 29 Javascript
再谈querySelector和querySelectorAll的区别与联系
Apr 20 #Javascript
js querySelector和getElementById通过id获取元素的区别
Apr 20 #Javascript
仿微博字符限制效果实现代码
Apr 20 #Javascript
javascript 另一种图片滚动切换效果思路
Apr 20 #Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
Apr 20 #Javascript
浏览器解析js生成的html出现样式问题的解决方法
Apr 16 #Javascript
基于jquery的不规则矩形的排列实现代码
Apr 16 #Javascript
You might like
PHP 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
PHP+JS+rsa数据加密传输实现代码
2011/03/23 PHP
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
2015/03/26 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
javascript 写类方式之八
2009/07/05 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
JavaScript实现的字符串replaceAll函数代码分享
2015/04/02 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
临床护士自荐信
2014/01/31 职场文书
幼儿园儿童节主持词
2014/03/21 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
国庆庆典邀请函
2015/02/02 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书
阿甘正传观后感
2015/06/01 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers