/*! * lhgcore Dialog Plugin v4.2.0 * Date: 2012-04-19 10:55:11 * http://code.google.com/p/lhgdialog/ * Copyright 2009-2012 LiHuiGang */ ;(function( $, window, undefined ){ var _ie6 = window.ActiveXObject && !window.XMLHttpRequest, _fn = function(){}, _count = 0, _rurl = /^url:/, _singleton, onKeyDown, document = window.document, expando = 'JDG' + (+new Date), dialogTpl = '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
' + '
' + '
' + '' + '' + '' + '\xd7' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
', /*! * _path 获取组件核心文件lhgdialog.js所在的绝对路径 * _args 获取lhgdialog.js文件后的url参数组,如:lhgdialog.js?self=true&skin=aero中的?后面的内容 */ _args, _path = (function( script, i, me ) { var l = script.length; for( ; i < l; i++ ) { me = !!document.querySelector ? script[i].src : script[i].getAttribute('src',4); if( me.substr(me.lastIndexOf('/')).indexOf('lhgdialog') !== -1 ) break; } me = me.split('?'); _args = me[1]; return me[0].substr( 0, me[0].lastIndexOf('/') + 1 ); })(document.getElementsByTagName('script'),0), /*! * 获取url参数值函数 * @param {String} * @return {String||null} * @demo lhgdialog.js?skin=aero | _getArgs('skin') => 'aero' */ _getArgs = function( name ) { if( _args ) { var p = _args.split('&'), i = 0, l = p.length, a; for( ; i < l; i++ ) { a = p[i].split('='); if( name === a[0] ) return a[1]; } } return null; }, /*! 取皮肤样式名,默认为 default */ _skin = _getArgs('skin') || 'iblack', /*! 获取 lhgdialog 可跨级调用的最高层的 window 对象和 document 对象 */ _doc, _top = (function(w) { try{ _doc = w['top'].document; // 跨域|无权限 _doc.getElementsByTagName; // chrome 浏览器本地安全限制 }catch(e){ _doc = w.document; return w; }; // 如果指定参数self为true则不跨框架弹出,或为框架集则无法显示第三方元素 if( _getArgs('self') === 'true' || _doc.getElementsByTagName('frameset').length > 0 ) { _doc = w.document; return w; } return w['top']; })(window), _root = _doc.documentElement, _doctype = _doc.compatMode === 'BackCompat'; _$doc = $(_doc), _$top = $(_top), _$html = $(_doc.getElementsByTagName('html')[0]); /*! 开启IE6 CSS背景图片缓存 */ try{ _doc.execCommand( 'BackgroundImageCache', false, true ); }catch(e){}; /*! 在最顶层页面添加样式文件 */ (function(style){ if(!style) { var head = _doc.getElementsByTagName('head')[0], link = _doc.createElement('link'); link.href = _path + 'skins/' + _skin + '.css'; link.rel = 'stylesheet'; link.id = 'lhgdialoglink'; head.insertBefore(link, head.firstChild); } })(_doc.getElementById('lhgdialoglink')); /*! * IE6下Fixed无抖动静止定位 * 如果你的页面的html元素设定了背景图片请把设置背景图片的css写到body元素上 * 如果你不需要组件静止定位(也就是随屏滚动)或此段代码影响了你的页面布局可将此段代码删除 */ _ie6 && (function(bg){ if( _$html.css(bg) !== 'fixed' ) { _$html.css({ zoom: 1,// 避免偶尔出现body背景图片异常的情况 backgroundImage: 'url(about:blank)', backgroundAttachment: 'fixed' }); } })('backgroundAttachment'); /*!----------------------------------以下为lhgdialog核心代码部分----------------------------------*/ var lhgdialog = function( config ) { config = config || {}; var api, setting = lhgdialog.setting; // 合并默认配置 for( var i in setting ) { if( config[i] === undefined ) config[i] = setting[i]; } config.id = config.id || expando + _count; // 如果定义了id参数则返回存在此id的窗口对象 api = lhgdialog.list[config.id]; if(api) return api.zindex().focus(); // 按钮队列 config.button = config.button || []; config.ok && config.button.push({ id: 'ok', name: config.okVal, callback: config.ok, focus: config.focus }); config.cancel && config.button.push({ id: 'cancel', name: config.cancelVal, callback: config.cancel }); // zIndex全局配置 lhgdialog.setting.zIndex = config.zIndex; _count++; return lhgdialog.list[config.id] = _singleton ? _singleton._init(config) : new lhgdialog.fn._init( config ); }; lhgdialog.fn = lhgdialog.prototype = { constructor: lhgdialog, _init: function( config ) { var that = this, DOM, content = config.content, isIfr = _rurl.test(content); that.opener = window; that.config = config; that.DOM = DOM = that.DOM || that._getDOM(); that.closed = false; that.data = config.data; // 假如提示性图标为真默认不显示最小化和最大化按钮 if( config.icon && !isIfr ) { config.min = false; config.max = false; DOM.icon[0].style.display = ''; DOM.icon[0].innerHTML = ''; } else DOM.icon[0].style.display = 'none'; DOM.wrap.addClass( config.skin ); // 多皮肤共存 DOM.rb[0].style.cursor = config.resize ? 'se-resize' : 'auto'; DOM.title[0].style.cursor = config.drag ? 'move' : 'auto'; DOM.max[0].style.display = config.max ? 'inline-block' : 'none'; DOM.min[0].style.display = config.min ? 'inline-block' : 'none'; DOM.close[0].style.display = config.cancel === false ? 'none' : 'inline-block'; //当cancel参数为false时隐藏关闭按钮 DOM.content[0].style.padding = config.padding; that.button.apply( that, config.button ); that.title( config.title ) .content( content, true, isIfr ) .size( config.width, config.height ) .position( config.left, config.top ) .time( config.time ) [config.show?'show':'hide'](true).zindex(); config.focus && that.focus(); config.lock && that.lock(); that._ie6PngFix()._addEvent(); _singleton = null; // 假如加载的是单独页面的内容页config.init函数会在内容页加载完成后执行,这里就不执行了 if( !isIfr && config.init ) config.init.call( that, window ); return that; }, /** * 自定义按钮 * @example button({ name: 'login', callback: function(){}, disabled: false, focus: true }, .., ..) */ button: function() { var that = this, DOM = that.DOM, buttons = DOM.buttons[0], focusButton = 'ui_state_highlight', listeners = that._listeners = that._listeners || {}, ags = [].slice.call(arguments), i = 0, item, value, id, isNewButton, button; for( ; i < ags.length; i++ ) { item = ags[i]; value = item.name; id = item.id || value; isNewButton = !listeners[id]; button = !isNewButton ? listeners[id].elem : _doc.createElement('input'); button.type = 'button'; if( !listeners[id] ) listeners[id] = {}; if( value ) button.value = value; if( item.callback ) listeners[id].callback = item.callback; if( item.focus ) { that._focus && that._focus.removeClass(focusButton); that._focus = $(button).addClass(focusButton); that.focus(); } button[expando + 'callback'] = id; button.disabled = !!item.disabled; if( isNewButton ) { listeners[id].elem = button; buttons.appendChild(button); } } buttons.style.display = ags.length ? '' : 'none'; that._ie6SelectFix(); return that; }, /** * 设置标题 * @param {String, Boolean} 标题内容. 为false则隐藏标题栏 * @return {this} 如果无参数则返回对象本身 */ title: function( text ) { if( text === undefined ) return this; var DOM = this.DOM, border = DOM.border, title = DOM.title[0]; if( text === false ) { title.style.display = 'none'; title.innerHTML = ''; border.addClass('ui_state_tips'); } else { title.style.display = ''; title.innerHTML = text; border.removeClass('ui_state_tips'); }; return this; }, /*! * 设置内容 * @param {String} 内容 (如果内容前3个字符为‘url:’就加载单独页面的内容页) * @param {Boolean} 是否为后增加的内容 * @param {Boolean} 是否使用iframe方式加载内容页 * @return {this} 如果无参数则返回对象本身 */ content: function( msg, add, frm ) { if( msg === undefined ) return this; var that = this, DOM = that.DOM, wrap = DOM.wrap[0], width = wrap.offsetWidth, height = wrap.offsetHeight, left = parseInt(wrap.style.left), top = parseInt(wrap.style.top), cssWidth = wrap.style.width, $content = DOM.content, loading = lhgdialog.setting.content; // 假如内容中前3个字符为'url:'就加载相对路径的单独页面的内容页 if( frm ) { $content[0].innerHTML = loading; that._iframe( msg.split('url:')[1] ); } else $content.html( msg ); // 新增内容后调整位置 if( !add ) { width = wrap.offsetWidth - width; height = wrap.offsetHeight - height; left = left - width / 2; top = top - height / 2; wrap.style.left = Math.max(left, 0) + 'px'; wrap.style.top = Math.max(top, 0) + 'px'; if( cssWidth && cssWidth !== 'auto' ) wrap.style.width = wrap.offsetWidth + 'px'; that._autoPositionType(); } that._ie6SelectFix(); return that; }, /** * 尺寸 * @param {Number, String} 宽度 * @param {Number, String} 高度 */ size: function( width, height ) { var that = this, DOM = that.DOM, wrap = DOM.wrap[0], style = DOM.main[0].style; wrap.style.width = 'auto'; if( typeof width === 'number' ) width = width + 'px'; if( typeof height === 'number' ) height = height + 'px'; style.width = width; style.height = height; if( width !== 'auto' ) // 防止未定义宽度的表格遇到浏览器右边边界伸缩 wrap.style.width = wrap.offsetWidth + 'px'; that._ie6SelectFix(); return that; }, /** * 位置(相对于可视区域) * @param {Number, String} * @param {Number, String} */ position: function( left, top ) { var that = this, config = that.config, wrap = that.DOM.wrap[0], style = wrap.style, isFixed = _ie6 ? false : config.fixed, ie6Fixed = _ie6 && config.fixed, docLeft = _$top.scrollLeft(), docTop = _$top.scrollTop(), dl = isFixed ? 0 : docLeft, dt = isFixed ? 0 : docTop, ww = _$top.width(), wh = _$top.height(), ow = wrap.offsetWidth, oh = wrap.offsetHeight; if( left || left === 0 ) { that._left = left.toString().indexOf('%') !== -1 ? left : null; left = that._toNumber(left, ww - ow); if( typeof left === 'number' ) { left = ie6Fixed ? (left += docLeft) : left + dl; left = Math.max(left,dl) + 'px'; } style.left = left; } if( top || top === 0 ) { that._top = top.toString().indexOf('%') !== -1 ? top : null; top = that._toNumber(top, wh - oh); if( typeof top === 'number' ) { top = ie6Fixed ? (top += docTop) : top + dt; top = Math.max(top,dt) + 'px'; } style.top = top; } if( left !== undefined && top !== undefined ) that._autoPositionType(); return that; }, /*! * 定时关闭 * @param {Number} 单位为秒, 无参数则停止计时器 * @param {Function} 关闭窗口前执行的回调函数 */ time: function( second, callback ) { var that = this, timer = that._timer; timer && clearTimeout(timer); callback && callback.call(that); if(second) { that._timer = setTimeout(function(){ that._click('cancel'); }, 1000 * second); } return that; }, /*! 显示对话框 */ show: function( args ) { this.DOM.wrap[0].style.visibility = 'visible'; this.DOM.border.addClass('ui_state_visible'); if( !args && this._lock ) $('#ldg_lockmask',_doc)[0].style.display = ''; return this; }, /*! 隐藏对话框 */ hide: function( args ) { this.DOM.wrap[0].style.visibility = 'hidden'; this.DOM.border.removeClass('ui_state_visible'); if( !args && this._lock ) $('#ldg_lockmask',_doc)[0].style.display = 'none'; return this; }, /*! 置顶对话框 */ zindex: function() { var that = this, DOM = that.DOM, load = that._load, top = lhgdialog.focus, index = lhgdialog.setting.zIndex++; // 设置叠加高度 DOM.wrap[0].style.zIndex = index; // 设置最高层的样式 top && top.DOM.border.removeClass('ui_state_focus'); lhgdialog.focus = that; DOM.border.addClass('ui_state_focus'); // 扩展窗口置顶功能,只用在iframe方式加载内容 // 或跨域加载内容页时点窗口内容主体部分置顶窗口 if( load && load.style.zIndex ) load.style.display = 'none'; if( top && top !== that && top.iframe ) top._load.style.display = ''; return that; }, /*! 设置焦点 */ focus: function() { try{ elemFocus = this._focus && this._focus[0] || this.DOM.close[0]; elemFocus && elemFocus.focus(); }catch(e){}; return this; }, /*! 锁屏 */ lock: function() { var that = this, frm, index = lhgdialog.setting.zIndex - 1, config = that.config, mask = $('#ldg_lockmask',_doc)[0], style = mask ? mask.style : '', positionType = _ie6 ? 'absolute' : 'fixed'; if( !mask ) { frm = ''; mask = _doc.createElement('div'); mask.id = 'ldg_lockmask'; mask.style.cssText = 'position:' + positionType + ';left:0;top:0;width:100%;height:100%;overflow:hidden;'; style = mask.style; if( _ie6 ) mask.innerHTML = frm; _doc.body.appendChild( mask ); } if( positionType === 'absolute' ) { style.width = _$top.width(); style.height = _$top.height(); style.top = _$top.scrollTop(); style.left = _$top.scrollLeft(); that._setFixed( mask ); } style.zIndex = index; style.display = ''; that.zindex(); that.DOM.border.addClass('ui_state_lock'); that._lock = true; return that; }, /*! 解除锁屏 */ unlock: function() { var that = this, config = that.config, mask = $('#ldg_lockmask',_doc)[0]; if( mask && that._lock ) { // 无限级锁屏 if( config.parent && config.parent._lock ) { var index = config.parent.DOM.wrap[0].style.zIndex; mask.style.zIndex = parseInt(index,10) - 1; } else mask.style.display = 'none'; that.DOM.border.removeClass('ui_state_lock'); } that._lock = false; return that; }, /*! 关闭对话框 */ close: function() { var that = this, DOM = that.DOM, wrap = DOM.wrap, list = lhgdialog.list, fn = that.config.close; that.time(); // 当使用iframe方式加载内容页时的处理代码 if( that.iframe ) { if( typeof fn === 'function' && fn.call(that, that.iframe.contentWindow, window) === false ) return that; // 重要!需要重置iframe地址,否则下次出现的对话框在IE6、7无法聚焦input // IE删除iframe后,iframe仍然会留在内存中出现上述问题,置换src是最容易解决的方法 $(that.iframe).unbind('load',that._fmLoad).attr('src',"javascript:''").remove(); DOM.content.removeClass('ui_state_full'); if( that._frmTimer ) clearTimeout(that._frmTimer); } else { if( typeof fn === 'function' && fn.call(that, window) === false ) return that; } that.unlock(); if( that._maxState ) { _$html.removeClass('ui_lock_scroll'); DOM.res[0].style.display = 'none'; } if( lhgdialog.focus === that ) lhgdialog.focus = null; that._removeEvent(); delete list[that.config.id]; // 移除HTMLElement或重用 if( _singleton ) wrap.remove(); else { _singleton = that; if( that._minState ) { DOM.main[0].style.display = ''; DOM.buttons[0].style.display = ''; DOM.dialog[0].style.width = ''; } DOM.wrap[0].style.cssText = 'left:0;top:0;'; DOM.wrap[0].className = ''; DOM.border.removeClass('ui_state_focus'); DOM.title[0].innerHTML = ''; DOM.content.html(''); DOM.icon[0].innerHTML = ''; DOM.buttons[0].innerHTML = ''; that.hide(true)._setAbsolute(); // 清空除this.DOM之外临时对象,恢复到初始状态,以便使用单例模式 for( var i in that ) { if(that.hasOwnProperty(i) && i !== 'DOM') delete that[i]; }; } that.closed = true; return that; }, /*! 最大化窗口 */ max: function() { var that = this, maxSize, DOM = that.DOM, wrapStyle = DOM.wrap[0].style, mainStyle = DOM.main[0].style, rbStyle = DOM.rb[0].style, titleStyle = DOM.title[0].style, config = that.config, top = _$top.scrollTop(), left = _$top.scrollLeft(); if( !that._maxState ) { _$html.addClass('ui_lock_scroll'); if( that._minState ) that.min(); // 存储最大化窗口前的状态 that._or = { t: wrapStyle.top, l: wrapStyle.left, w: mainStyle.width, h: mainStyle.height, d: config.drag, r: config.resize, rc: rbStyle.cursor, tc: titleStyle.cursor }; wrapStyle.top = top + 'px'; wrapStyle.left = left + 'px'; maxSize = that._maxSize(); that.size( maxSize.w, maxSize.h )._setAbsolute(); if( _ie6 && _doctype ) wrapStyle.width = _$top.width() + 'px'; config.drag = false; config.resize = false; rbStyle.cursor = 'auto'; titleStyle.cursor = 'auto'; DOM.max[0].style.display = 'none'; DOM.res[0].style.display = 'inline-block'; that._maxState = true; } else { _$html.removeClass('ui_lock_scroll'); wrapStyle.top = that._or.t; wrapStyle.left = that._or.l; that.size( that._or.w, that._or.h )._autoPositionType(); config.drag = that._or.d; config.resize = that._or.r; rbStyle.cursor = that._or.rc; titleStyle.cursor = that._or.tc; DOM.res[0].style.display = 'none'; DOM.max[0].style.display = 'inline-block'; delete that._or; that._maxState = false; } return that; }, /*! 最小化窗口 */ min: function() { var that = this, DOM = that.DOM, main = DOM.main[0].style, buttons = DOM.buttons[0].style, dialog = DOM.dialog[0].style, rb = DOM.rb[0].style.cursor, resize = that.config.resize; if( !that._minState ) { if( that._maxState ) that.max(); that._minRz = {rzs:resize,btn:buttons.display}; main.display = 'none'; buttons.display = 'none'; dialog.width = main.width; rb.cursor = 'auto'; resize = false; that._minState = true; } else { main.display = ''; buttons.display = that._minRz.btn; dialog.width = ''; resize = that._minRz; rb.cursor = that._minRz.rzs ? 'se-resize' : 'auto'; delete that._minRz; that._minState = false; } that._ie6SelectFix(); return that; }, /*! * 获取指定id的窗口对象或窗口中iframe加载的内容页的window对象 * @param {String} 指定的id * @param {String} 是否返回的为指定id的窗口对象 * 用数字1来表示真,如果不写或写其它为false * @return {Object|null} */ get: function( id, object ) { if( lhgdialog.list[id] ) { if( object === 1 ) return lhgdialog.list[id]; else return lhgdialog.list[id].content || null; } return null; }, /** * 刷新或跳转指定页面 * @param {Object, 指定页面的window对象} * @param {String, 要跳转到的页面地址} */ reload: function( win, url, callback ) { win = win || window; try{ win.location.href = url ? url : win.location.href; } catch(e){ // 跨域 url = this.iframe.src; $(this.iframe).attr('src', url); }; callback && callback.call( this ); return this; }, /*! * 设置iframe方式加载内容页 */ _iframe: function( url ) { var that = this, iframe, $iframe, iwin, $idoc, $ibody, iWidth, iHeight, $content = that.DOM.content, config = that.config, loading = that._load = $('.ui_loading',$content[0])[0], initCss = 'position:absolute;left:-9999em;border:none 0;background:transparent', loadCss = 'width:100%;height:100%;border:none 0;'; // 是否允许缓存. 默认true if( config.cache === false ) { var ts = (new Date).getTime(), ret = url.replace(/([?&])_=[^&]*/, '$1_=' + ts ); url = ret + ((ret === url) ? (/\?/.test(url) ? '&' : '?') + '_=' + ts : ''); } iframe = that.iframe = _doc.createElement('iframe'); iframe.name = config.id; iframe.style.cssText = initCss; iframe.setAttribute('frameborder', 0, 0); $iframe = $(iframe); $content[0].appendChild( iframe ); // 延迟加载iframe的src属性,IE6下不延迟加载会出现加载进度条的BUG that._frmTimer = setTimeout(function(){ $iframe.attr('src', url); }, 1); // iframe中页面加载完成后执行的函数 var load = that._fmLoad = function() { $content.addClass('ui_state_full'); // 增强窗口置顶功能,iframe方式加载内容或跨域加载内容页时点窗口内容部分置顶窗口 // 通过使用重置loading层来优雅的完成此功能,在focus方法中有此功能的相关代码 var DOM = that.DOM, ltSize, lt = DOM.lt[0].offsetHeight, main = DOM.main[0].style; loading.style.cssText = 'display:none;position:absolute;background:#FFF;opacity:0;' + 'filter:alpha(opacity=0);z-index:1;width:' + main.width + ';height:' + main.height + ';'; // 此部分代码结束,在拖动改变大小的_dragEvent.onmove方法中还有此功能的相关代码 try{ iwin = that.content = iframe.contentWindow; // 定义窗口对象content属性为内容页的window对象 $idoc = $(iwin.document); $ibody = $(iwin.document.body); }catch(e){// 跨域 iframe.style.cssText = loadCss; return; } // 获取iframe内部尺寸 iWidth = config.width === 'auto' ? $idoc.width() + (_ie6 ? 0 : parseInt($ibody.css('marginLeft'))) : config.width; iHeight = config.height === 'auto' ? $idoc.height() : config.height; // 适应iframe尺寸 setTimeout(function(){ iframe.style.cssText = loadCss; },0);// setTimeout: 防止IE6~7对话框样式渲染异常 // 窗口最大化时这里不用再计算窗口的尺寸和位置了,如果再计算窗口会出现错位 if( !that._maxState ) { that.size( iWidth, iHeight ) .position( config.left, config.top ); } // 非跨域时还要对loading层重设大小,要不宽和度都为'auto' loading.style.width = main.width; loading.style.height = main.height; config.init && config.init.call( that, iwin, _top ); }; // 绑定iframe元素api属性为窗口自身对象,在内容页中此属性很重要 that.iframe.api = that; $iframe.bind( 'load', load ); }, /*! 获取窗口元素 */ _getDOM: function() { var wrap = _doc.createElement('div'), body = _doc.body; wrap.style.cssText = 'position:absolute;left:0;top:0;visibility:hidden;'; wrap.innerHTML = dialogTpl; var name, i = 0, DOM = { wrap: $(wrap) }, els = wrap.getElementsByTagName('*'), len = els.length; for( ; i < len; i ++ ) { name = els[i].className.split('ui_')[1]; if(name) DOM[name] = $(els[i]); }; body.insertBefore(wrap, body.firstChild); return DOM; }, /*! * px与%单位转换成数值 (百分比单位按照最大值换算) * 其他的单位返回原值 */ _toNumber: function( thisValue, maxValue ) { if( typeof thisValue === 'number' ) return thisValue; if( thisValue.indexOf('%') !== -1 ) thisValue = parseInt(maxValue * thisValue.split('%')[0] / 100); return thisValue; }, /*! 计算最大化窗口时窗口的尺寸 */ _maxSize: function() { var that = this, DOM = that.DOM, wrap = DOM.wrap[0], main = DOM.main[0], maxWidth, maxHeight; maxWidth = _$top.width() - wrap.offsetWidth + main.offsetWidth; maxHeight = _$top.height() - wrap.offsetHeight + main.offsetHeight; return { w: maxWidth, h: maxHeight }; }, /*! 让IE6 CSS支持PNG背景 */ _ie6PngFix: function() { if( _ie6 ) { var i = 0, elem, png, pngPath, runtimeStyle, path = lhgdialog.setting.path + '/skins/', list = this.DOM.wrap[0].getElementsByTagName('*'); for( ; i < list.length; i ++ ) { elem = list[i]; png = elem.currentStyle['png']; if( png ) { pngPath = path + png; runtimeStyle = elem.runtimeStyle; runtimeStyle.backgroundImage = 'none'; runtimeStyle.filter = "progid:DXImageTransform.Microsoft." + "AlphaImageLoader(src='" + pngPath + "',sizingMethod='scale')"; }; } } return this; }, /*! 强制覆盖IE6下拉控件 */ _ie6SelectFix: _ie6 ? function(){ var $wrap = this.DOM.wrap, wrap = $wrap[0], expando = expando + 'iframeMask', iframe = $wrap[expando], width = wrap.offsetWidth, height = wrap.offsetHeight; width = width + 'px'; height = height + 'px'; if(iframe) { iframe.style.width = width; iframe.style.height = height; }else{ iframe = wrap.appendChild(_doc.createElement('iframe')); $wrap[expando] = iframe; iframe.src = "javascript:''"; iframe.style.cssText = 'position:absolute;z-index:-1;left:0;top:0;' + 'filter:alpha(opacity=0);width:' + width + ';height:' + height; } } : _fn, /*! 自动切换定位类型 */ _autoPositionType: function() { this[this.config.fixed ? '_setFixed' : '_setAbsolute'](); }, /*! 设置静止定位 */ _setFixed: function( el ) { var style = el ? el.style : this.DOM.wrap[0].style; if( _ie6 ) { var sLeft = _$top.scrollLeft(), sTop = _$top.scrollTop(), left = parseInt(style.left) - sLeft, top = parseInt(style.top) - sTop, txt = _doctype ? 'this.ownerDocument.body' : 'this.ownerDocument.documentElement'; this._setAbsolute(); style.setExpression( 'left', txt + '.scrollLeft +' + left ); style.setExpression( 'top', txt + '.scrollTop +' + top ); } else style.position = 'fixed'; }, /*! 设置绝对定位 */ _setAbsolute: function() { var style = this.DOM.wrap[0].style; if(_ie6) { style.removeExpression('left'); style.removeExpression('top'); } style.position = 'absolute'; }, /*! 按钮回调函数触发 */ _click: function( name ) { var that = this, fn = that._listeners[name] && that._listeners[name].callback; return typeof fn !== 'function' || fn.call(that, window) !== false ? that.close() : that; }, /*! 重置位置与尺寸 */ _reset: function() { var test = !!window.ActiveXObject, newSize, that = this, tw = _$top.width(), tt = _$top.height(), oldSize = that._winSize || tw * tt, oldWidth = that._lockDocW || tw, left = that._left, top = that._top; if(test) { //IE6下遮罩大小改变 if( that._lock && _ie6 ) $('#ldg_lockmask',_doc).css({ width:tw + 'px', height:tt + 17 + 'px' }); newWidth = that._lockDocW = tw; //IE6~7 window.onresize bug newSize = that._winSize = tw * tt; if( oldSize === newSize ) return; }; if( that._maxState ) { var size = that._maxSize(); that.size( size.w, size.h ); } //IE6~8会出现最大化还原后窗口重新定位,锁定滚动条在IE下就会触发resize事件BUG if( test && Math.abs(oldWidth - newWidth) === 17 ) return; if( left || top ) that.position( left, top ); }, _addEvent: function() { var resizeTimer, that = this, config = that.config, DOM = that.DOM; // 窗口调节事件 that._winResize = function() { resizeTimer && clearTimeout(resizeTimer); resizeTimer = setTimeout(function() { that._reset(); }, 140); }; _$top.bind('resize', that._winResize); // 监听点击 DOM.wrap.bind('click', function(event){ var target = event.target, callbackID; if( target.disabled ) return false; // IE BUG if( target === DOM.close[0] ) { that._click('cancel'); return false; } else if( target === DOM.max[0] || target === DOM.res[0] || target === DOM.max_b[0] || target === DOM.res_b[0] || target === DOM.res_t[0] ) { that.max(); return false; } else if( target === DOM.min[0] || target === DOM.min_b[0] ) { that.min(); return false; } else { callbackID = target[expando + 'callback']; callbackID && that._click(callbackID); } }).bind('mousedown',function(event){ that.zindex(); var target = event.target; if( config.drag !== false && target === DOM.title[0] || config.resize !== false && target === DOM.rb[0] ) { _use(event); return false; } }); // 双击标题栏最大化还窗口事件 if( config.max ) DOM.title.bind('dblclick',function(){ that.max(); return false; }); }, /*! 卸载事件代理 */ _removeEvent: function() { var that = this, DOM = that.DOM; DOM.wrap.unbind(); DOM.title.unbind(); _$top.unbind('resize', that._winResize); } }; lhgdialog.fn._init.prototype = lhgdialog.fn; /*! 此对象用来存储获得焦点的窗口对象实例 */ lhgdialog.focus = null; /*! 存储窗口实例的对象列表 */ lhgdialog.list = {}; /*! * 全局快捷键 * 由于跨框架时事件是绑定到最顶层页面,所以当当前页面卸载时必须要除移此事件 * 所以必须unbind此事件绑定的函数,所以这里要给绑定的事件定义个函数 * 这样在当前页面卸载时就可以移此事件绑定的相应函数,不而不影响顶层页面此事件绑定的其它函数 */ onKeyDown = function(event) { var target = event.target, api = lhgdialog.focus, keyCode = event.keyCode; if( !api || !api.config.esc || api.config.cancel === false ) return; keyCode === 27 && api._click(api.config.cancelVal); }; _$doc.bind('keydown',onKeyDown); /*! * 框架页面卸载前关闭所有穿越的对话框 * 同时移除拖动层和遮罩层 */ _top != window && $(window).bind('unload',function() { var list = lhgdialog.list; for( var i in list ) { if(list[i]) list[i].close(); } _singleton && _singleton.DOM.wrap.remove(); _$doc.unbind('keydown',onKeyDown); $('#ldg_lockmask',_doc)[0] && $('#ldg_lockmask',_doc).remove(); $('#ldg_dragmask',_doc)[0] && $('#ldg_dragmask',_doc).remove(); }); /*! lhgdialog 的全局默认配置 */ lhgdialog.setting = { content: '
loading...
', title: '\u89C6\u7A97 ', // 标题,默认'视窗' button: null, // 自定义按钮 ok: null, // 确定按钮回调函数 cancel: null, // 取消按钮回调函数 init: null, // 对话框初始化后执行的函数 close: null, // 对话框关闭前执行的函数 okVal: '\u786E\u5B9A', // 确定按钮文本,默认'确定' cancelVal: '\u53D6\u6D88', // 取消按钮文本,默认'取消' skin: '', // 多皮肤共存预留接口 esc: true, // 是否支持Esc键关闭 show: true, // 初始化后是否显示对话框 width: 'auto', // 内容宽度 height: 'auto', // 内容高度 icon: null, // 消息图标名称 path: _path, // lhgdialog路径 lock: false, // 是否锁屏 focus: true, // 窗口是否自动获取焦点 parent: null, // 打开子窗口的父窗口对象,主要用于多层锁屏窗口 padding: '10px', // 内容与边界填充距离 fixed: false, // 是否静止定位 left: '50%', // X轴坐标 top: '38.2%', // Y轴坐标 max: true, // 是否显示最大化按钮 min: true, // 是否显示最小化按钮 zIndex: 1976, // 对话框叠加高度值(重要:此值不能超过浏览器最大限制) resize: true, // 是否允许用户调节尺寸 drag: true, // 是否允许用户拖动位置 cache: true, // 是否缓存窗口内容页 data: null, // 传递各种数据 extendDrag: false // 增加lhgdialog拖拽体验 }; /*! *------------------------------------------------ * 对话框模块-拖拽支持(可选外置模块) *------------------------------------------------ */ var _use, _isSetCapture = 'setCapture' in _root, _isLosecapture = 'onlosecapture' in _root; lhgdialog.dragEvent = { onstart: _fn, start: function(event) { var that = lhgdialog.dragEvent; _$doc .bind( 'mousemove', that.move ) .bind( 'mouseup', that.end ); that._sClientX = event.clientX; that._sClientY = event.clientY; that.onstart( event.clientX, event.clientY ); return false; }, onmove: _fn, move: function(event) { var that = lhgdialog.dragEvent; that.onmove( event.clientX - that._sClientX, event.clientY - that._sClientY ); return false; }, onend: _fn, end: function(event) { var that = lhgdialog.dragEvent; _$doc .unbind('mousemove', that.move) .unbind('mouseup', that.end); that.onend( event.clientX, event.clientY ); return false; } }; _use = function(event) { var limit, startWidth, startHeight, startLeft, startTop, isResize, api = lhgdialog.focus, config = api.config, DOM = api.DOM, wrap = DOM.wrap[0], title = DOM.title, main = DOM.main[0], _dragEvent = lhgdialog.dragEvent, // 清除文本选择 clsSelect = 'getSelection' in _top ? function(){ _top.getSelection().removeAllRanges(); }:function(){ try{_doc.selection.empty();}catch(e){}; }; // 对话框准备拖动 _dragEvent.onstart = function( x, y ) { if( isResize ) { startWidth = main.offsetWidth; startHeight = main.offsetHeight; } else { startLeft = wrap.offsetLeft; startTop = wrap.offsetTop; }; _$doc.bind( 'dblclick', _dragEvent.end ); !_ie6 && _isLosecapture ? title.bind('losecapture',_dragEvent.end ) : _$top.bind('blur',_dragEvent.end); _isSetCapture && title[0].setCapture(); DOM.border.addClass('ui_state_drag'); api.focus(); }; // 对话框拖动进行中 _dragEvent.onmove = function( x, y ) { if( isResize ) { var wrapStyle = wrap.style, style = main.style, width = x + startWidth, height = y + startHeight; wrapStyle.width = 'auto'; config.width = style.width = Math.max(0,width) + 'px'; wrapStyle.width = wrap.offsetWidth + 'px'; config.height = style.height = Math.max(0,height) + 'px'; //api._ie6SelectFix(); // 使用loading层置顶窗口时窗口大小改变相应loading层大小也得改变 api._load && $(api._load).css({width:style.width, height:style.height}); } else { var style = wrap.style, left = x + startLeft, top = y + startTop; config.left = Math.max( limit.minX, Math.min(limit.maxX,left) ); config.top = Math.max( limit.minY, Math.min(limit.maxY,top) ); style.left = config.left + 'px'; style.top = config.top + 'px'; } clsSelect(); }; // 对话框拖动结束 _dragEvent.onend = function( x, y ) { _$doc.unbind('dblclick',_dragEvent.end); !_ie6 && _isLosecapture ? title.unbind('losecapture',_dragEvent.end) : _$top.unbind('blur',_dragEvent.end); _isSetCapture && title[0].releaseCapture(); _ie6 && api._autoPositionType(); DOM.border.removeClass('ui_state_drag'); }; isResize = event.target === DOM.rb[0] ? true : false; limit = (function(fixed) { var ow = wrap.offsetWidth, // 向下拖动时不能将标题栏拖出可视区域 oh = title[0].offsetHeight || 20, ww = _$top.width(), wh = _$top.height(), dl = fixed ? 0 : _$top.scrollLeft(), dt = fixed ? 0 : _$top.scrollTop(); // 坐标最大值限制(在可视区域内) maxX = ww - ow + dl; maxY = wh - oh + dt; return { minX: dl, minY: dt, maxX: maxX, maxY: maxY }; })(wrap.style.position === 'fixed'); _dragEvent.start(event); }; /*! * 页面DOM加载完成执行的代码 */ $(function(){ // 触发浏览器预先缓存背景图片 setTimeout(function() { if(_count) return; lhgdialog({left:'-9999em',time:9,fixed:false,lock:false,focus:false}); },150); // 增强lhgdialog拖拽体验(可选外置模块,如不需要可删除) // 防止鼠标落入iframe导致不流畅,对超大对话框拖动优化 lhgdialog.setting.extendDrag && (function(dragEvent){ var mask = _doc.createElement('div'), style = mask.style, positionType = _ie6 ? 'absolute' : 'fixed'; mask.id = 'ldg_dragmask'; style.cssText = 'display:none;position:' + positionType + ';left:0;top:0;width:100%;height:100%;' + 'cursor:move;filter:alpha(opacity=0);opacity:0;background:#FFF;pointer-events:none;'; _doc.body.appendChild(mask); dragEvent._start = dragEvent.start; dragEvent._end = dragEvent.end; dragEvent.start = function() { var api = lhgdialog.focus, main = api.DOM.main[0], iframe = api.iframe; dragEvent._start.apply(this, arguments); style.display = 'block'; style.zIndex = lhgdialog.setting.zIndex + 3; if(positionType === 'absolute') { style.width = _$top.width() + 'px'; style.height = _$top.height() + 'px'; style.left = _$doc.scrollLeft() + 'px'; style.top = _$doc.scrollTop() + 'px'; }; if( iframe && main.offsetWidth * main.offsetHeight > 307200 ) main.style.visibility = 'hidden'; }; dragEvent.end = function() { var api = lhgdialog.focus; dragEvent._end.apply(this, arguments); style.display = 'none'; if(api) api.DOM.main[0].style.visibility = 'visible'; }; })(lhgdialog.dragEvent); }); /*! 使用jQ方式调用窗口 */ $.fn.dialog = function() { var config = arguments; this.bind('click',function(){ lhgdialog.apply(this,config); return false; }); return this; }; window.lhgdialog = $.dialog = lhgdialog; })( this.jQuery || this.lhgcore, this ); /*! *------------------------------------------------ * 对话框其它功能扩展模块(可选外置模块) *------------------------------------------------ */ ;(function( $, lhgdialog, undefined ){ var _zIndex = function() { return lhgdialog.setting.zIndex; }; /** * 警告 * @param {String} 消息内容 */ lhgdialog.alert = function( content, callback, parent ) { return lhgdialog({ title: '警告', id: 'Alert', zIndex: _zIndex(), icon: 'alert.gif', fixed: true, lock: true, content: content, ok: true, resize: false, close: callback, parent: parent || null }); }; /** * 确认 * @param {String} 消息内容 * @param {Function} 确定按钮回调函数 * @param {Function} 取消按钮回调函数 */ lhgdialog.confirm = function( content, yes, no, parent ) { return lhgdialog({ title: '确认', id: 'confirm.gif', zIndex: _zIndex(), icon: 'confirm.gif', fixed: true, lock: true, content: content, resize: false, parent: parent || null, ok: function(here){ return yes.call(this, here); }, cancel: function(here){ return no && no.call(this, here); } }); }; /** * 提问 * @param {String} 提问内容 * @param {Function} 回调函数. 接收参数:输入值 * @param {String} 默认值 */ lhgdialog.prompt = function( content, yes, value, parent ) { value = value || ''; var input; return lhgdialog({ title: '提问', id: 'Prompt', zIndex: _zIndex(), icon: 'prompt.gif', fixed: true, lock: true, parent: parent || null, content: [ '
', content, '
', '
', '', '
' ].join(''), init: function(){ input = this.DOM.content[0].getElementsByTagName('input')[0]; input.select(); input.focus(); }, ok: function(here){ return yes && yes.call(this, input.value, here); }, cancel: true }); }; /** * 短暂提示 * @param {String} 提示内容 * @param {Number} 显示时间 (默认1.5秒) * @param {String} 提示图标 (注意要加扩展名) * @param {Function} 提示关闭时执行的回调函数 */ lhgdialog.tips = function( content, time, icon, callback ) { var reIcon = icon ? function(){ this.DOM.icon[0].innerHTML = ''; this.DOM.icon[0].style.display = ''; if( callback ) this.config.close = callback; } : function(){ this.DOM.icon[0].style.display = 'none'; if( callback ) this.config.close = callback; }; return lhgdialog({ id: 'Tips', zIndex: _zIndex(), title: false, cancel: false, fixed: true, lock: false, resize: false }) .content(content) .time(time || 5.0, reIcon); }; })( this.jQuery||this.lhgcore, this.lhgdialog );