[easyui]封装一个dialog
来源:互联网 发布:js新手可以做的小游戏 编辑:程序博客网 时间:2024/05/16 09:49
我觉得以后做项目,还是首先把组件都自己封装一遍好了,这样以后想改起来也方便,哈哈。
先上效果图
我自己看别人博客写东西总是喜欢看最终效果图,觉得感兴趣就会继续看。
哈哈,现在不方便提供图。。看下面代码怎么使用好了。
html
我会将所有dialog一开始都放在一个隐藏的div里,这样即使它还没初始化在页面也是不可见的,经过EasyUI初始化之后,会自动跑到body下面。
<div style="display:none"> <div id="dlg-a"></div> <div id="dlg-b"></div> ...</div>
js
首先一定要注意的就是代码一定要写在onload事件里,或者 $(function)
// 我个人习惯先声明这样一个变量,用来存放所有的dialogvar dialogs = {};// hm是项目名,dialog这个函数下文开始细说// 第一个参数选择器,第二个参数是dialog的option// 这样就定义好了这个dialog,此时它还没有初始化,只是定义dialogs.a = new hm.dialog('#dlg-a',{title:'a'});// 会在首次使用的时候才去初始化(单例模式)// 这里有个回调函数,返回值跟messager.confirm一样// 这样设计我觉得还挺方便使用的,比如添加和编辑,使用同一个dialog,但是操作却是不同的。dialogs.a.open(function(result){});
开始分析封装
新建一个dialog.js文件
// 国际惯例,自执行函数(function(){ function dialog(selector,options) {} // 这里重写dialog的默认属性或者添加一些属性 dialog.options = {}; // 重写or添加 事件 dialog.events = {}; // 重写or添加 方法 dialog.methods = {}; // hm是项目名,所以我的一些组件都是封装在这个位置 window.hm.dialog = dialog;})();
参数
dialog.options = { // 既然是一个dialog,我觉得肯定是需要两个按钮的,一个确定,一个取消。 buttons:[{ text:'确定' },{ text:'取消' }], // 我个人喜欢设置为模态式的窗口,即打开的时候是无法操作其他区域的。 modal:true, // 当然,一开始这个dialog也是要隐藏的 closed:true};
事件
暂无
方法
暂无
单例模式实现
function dialog(selector,options) { var instance = null; function init(){ if(null === instance) { instance = $(selector).dialog($.extend({},dialog.options,options)); } } return { invoke : function(method, params) { init(); var result; // 现看有没有重写过该方法,有则执行 if(dialog.methods[method]){ result = dialog.methods[method](params); } else{ result = instance.dialog(method, params); } // 如果方法的返回值为实例,则返回this,实现链式调用 if(result === instance) { return this; } return result; }, open : function(callback) { init(); if(callback) { _callback = callback; } this.invoke('open'); } }}
回调函数的实现
首先声明一个回调
// 使用下划线,避免重名var _callback = null;
然后就是给按钮的handler实现,这里就有个问题了,按钮是定义在dialog.options里面,这个是在dialog函数外面的,这样就无法取到instance的引用了
于是我在init()里面更改了代码
function init(){ if(null === instance) { // 这里不允许添加button了 if(options.buttons){ delete options.buttons; } options = $.extend({},dialog.options,options); // 手动更改确定和取消按钮的操作 options.buttons[0].handler = function() { handler(true); }; options.buttons[0].handler = function() { handler(false); }; instance = $(selector).dialog(options)); }}function handler(result) { // 执行callback,如果没有返回false,则关闭窗口 if(_callback){ if(false !== _callback(result)) { instance.dialog('close'); } }}
这里又要提一点了,我觉得回调应该是一次性的,执行完就应该清除这个回调,然后,清除的代码写哪里呢,一开始觉得就放在function handler(result){} 里就好啊,但后来又想,这样如果用户点击按钮后确实可以清除回调,但如果用户点击的是右上角的叉叉来关闭呢,所以干脆写在onClose
事件里好了。
然后问题又来了,怎么得到引用,,只能又写在init()里面了
options.onClose = function() { _callback = null; };
这样写也有问题啊,如果我某个dialog定义了这个事件怎么办,不是被覆盖了?
又要改代码,真是太蛋疼了。
function init() { if(null === instance) { // copy一份默认值 var defaults = $.extend({}, dialog.options); // 在默认值上修改 defaults.buttons[0].handler = function() { handler(true); }; defaults.buttons[1].handler = function() { handler(false); }; defaults.onClose = function() { _callback = null; // 如果定义了,就执行(好像需要用到call,我没测试) if(options.onClose){ options.onClose() }; }; // 这里不允许添加button了 if(options.buttons){ delete options.buttons; } instance = $(selector).dialog($.extend({},defaults,options)); }}
我感觉写到这里就差不多了,最后把代码完整发一遍好了
dialog.js
// 国际惯例,自执行函数(function(){ function dialog(selector,options) { var instance = null, // 使用下划线,避免重名 _callback = null ; function init() { if(null === instance) { // copy一份默认值 var defaults = $.extend({}, dialog.options); // 在默认值上修改 defaults.buttons[0].handler = function() { handler(true); }; defaults.buttons[1].handler = function() { handler(false); }; defaults.onClose = function() { _callback = null; // 如果定义了,就执行(好像需要用到call,我没测试) if(options.onClose){ options.onClose() }; }; // 这里不允许添加button了 if(options.buttons){ delete options.buttons; } instance = $(selector).dialog($.extend({},defaults,options)); } } function handler(result) { // 执行callback,如果没有返回false,则关闭窗口 if(_callback){ if(false !== _callback(result)) { instance.dialog('close'); } } } return { invoke : function(method, params) { init(); var result; // 现看有没有重写过该方法,有则执行 if(dialog.methods[method]){ result = dialog.methods[method](params); } else{ result = instance.dialog(method, params); } // 如果方法的返回值为实例,则返回this,实现链式调用 if(result === instance) { return this; } return result; }, open : function(callback) { init(); if(callback) { _callback = callback; } this.invoke('open'); } } } // 这里重写dialog的默认属性或者添加一些属性 dialog.options = { // 既然是一个dialog,我觉得肯定是需要两个按钮的,一个确定,一个取消。 buttons:[{ text:'确定'},{ text:'取消'}], // 我个人喜欢设置为模态式的窗口,即打开的时候是无法操作其他区域的。 modal:true, // 当然,一开始这个dialog也是要隐藏的 closed:true }; // 重写or添加 事件 dialog.events = { onClose: undefined }; // 重写or添加 方法 dialog.methods = {}; // hm是项目名,所以我的一些组件都是封装在这个位置 window.hm.dialog = dialog;})();
备注
这篇博客全是手打的,因为我今天得空,但是源代码不在手边,就纯靠手打了,如有意外请指出。
写完才觉得我这样设计的也不怎么样,就比如互相引用不好解决。
0 0
- [easyui]封装一个dialog
- 封装的EasyUI Dialog插件
- [easyui]封装一个datagrid
- [easyui]封装一个form
- easyui动态创建一个dialog
- Easyui封装公用创建dialog的JS函数
- easyUI Dialog
- easyui--dialog
- easyui-dialog
- Dialog封装
- Dialog封装
- jquery easyui dialog 在iframe 标记的使用。可在dialog 里打开一个页面
- jquery easyui dialog 在iframe 标记的使用。可在dialog 里打开一个页
- Dialog封装大全NiceDialog一个强大的轮子
- easyUI 创建Dialog对话框
- 重写 easyui 的 dialog
- EasyUI Dialog控件
- easyui dialog xheditor 崩溃
- UIToolbar
- 8. 观察者模式-发布订阅模式
- scala 中map
- emacs常用命令
- NSOperation(操作)简介
- [easyui]封装一个dialog
- MyBatis_延迟加载
- PHP 将连续的汉语拼音分隔开
- 每天0点MySQL弹出黑DOS窗口
- iOS界面之间的跳转方式
- 对于快播王欣审理案中网民舆论一边倒的情况是好是坏?
- Purfer Sequence
- java : iBatis 2.3 起点
- mysql The user specified as a definer ('root'@'%') does not exist。