1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159 |
- //------------------------------
- // Dialog plugin for jQuery
- // Author : LooseLive@gmail.com
- //------------------------------
- (function($){
- var WIN = $(window),
- DOC = $(document),
- zIndex = ZINDEX = 2,
- F = $.isFunction,
- CSS = {
- HASICON : 'HasIcon',
- TIMER : 'HasTimer',
- CURRENT : 'Current',
- LOADING : 'Loading',
- DISABLED : 'Disabled',
- NOTONTOP : 'NotOnTop',
- ENTCLICK : 'ENTCLICK'
- },
- SPACE = ' ',
- EVENT = {
- A : 'mousedown',
- B : 'click',
- C : 'keydown',
- D : 'resize',
- E : 'scroll'
- },
- //从对象中删除该实例,如果对象的实例被删空,重置ZINDEX,避免无限上增
- DELETE = function (id) {
- delete $.dialog.list[id];
- if ($.isEmptyObject($.dialog.list))
- {
- ZINDEX = zIndex;
- }
- };
- function toArray() {
- var a = arguments,
- A = [],
- i = 0;
- for (; i < a.length; i++)
- {
- if (a[i] instanceof Array)
- {
- A = $.merge(A, a[i]);
- }
- else if (a[i] != null)
- {
- A.push(a[i]);
- }
- }
- return A;
- }
- $.dialog = function(o) {
- return new $.dialog.fn._init(o);
- };
- $.dialog.list = {};
- //默认设置
- $.dialog.defaults = {
- //对话框的唯一标识符,用途:无论何时何地都可通过$.dialog.get('xxx')获取对话框对象。
- id : null,
- //对话框的标识触发器,用途:防止重复弹出,缓存数据。
- trigger : null,
- /*
- [图标] - int | string
- 成功:0 | success
- 警告:1 | warning
- 错误:2 | error,
- 异常:3 | exception
- 询问:4 | question
- */
- icon : null,
- //[标题]
- title : '信息提示',
- //[选项卡] - array
- tab : null,
- /*
- [
- {
- text : string - 选项卡名称,
- content : {icon:独立的图标}跟全局content格式一致,
- button : 跟全局button格式一致,
- active : 是否激活该tab,注意:同时只能激活一个tab,如果定义多个active=true,以最后一个为准
- onActive : 当激活该tab时的事件处理函数
- icon:
- }
- ],
- tab的全局触发方式(鼠标事件名称)
- */
- tabType : 'click',
- /*
- [对话框的内容] - object*/
- content : null,
- /*
- {
- //load : {
- url:String,
- [data] : {},
- [success]:Function,
- [error]:Function
- }
- ||
- load:string
- //text : string
- //selector : string(选择器表达式) | jquery(元素)
- //iframe : string(框架Url)
- ajax : {url:'bb'}//跟jquery的ajax参数格式一致
- },
- //[按钮] - array
- */
- button :
- [
- {
- text : '确认'
- /*
- ,callback : function - 处理函数,
- cls : string-自定义样式名称,
- url : string,
- disabled : Boolean,
- bindEnter : Boolean
- */
- }
- ],
- padding : '8px',
- width : null, //string||number - pixels
- height : null, //string||number - pixels
- //位置参照元素
- refer : null, //jquery||HTMLElement||string(jQuery selector)
- offset : {
- top : 'middel',
- /*
- 可使用值枚举:
- 字符('top'||'middel'||'bottom'||'xpx'||'%50')
- 数字(表示多少像素,与字符值'xpx'同等效果)
- */
- left : 'center'
- /*
- 可使用值枚举:
- 字符('left'||'center'||'right'||'80px'||'%60')
- 数字(表示多少像素,与字符值'xpx'同等效果)
- ,*/
- },
- //是否固定位置
- fixed : true,
- //遮罩层
- mask : {
- enabled : false, //是否启用
- color : '#999', //颜色
- opacity : 0.8, //透明度
- duration: 200 //透明度渐变动画的速度
- },
- draggable : true, //是否可拖动
- resizable : false, //是否可调整自身大小
- timeout : { second : 0, text : 's% 秒后将自动关闭'},
- esc : true, //是否允许用户按 Esc 键关闭对话框
- onLoad : $.noop,
- onClose : $.noop,
- onEnter : $.noop,
- err : {
- title : 'Error',
- content : '<p style="text-align:center">服务器繁忙或发生错误,请稍后再试!<br />The server is busy or unavailable, please try again later!</p>',
- button : 'Close'
- },
- showErr : true //内容加载失败时是否显示错误消息
- };
- //修改全局默认设置的方法
- $.dialog.setup = function (o) {
- $.extend(this.defaults, o);
- };
- $.dialog.get = function (id) {
- return $.dialog.list[id];
- }
- //关闭所有对话框,参数o-布尔值,是否静默关闭
- $.dialog.close = function (o) {
- for (var i in $.dialog.list) {
- $.dialog.list[i].close(o);
- };
- };
- $.dialog.fn = $.dialog.prototype = {
- version : '1.0.0',
- title : function(v, d) {
- d = this.dom().title;
- //如果未传入参数,则返回当前标题字符
- if (v === undefined) return d.text();
- if (v === null)v='';
- d.text(v);
- return this;
- },
- tab : function(o) {
- var e = this,
- d = e.dom(),
- x = d.title;
- if (o === false)
- {
- x.siblings().remove();
- }
- else
- {
- var v = toArray(o);
- if (v.length > 0)
- {
- var i = 0,
- t = $(),
- n = -1;
- for (; i < v.length; i++)
- {
- var m = v[i].type ? v[i].type : e.o.tabType,
- j = $('<a href="javascript:void(0)" hidefocus="true"></a>').data('_m', m);
- if(v[i].icon)
- {
- j.wrapInner('<b class="' + v[i].icon + '">' + v[i].text + '</b>');
- }
- else
- {
- j.text(v[i].text);
- }
- j.bind(m + SPACE + EVENT.A, {i : i}, function (p) {
- if (e.child != null) return;
- //避免对话框可拖动时点击tab所带来的反应
- if (p.type == EVENT.A) return false;
- var o = v[p.data.i],
- b = toArray(o.button !== undefined ? o.button : [], e.o.button),
- c = o.content;
- //激活tab事件处理
- if (F(o.onActive))
- {
- if(o.onActive.call(e) == false)return false;
- }
- //切换tab的样式
- $(this).addClass(CSS.CURRENT).siblings().removeClass(CSS.CURRENT);
- //预清空隐藏按纽栏
- d.button.empty().parent().hide();
- if (c)
- {
- if (typeof c === 'string' && (c.indexOf('#') === 0 || c.indexOf('.') === 0))
- {
- var w = d.content,
- z = w.find(c);
- if (!z[0])
- {
- var y = w.data('c');
- z = $(y).find(c);
- if (z[0]) w.html(y);
- }
- if (z[0])
- {
- z.siblings().hide();
- z.fadeIn('fast');
- e._ready(b, 1);
- }
- else
- {
- e._showErr();
- }
- }
- else
- {
- e.content(c, b);
- //独立的图标处理
- e.icon(c.icon || e.o.icon);
- }
- }
- else
- {
- e.button(b);
- }
- });
- if (v[i].active === true) n = i;
- t = t.add(j);
- }
- x.siblings().remove();
- x.parent().append(t);
- //如果有需要激活的tab
- if (n > -1)
- {
- var a = t.eq(n);
- if (e._isReady)
- {
- var m = a.data('_m');
- a.triggerHandler(m);
- }
- else
- {
- a.attr('data-active', 1);
- }
- }
- }
- }
- return e;
- },
- icon : function (v) {
- var d = this.dom(),
- b = d.body,
- c = d.icon;
- //如果未传入参数,则返回图标容器元素
- if (v === undefined) return d;
- if (v !== null)
- {
- if (!isNaN(v))
- {
- switch(v)
- {
- case 0: v = 'Success'; break;
- case 1: v = 'Warning'; break;
- case 2: v = 'Error'; break;
- case 3: v = 'Exception'; break;
- case 4: v = 'Question'; break;
- default : v = null;
- }
- }
- b.addClass(CSS.HASICON);
- if (v) c.removeClass().addClass(v).parent().show();
- }
- else
- {
- b.removeClass(CSS.HASICON);
- c.removeClass().parent().hide();
- }
- return this;
- },
- content : function (o, b) {
- var e = this,
- z = b ? 1 : 0,
- c = e.dom().content;
- if (o === undefined) return c;
- if (o === null)
- {
- e._ready();
- return e;
- }
- if (typeof o === 'string')
- {
- o = { text : o }
- }
- else if(!$.isPlainObject(o))
- {
- o = { selector : o }
- }
- b = b ? b : e.o.button;
- c.empty().addClass(CSS.LOADING);
- $.each(o, function (t, v){
- switch (t.toLowerCase())
- {
- case 'load' :
- if (typeof v === 'string') v = {url : v};
- c.load(v.url, v.data, function(x,y){
- if (y === 'success')
- {
- c.removeClass(CSS.LOADING);
- e._ready(b,z);
- if (v.success) v.success.call(e);
- }
- else
- {
- e._showErr();
- if (v.error) v.error.call(e);
- }
- });
- break;
- case 'text' :
- c.removeClass(CSS.LOADING).html(v);
- e._ready(b,z);
- break;
- case 'selector' :
- //使用API方式设置内容时如果有需要恢复到原始位置的元素,将其恢复
- e.recovery && e.recovery();
- //如果是选择器字符或HTMLElement,将其转换为jQuery对象
- if (typeof v === 'string' || v.nodeType === 1) v = $(v);
- if (v[0])
- {
- //-->恢复处理函数
- var display = v[0].style.display,
- prev = v.prev(),
- next = v.next(),
- parent = v.parent();
- e.recovery = function () {
- if (prev[0]) {
- prev.after(v);
- } else if (next[0]) {
- next.before(v);
- } else if (parent[0]) {
- parent.append(v);
- };
- v[0].style.display = display;
- e.recovery = null;
- };
- //<--
- c.removeClass(CSS.LOADING).append(v.show());
- e._ready(b,z);
- }
- else
- {
- e._showErr();
- }
- break;
- case 'iframe' :
- var iframe = $('<iframe src="' + v + '" width="100%" height="100%" scrolling="auto" frameborder="0" marginheight="0" marginwidth="0"></iframe>');
- c.removeClass(CSS.LOADING).html(iframe);
- iframe.bind('load', function () {
- var i = $(this),
- d = i[0].contentWindow.document,
- w = Math.max(d.body.scrollWidth, d.documentElement.scrollWidth),
- h = i.contents().find('body').height();
- if (!e._w) i.width(w);
- if (!e._h) i.height(h);
- });
- e._ready(b,z);
- break;
- case 'ajax' :
- v.type = v.type || 'get';
- $.ajax({
- url : v.url,
- type : v.type,
- data : v.data,
- dataType : 'html',
- success:function(html){
- c.removeClass(CSS.LOADING).html(html);
- e._ready(b,z);
- if(F(v.success)) v.success.call(e);
- },
- error : function () {
- if(v.error) v.error.call(e);
- e._showErr();
- }
- });
- break;
- }
- });
- return e;
- },
- button : function (o) {
- var e = this, a = toArray(o), b = e.dom().button, i = 0;
- b.empty().parent().hide();
- for (; i < a.length; i++)
- {
- var c = $('<a href="javascript:void(0)" hidefocus="true" data-id="' + a[i].text + '">' + a[i].text + '</a>').bind(EVENT.B, { e : e, f : a[i].callback }, F(a[i].callback) ? function (e,d) {
- if (e.data.e.child != null) return;
- if ($(this).hasClass(CSS.DISABLED))
- {
- return false;
- }
- else
- {
- d = e.data;
- return d.f.call(d.e);
- }
- } : $.proxy(e.close, e));
- if(typeof a[i].cls === 'string') c.addClass(a[i].cls);
- if(typeof a[i].url === 'string') c[0].href = a[i].url;
- if(a[i].disabled === true) c.addClass(CSS.DISABLED);
- if (a[i].bindEnter) c.addClass(CSS.ENTCLICK);
- b.append(c);
- }
- if (i > 0) b.parent().show();
- return e;
- },
- //改变按钮状态和文本,n-按钮的索引,o-字符或布尔值或纯粹的对象{disabled:Boolean,text:String}
- buttonChange : function (n, o) {
- var b = this.dom().button;
- d = b.children('[data-id="' + n + '"]');
- if (d.size() === 0) d = b.children().eq(n);
- var disabled = null;
- var text = null;
- if (typeof o == 'object')
- {
- disabled = o.disabled;
- text = o.text;
- }
- else
- {
- if (typeof o == 'boolean')
- {
- disabled = o;
- }
- else if (typeof o == 'string')
- {
- text = o;
- }
- }
- if (disabled !== null)
- {
- if(disabled)
- {
- d.addClass(CSS.DISABLED);
- }
- else
- {
- d.removeClass(CSS.DISABLED);
- }
- }
- if (text !== null)
- {
- d.text(text);
- }
- return this;
- },
- padding : function (v) {
- if (v)
- {
- var c = this.dom().content;
- if (!c.children('iframe')[0])
- {
- c.css('padding', v);
- }
- }
- return this;
- },
- width : function (v) {
- var e = this;
- if (v)
- {
- e.wrapper.width(v);
- e._w = 1;
- return e;
- }
- if (v === null) return e;
- return e.wrapper.width();
- },
- //设置对话框的高度,如果参数没有明确指定单位(如:em或%),使用px。如果不带参数,返回当前对话框的高度
- height : function (v) {
- var e = this;
- if (v)
- {
- e.wrapper.height(v);
- e._h = 1;
- return e;
- }
- if (v === null) return e;
- return e.wrapper.height();
- },
- offset : function(o) {
- var e = this;
- if (o === undefined) return e.lastOffset || e.o.offset;
- var refer = e.o.refer,
- windowW = WIN.width(),
- windowH = WIN.height(),
- width = e.wrapper.outerWidth(),
- height = e.wrapper.outerHeight(),
- offset = {top : parseInt((windowH - height)/2), left : parseInt((windowW - width) / 2)},
- set = true;
- if( offset.top <= 0 ) offset.top = 0;
- if( offset.left <= 0 ) offset.left = 0;
- if (refer)
- {
- var visibleT = DOC.scrollTop(),
- visibleL = DOC.scrollLeft(),
- visibleB = visibleT + windowH,
- visibleR = visibleL + windowW,
- referW = refer.outerWidth(),
- referH = refer.outerHeight(),
- referOffset = refer.offset(),
- referT = referOffset.top,
- referL = referOffset.left,
- referB = referT + referH,
- referR = referL + referW,
- invisibleW = 0,
- invisibleH = 0,
- inViewableArea = referT < visibleB && referB > visibleT && referR > visibleL && referL < visibleR;
- if (inViewableArea)
- {
- if (referL < visibleL)
- {
- invisibleW = visibleL - referL;
- referL = referL + invisibleW;
- }
- else if (referR > visibleR)
- {
- invisibleW = referR - visibleR;
- }
- if (referT < visibleT)
- {
- invisibleH = visibleT - referT;
- referT = referT + invisibleH;
- }
- else if (referB > visibleB)
- {
- invisibleH = referB - visibleB;
- }
- referW = referW - invisibleW,
- referH = referH - invisibleH;
- o = {
- top : referT + ((referH - height) / 2),
- left : referL + ((referW - width) / 2)
- };
- if (o.top < visibleT)
- {
- o.top = visibleT;
- }
- else if (o.top + height > visibleB)
- {
- o.top = visibleB - height;
- }
- if (o.left < visibleL)
- {
- o.left = visibleL;
- }
- else if (o.left + width > visibleR)
- {
- o.left = visibleR - width;
- }
- e.fixed(false).draggable(false);
- }
- else
- {
- e.fixed(false).draggable(e.o.draggable);
- set = false;
- }
- }
- $.each(o, function(n, val){
- if((typeof val === 'string' && (val.indexOf('%') > -1 || parseInt(val) > 0 )) || typeof val === 'number')
- {
- offset[n] = val;
- }
- else
- {
- switch(val)
- {
- case 'left' : offset[n] = 0; break;
- case 'right' : offset[n] = windowW-width;break;
- case 'top' : offset[n] = 0;break;
- case 'bottom' : offset[n] = windowH-height;break;
- }
- }
- });
- if (set)
- {
- e.wrapper.css({
- top : offset.top,
- left : offset.left
- });
- e.lastOffset = offset;
- }
- return e;
- },
- //开启或关闭固定定位。参数为false时为关闭,不带参数或参数值为非false时为开启
- fixed : function (v) {
- if (v === false)
- {
- this.wrapper.css('position','absolute');
- }
- else
- {
- this.wrapper.css('position','fixed');
- }
- return this;
- },
- //开启或关闭遮罩层。参数为false时为关闭,不带参数或参数值为非false时为开启
- mask : function (o) {
- var e = this, t = o;
- //使用.mask(null)方法关闭遮罩层
- if ((o === false || o === null) && e.MaskLayer != null)
- {
- e.MaskLayer.remove();
- e.MaskLayer = null;
- e._mask = 0;
- }
- o = o === true ? $.extend({}, $.dialog.defaults.mask, {enabled : true}) : $.extend({}, e.o.mask, o);
- if (t === undefined || o.enabled)
- {
- if (e.MaskLayer === null)
- {
- var a,b;
- if (e.zIndex === ZINDEX - 1)
- {
- a = e.zIndex;
- b = e.zIndex = ZINDEX++;
- }
- else
- {
- a = ZINDEX++;
- b = e.zIndex = ZINDEX++;
- }
- e.MaskLayer = $('<p class="jQ_Dialog_MaskLayer"></p>').css({
- backgroundColor : o.color,
- opacity : 0,
- zIndex : a,
- height : '100%',
- width : '100%',
- left : 0,
- top : 0
- });
- $("body").append(e.MaskLayer);
- e.wrapper.css('zIndex', b);
- e._mask = 1;
- e._setTop();
- }
- if (e.zIndex < ZINDEX - 1)
- {
- e.MaskLayer.css('zIndex', ZINDEX++);
- e.wrapper.css('zIndex', ZINDEX);
- e.zIndex = ZINDEX;
- ZINDEX++;
- e._mask = 1;
- e._setTop();
- }
- if (e._closed)
- {
- e.wrapper.show();
- e._closed = 0;
- }
- e.MaskLayer.show().animate({opacity: o.opacity}, o.duration);
- }
- else if (e.MaskLayer != undefined)
- {
- e.MaskLayer.remove();
- e.MaskLayer = null;
- e._mask = 0;
- }
- return e;
- },
- //开启或关闭拖动。参数为false时为关闭,不带参数或参数值为非false时为开启
- draggable : function (v) {
- var e = this,
- w = e.wrapper,
- d = e.dom().drag;
- if (v === false)
- {
- w.unDrag();
- }
- else
- {
- w.Drag(d);
- }
- return e;
- },
- //开启或关闭大小缩放。参数为false时为关闭,不带参数或参数值为非false时为开启
- resizable : function (v) {
- var e = this,
- c = e.dom().content,
- r = e.dom().resizer;
- if (v === false)
- {
- r.hide();
- }
- else
- {
- r.show();
- c.resize({ handler : r, wrapper : e.wrapper });
- }
- return e;
- },
- //倒计时关闭
- timeout : function (s, t) {
- var e = this,
- o = e.o.timeout,
- second, text,
- d = e.dom().foot,
- f = function () {
- if (text)
- {
- text = text.replace('s%','<b>s%</b>');
- d.addClass(CSS.TIMER).eq(1).html(text.replace('s%', second));
- }
- if(!second) e.close();
- second--;
- };
- if (typeof s === 'object' )
- {
- second = s.second || o.second;
- text = s.text || o.text;
- }
- else
- {
- second = s || o.second;
- text = t || o.text;
- }
- d.removeClass(CSS.TIMER).eq(1).empty();
- clearInterval(e.timer);
- if (second)
- {
- e.timer = setInterval(f, 1000);
- f();
- }
- return e;
- },
- //是否开启Esc键关闭
- esc : function (v) {
- this.o.esc = v;
- return this;
- },
- onLoad : function (f) {
- if (F(f)) this.o.onLoad = f;
- return this;
- },
- onClose : function (f) {
- if (F(f)) this.o.onClose = f;
- return this;
- },
- onEnter : function (f) {
- if (F(f)) this.o.onEnter = f;
- return this;
- },
- show : function () {
- this.wrapper.show();
- return this.__init();
- },
- close : function(x) {
- var e = this;
- if (e.child != null)
- {
- //忽略鼠标关闭事件
- if(typeof x === 'object')
- {
- return e;
- }
- else
- {
- //手动模式关闭-静默关闭
- x = true;
- }
- }
- if (e._closed) return e;
- //避免对话框可拖动时点击x所带来的反应
- if (typeof x === 'object' && x.type === EVENT.A) return false;
- var junior = e.junior();
- //静默关闭
- if (x === true)
- {
- //从本窗口的最终子窗口开始关闭
- var c = function (o) {
- o._close();
- if (o.hasOwnProperty('parent') && e != o) arguments.callee(o.parent);
- //从对象组中删除该实例
- DELETE(o.id);
- };
- c(junior);
- return e;
- }
- //如果关闭回调函数返回false
- if (e.o.onClose.call(e) === false) return e;
- //如果有触发器
- if (e.o.trigger)
- {
- e._close(true); //隐藏
- }
- else
- {
- e._close(); //移除
- DELETE(e.id); //从对象组中删除该实例
- }
- return e;
- },
- //获取当前对象的最最终子对象
- junior : function () {
- if (this.child != null) return this.child.junior();
- return this;
- },
- //创建子窗口的扩展方法
- dialog : function (o) {
- $.extend(o, {refer:this.wrapper});
- var e = this.child = $.dialog(o);
- e.parent = this;
- return e;
- },
- //左右晃动的效果
- shake : function (){
- var e = this,
- p = [4, 8, 4, 0, -4, -8, -4, 0, 2, 4, 2, 0, -2, -4, -2 , 0, 1, 2, 1, 0, -1, -2, -1, 0],
- t = null,
- f = function () {
- e.wrapper.css('marginLeft', p.shift() + 'px');
- if (p.length <= 0) {
- e.wrapper.css('marginLeft', 0);
- clearInterval(t);
- };
- };
- t = setInterval(f, 12);
- return e;
- },
- __init : function(){
- var e = this,
- o = e.o;
- e.title(o.title)
- .tab(o.tab)
- .icon(o.icon)
- .content(o.content)
- .padding(o.padding)
- .width(o.width)
- .height(o.height)
- .offset(o.offset)
- .fixed(o.fixed)
- .mask(o.mask)
- .draggable(o.draggable)
- .resizable(o.resizable)
- .timeout(o.timeout)
- .esc(o.esc)
- .onLoad(o.onLoad)
- .onEnter(o.onEnter)
- .onClose(o.onClose)
- ._event();
- e._closed = 0;
- return e;
- },
- //初始化一个对话框实例
- _init : function(o) {
- var e = this,
- exists = false;
- e.o = {};
- e.wrapper = e.child = e.MaskLayer = null;
- e.id = '_dialog' + ZINDEX;
- e.dom = function () {
- var w = this.wrapper,
- d = {
- drag : w.children('thead'),
- title : w.find('.jQ_Dialog_Title span'),
- body : w.find('.jQ_Dialog_Body'),
- icon : w.find('.jQ_Dialog_Icon p'),
- content : w.find('.jQ_Dialog_Content'),
- button : w.find('.jQ_Dialog_Button td'),
- X : w.find('.jQ_Dialog_X').children(),
- resizer : w.find('.jQ_Dialog_Resizer'),
- foot : w.find('tfoot td')
- };
- return d;
- };
- $.extend(true, e.o, $.dialog.defaults, o); //扩展默认设置的副本
- if (typeof e.o.id === 'string') //如果设置了对话框的唯一标识且为字符
- {
- e.id = e.o.id;
- if (e.o.trigger === null) e.o.trigger = e.id;
- }
- if ($.type(e.o.trigger) === 'object' && !e.o.trigger.nodeType)
- {
- //如果是jQuery对象,将其转换为HTMLElement
- e.o.trigger = e.o.trigger[0];
- }
- //遍历所有对话框对象,通过其触发器检测对象是否已经存在
- $.each($.dialog.list, function (x, y) {
- if (y.o.trigger != null && y.o.trigger === e.o.trigger)
- {
- y.o = e.o;
- e.wrapper = y.wrapper;
- e.MaskLayer = y.MaskLayer;
- y._isReady = y._onLoadCalled = e._w = e._h = 0;
- y.show();
- if (y._mask !== 1 && y.zIndex < ZINDEX - 1)
- {
- y.wrapper.css('zIndex', ZINDEX);
- y.zIndex = ZINDEX++;
- y._setTop();
- }
- exists = true;
- return false;
- }
- });
- //如果对话框对象不存在
- if (!exists)
- {
- e.wrapper = $($.dialog.template);
- $("body").append(e.wrapper);
- //将其加入全局对话框对象
- $.dialog.list[e.id] = e;
- e.__init();
- if (e._mask !== 1)
- {
- e.wrapper.css('zIndex', ZINDEX);
- e.zIndex = ZINDEX++;
- e._setTop();
- }
- }
- return e;
- },
- _ready : function (b,z) {
- var e = this;
- if (!e._isReady)
- {
- var d = e.dom(),
- a = d.title.siblings('[data-active]'),
- c = d.content,
- t = a.data('_m');
- if (a.size() > 0)
- {
- a.removeAttr('data-active').triggerHandler(t);
- return;
- }
- c.data('c', c.html());
- e._isReady = 1;
- e.button(b);
- setTimeout(function () {
- e.offset(1);
- }, 5);
- if (!e._onLoadCalled)
- {
- setTimeout(function () {
- e.o.onLoad.call(e);
- }, 8);
- e._onLoadCalled = 1;
- }
- }
- else if (z)
- {
- e.button(b);
- }
- },
- _close : function (hide) {
- var e = this;
- e.recovery && e.recovery();
- if (hide == true)
- {
- e.wrapper.hide();
- }
- else
- {
- e.wrapper.remove();
- if (e.zIndex === ZINDEX - 1) ZINDEX--;
- }
- if (e.MaskLayer != null)
- {
- e.MaskLayer.animate({opacity: 0}, e.o.mask.duration, function(){
- if (hide == true)
- {
- $(this).hide();
- }
- else
- {
- $(this).remove();
- if (e.zIndex === ZINDEX) ZINDEX--;
- e.MaskLayer = null;
- }
- });
- }
- e._closed = 1;
- e._isReady = 0;
- e._onLoadCalled = 0;
- //如果有父窗口,将父窗口的子窗口赋值为null
- if (e.hasOwnProperty('parent')) e.parent.child = null;
- clearInterval(e.timer);
- //关闭对话框后取消绑定ESC和回车事件
- DOC.unbind(e._eventName(EVENT.C));
- WIN.unbind(e._eventName(EVENT.D, EVENT.E));
- //自动激活最顶层的对象
- var i = 0,
- o = e;
- $.each($.dialog.list, function (x, y) {
- if (e.zIndex > y.zIndex)
- {
- if (i === 0)
- {
- i = y.zIndex;
- o = y;
- }
- else if (y.zIndex > i)
- {
- i = y.zIndex;
- o = y;
- }
- }
- });
- o._setTop();
- },
- _event : function () {
- var e = this,
- a = e._eventName(EVENT.A, EVENT.B),
- c = e._eventName(EVENT.D, EVENT.E),
- b = e._eventName(EVENT.C);
- //置顶事件
- e.wrapper.unbind(EVENT.A).bind(EVENT.A, $.proxy(function () {
- if (this.child != null)
- {
- this.child.shake();
- return false;
- }
- if (ZINDEX - this.zIndex >= 2)
- {
- this.zIndex = ZINDEX;
- $.dialog.list[this.id].wrapper.css('z-index', ZINDEX);
- ZINDEX++;
- this._setTop();
- }
- }, e));
- //关闭按钮事件
- e.dom().X.unbind(a).bind(a, $.proxy(e.close, e));
- //ESC和回车事件
- DOC.unbind(b).bind(b,function(event){
- if (e.child != null) return;
- if(event.which === 27 && e.o.esc !== false && !e.wrapper.hasClass(CSS.NOTONTOP)){
- event.result !== false && e.close();
- return false;
- }
- if(event.which === 13 && !e.wrapper.hasClass(CSS.NOTONTOP))
- {
- e.o.onEnter();
- e.dom().button.children('.' + CSS.ENTCLICK).triggerHandler(EVENT.B);
- return false;
- }
- });
- WIN.unbind(c).bind(c, function () {
- e.offset(1);
- });
- },
- _showErr : function () {
- var e = this,
- s = e.o.err;
- if (e.o.showErr)
- {
- e.icon(3).padding(10).content({text : s.content}).button([{text : s.button}]);
- if (e.dom().title.siblings().size() === 0) e.title(s.title);
- }
- },
- _setTop:function () {
- var e = this;
- e.wrapper.removeClass(CSS.NOTONTOP);
- $.each($.dialog.list, function (x, y) {
- if(y.zIndex < e.zIndex) y.wrapper.addClass(CSS.NOTONTOP);
- });
- },
- _eventName : function () {
- var n = '.', r;
- for (var i = 0; i < arguments.length; i++)
- {
- if (r)
- {
- r = r + SPACE + arguments[i] + n + this.id;
- }
- else
- {
- r = arguments[i] + n + this.id;
- }
- }
- return r;
- }
- };
- $.dialog.fn._init.prototype = $.dialog.fn;
- $.fn.dialog = function (o) {
- if (!$.isPlainObject(o)) o = {};
- o.refer = o.trigger = this;
- return $.dialog(o);
- }
- $.dialog.template =
- '<table class="jQ_Dialog">'
- + '<thead>'
- + '<tr>'
- + '<th class="jQ_Dialog_Header_Left"></th>'
- + '<th class="jQ_Dialog_Title"><span></span></th>'
- + '<th class="jQ_Dialog_X"><a href="javascript:void(0)" hidefocus="true"></a></th>'
- + '<th class="jQ_Dialog_Header_Right"></th>'
- + '</tr>'
- + '</thead>'
- + '<tbody>'
- + '<tr>'
- + '<td class="jQ_Dialog_Body_Left"></td>'
- + '<td colspan="2" height="100%">'
- + '<table class="jQ_Dialog_Body">'
- + '<tr><td class="jQ_Dialog_Icon"><p></p></td><td class="jQ_Dialog_Content Loading"></td></tr>'
- + '<tr class="jQ_Dialog_Button"><td colspan="2"></td></tr>'
- + '</table>'
- + '</td>'
- + '<td class="jQ_Dialog_Body_Right"></td>'
- + '</tr>'
- + '</tbody>'
- + '<tfoot>'
- + '<tr>'
- + '<td class="jQ_Dialog_Footer_Left"></td>'
- + '<td class="jQ_Dialog_Footer" colspan="2"></td>'
- + '<td class="jQ_Dialog_Footer_Right"><p class="jQ_Dialog_Resizer"></p></td>'
- + '</tr>'
- + '</tfoot>'
- + '</table>';
- })($);
|