/*! artDialog v6.0.5 | https://github.com/aui/artDialog */ !(function () { var __modules__ = {}; function require (id) { var mod = __modules__[id]; var exports = 'exports'; if (typeof mod === 'object') { return mod; } if (!mod[exports]) { mod[exports] = {}; mod[exports] = mod.call(mod[exports], require, mod[exports], mod) || mod[exports]; } return mod[exports]; } function define (path, fn) { __modules__[path] = fn; } define("jquery", function () { return jQuery; }); /*! * PopupJS * Date: 2014-11-09 * https://github.com/aui/popupjs * (c) 2009-2014 TangBin, http://www.planeArt.cn * * This is licensed under the GNU LGPL, version 2.1 or later. * For details, see: http://www.gnu.org/licenses/lgpl-2.1.html */ define("popup", function (require) { var $ = require("jquery"); var _count = 0; var _isIE6 = !('minWidth' in $('html')[0].style); var _isFixed = !_isIE6; function Popup () { this.destroyed = false; this.__popup = $('
') /*使用 元素可能导致 z-index 永远置顶的问题(chrome)*/ .css({ display: 'none', position: 'absolute', /* left: 0, top: 0, bottom: 'auto', right: 'auto', margin: 0, padding: 0, border: '0 none', background: 'transparent' */ outline: 0 }) .attr('tabindex', '-1') .html(this.innerHTML) .appendTo('body'); this.__backdrop = this.__mask = $('') .css({ opacity: .7, background: '#000' }); // 使用 HTMLElement 作为外部接口使用,而不是 jquery 对象 // 统一的接口利于未来 Popup 移植到其他 DOM 库中 this.node = this.__popup[0]; this.backdrop = this.__backdrop[0]; _count ++; } $.extend(Popup.prototype, { /** * 初始化完毕事件,在 show()、showModal() 执行 * @name Popup.prototype.onshow * @event */ /** * 关闭事件,在 close() 执行 * @name Popup.prototype.onclose * @event */ /** * 销毁前事件,在 remove() 前执行 * @name Popup.prototype.onbeforeremove * @event */ /** * 销毁事件,在 remove() 执行 * @name Popup.prototype.onremove * @event */ /** * 重置事件,在 reset() 执行 * @name Popup.prototype.onreset * @event */ /** * 焦点事件,在 foucs() 执行 * @name Popup.prototype.onfocus * @event */ /** * 失焦事件,在 blur() 执行 * @name Popup.prototype.onblur * @event */ /** 浮层 DOM 素节点[*] */ node: null, /** 遮罩 DOM 节点[*] */ backdrop: null, /** 是否开启固定定位[*] */ fixed: true, /** 判断对话框是否删除[*] */ destroyed: true, /** 判断对话框是否显示 */ open: false, /** close 返回值 */ returnValue: '', /** 是否自动聚焦 */ autofocus: true, /** 对齐方式[*] */ align: 'bottom left', /** 内部的 HTML 字符串 */ innerHTML: '', /** CSS 类名 */ className: 'ui-popup', /** * 显示浮层 * @param {HTMLElement, Event} 指定位置(可选) */ show: function (anchor) { if (this.destroyed) { return this; } var that = this; var popup = this.__popup; var backdrop = this.__backdrop; this.__activeElement = this.__getActive(); this.open = true; this.follow = anchor || this.follow; // 初始化 show 方法 if (!this.__ready) { popup .addClass(this.className) .attr('role', this.modal ? 'alertdialog' : 'dialog') .css('position', this.fixed ? 'fixed' : 'absolute'); if (!_isIE6) { $(window).on('resize', $.proxy(this.reset, this)); } // 模态浮层的遮罩 if (this.modal) { var backdropCss = { position: 'fixed', left: 0, top: 0, width: '100%', height: '100%', overflow: 'hidden', userSelect: 'none', zIndex: this.zIndex || Popup.zIndex }; popup.addClass(this.className + '-modal'); if (!_isFixed) { $.extend(backdropCss, { position: 'absolute', width: $(window).width() + 'px', height: $(document).height() + 'px' }); } backdrop .css(backdropCss) .attr({tabindex: '0'}) .on('focus', $.proxy(this.focus, this)); // 锁定 tab 的焦点操作 this.__mask = backdrop .clone(true) .attr('style', '') .insertAfter(popup); backdrop .addClass(this.className + '-backdrop') .insertBefore(popup); this.__ready = true; } if (!popup.html()) { popup.html(this.innerHTML); } } popup .addClass(this.className + '-show') .show(); backdrop.show(); this.reset().focus(); this.__dispatchEvent('show'); return this; }, /** 显示模态浮层。参数参见 show() */ showModal: function () { this.modal = true; return this.show.apply(this, arguments); }, /** 关闭浮层 */ close: function (result) { if (!this.destroyed && this.open) { if (result !== undefined) { this.returnValue = result; } this.__popup.hide().removeClass(this.className + '-show'); this.__backdrop.hide(); this.open = false; this.blur();// 恢复焦点,照顾键盘操作的用户 this.__dispatchEvent('close'); } return this; }, /** 销毁浮层 */ remove: function () { if (this.destroyed) { return this; } this.__dispatchEvent('beforeremove'); if (Popup.current === this) { Popup.current = null; } // 从 DOM 中移除节点 this.__popup.remove(); this.__backdrop.remove(); this.__mask.remove(); if (!_isIE6) { $(window).off('resize', this.reset); } this.__dispatchEvent('remove'); for (var i in this) { delete this[i]; } return this; }, /** 重置位置 */ reset: function () { var elem = this.follow; if (elem) { this.__follow(elem); } else { this.__center(); } this.__dispatchEvent('reset'); return this; }, /** 让浮层获取焦点 */ focus: function () { var node = this.node; var popup = this.__popup; var current = Popup.current; var index = this.zIndex = Popup.zIndex ++; if (current && current !== this) { current.blur(false); } // 检查焦点是否在浮层里面 if (!$.contains(node, this.__getActive())) { var autofocus = popup.find('[autofocus]')[0]; if (!this._autofocus && autofocus) { this._autofocus = true; } else { autofocus = node; } this.__focus(autofocus); } // 设置叠加高度 popup.css('zIndex', index); //this.__backdrop.css('zIndex', index); Popup.current = this; popup.addClass(this.className + '-focus'); this.__dispatchEvent('focus'); return this; }, /** 让浮层失去焦点。将焦点退还给之前的元素,照顾视力障碍用户 */ blur: function () { var activeElement = this.__activeElement; var isBlur = arguments[0]; if (isBlur !== false) { this.__focus(activeElement); } this._autofocus = false; this.__popup.removeClass(this.className + '-focus'); this.__dispatchEvent('blur'); return this; }, /** * 添加事件 * @param {String} 事件类型 * @param {Function} 监听函数 */ addEventListener: function (type, callback) { this.__getEventListener(type).push(callback); return this; }, /** * 删除事件 * @param {String} 事件类型 * @param {Function} 监听函数 */ removeEventListener: function (type, callback) { var listeners = this.__getEventListener(type); for (var i = 0; i < listeners.length; i ++) { if (callback === listeners[i]) { listeners.splice(i--, 1); } } return this; }, // 获取事件缓存 __getEventListener: function (type) { var listener = this.__listener; if (!listener) { listener = this.__listener = {}; } if (!listener[type]) { listener[type] = []; } return listener[type]; }, // 派发事件 __dispatchEvent: function (type) { var listeners = this.__getEventListener(type); if (this['on' + type]) { this['on' + type](); } for (var i = 0; i < listeners.length; i ++) { listeners[i].call(this); } }, // 对元素安全聚焦 __focus: function (elem) { // 防止 iframe 跨域无权限报错 // 防止 IE 不可见元素报错 try { // ie11 bug: iframe 页面点击会跳到顶部 if (this.autofocus && !/^iframe$/i.test(elem.nodeName)) { elem.focus(); } } catch (e) {} }, // 获取当前焦点的元素 __getActive: function () { try {// try: ie8~9, iframe #26 var activeElement = document.activeElement; var contentDocument = activeElement.contentDocument; var elem = contentDocument && contentDocument.activeElement || activeElement; return elem; } catch (e) {} }, // 居中浮层 __center: function () { var popup = this.__popup; var $window = $(window); var $document = $(document); var fixed = this.fixed; var dl = fixed ? 0 : $document.scrollLeft(); var dt = fixed ? 0 : $document.scrollTop(); var ww = $window.width(); var wh = $window.height(); var ow = popup.width(); var oh = popup.height(); var left = (ww - ow) / 2 + dl; var top = (wh - oh) * 382 / 1000 + dt;// 黄金比例 var style = popup[0].style; style.left = Math.max(parseInt(left), dl) + 'px'; style.top = Math.max(parseInt(top), dt) + 'px'; if(this.__browser.versions.ios){ style.top = '45%'; style.position = 'fixed'; style.marginTop = '-'+(popup.outerHeight(true)/2)+'px'; } }, __browser : { versions:function(){ var u = navigator.userAgent, app = navigator.appVersion; return { //移动终端浏览器版本信息 trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto') > -1, //opera内核 webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或uc浏览器 iPhone: u.indexOf('iPhone') > -1 , //是否为iPhone或者QQHD浏览器 iPad: u.indexOf('iPad') > -1, //是否iPad webApp: u.indexOf('Safari') == -1 //是否web应该程序,没有头部与底部 }; }(), language:(navigator.browserLanguage || navigator.language).toLowerCase() }, // 指定位置 @param {HTMLElement, Event} anchor __follow: function (anchor) { var $elem = anchor.parentNode && $(anchor); var popup = this.__popup; if (this.__followSkin) { popup.removeClass(this.__followSkin); } // 隐藏元素不可用 if ($elem) { var o = $elem.offset(); if (o.left * o.top < 0) { return this.__center(); } } var that = this; var fixed = this.fixed; var $window = $(window); var $document = $(document); var winWidth = $window.width(); var winHeight = $window.height(); var docLeft = $document.scrollLeft(); var docTop = $document.scrollTop(); var popupWidth = popup.width(); var popupHeight = popup.height(); var width = $elem ? $elem.outerWidth() : 0; var height = $elem ? $elem.outerHeight() : 0; var offset = this.__offset(anchor); var x = offset.left; var y = offset.top; var left = fixed ? x - docLeft : x; var top = fixed ? y - docTop : y; var minLeft = fixed ? 0 : docLeft; var minTop = fixed ? 0 : docTop; var maxLeft = minLeft + winWidth - popupWidth; var maxTop = minTop + winHeight - popupHeight; var css = {}; var align = this.align.split(' '); var className = this.className + '-'; var reverse = {top: 'bottom', bottom: 'top', left: 'right', right: 'left'}; var name = {top: 'top', bottom: 'top', left: 'left', right: 'left'}; var temp = [{ top: top - popupHeight, bottom: top + height, left: left - popupWidth, right: left + width }, { top: top, bottom: top - popupHeight + height, left: left, right: left - popupWidth + width }]; var center = { left: left + width / 2 - popupWidth / 2, top: top + height / 2 - popupHeight / 2 }; var range = { left: [minLeft, maxLeft], top: [minTop, maxTop] }; // 超出可视区域重新适应位置 $.each(align, function (i, val) { // 超出右或下边界:使用左或者上边对齐 if (temp[i][val] > range[name[val]][1]) { val = align[i] = reverse[val]; } // 超出左或右边界:使用右或者下边对齐 if (temp[i][val] < range[name[val]][0]) { align[i] = reverse[val]; } }); // 一个参数的情况 if (!align[1]) { name[align[1]] = name[align[0]] === 'left' ? 'top' : 'left'; temp[1][align[1]] = center[name[align[1]]]; } //添加follow的css, 为了给css使用 className += align.join('-') + ' '+ this.className+ '-follow'; that.__followSkin = className; if ($elem) { popup.addClass(className); } css[name[align[0]]] = parseInt(temp[0][align[0]]); css[name[align[1]]] = parseInt(temp[1][align[1]]); popup.css(css); }, // 获取元素相对于页面的位置(包括iframe内的元素) // 暂时不支持两层以上的 iframe 套嵌 __offset: function (anchor) { var isNode = anchor.parentNode; var offset = isNode ? $(anchor).offset() : { left: anchor.pageX, top: anchor.pageY }; anchor = isNode ? anchor : anchor.target; var ownerDocument = anchor.ownerDocument; var defaultView = ownerDocument.defaultView || ownerDocument.parentWindow; if (defaultView == window) {// IE <= 8 只能使用两个等于号 return offset; } // {Element: Ifarme} var frameElement = defaultView.frameElement; var $ownerDocument = $(ownerDocument); var docLeft = $ownerDocument.scrollLeft(); var docTop = $ownerDocument.scrollTop(); var frameOffset = $(frameElement).offset(); var frameLeft = frameOffset.left; var frameTop = frameOffset.top; return { left: offset.left + frameLeft - docLeft, top: offset.top + frameTop - docTop }; } }); /** 当前叠加高度 */ Popup.zIndex = 1024; /** 顶层浮层的实例 */ Popup.current = null; return Popup; }); // artDialog - 默认配置 define("dialog-config", { /* -----已注释的配置继承自 popup.js,仍可以再这里重新定义它----- */ // 对齐方式 //align: 'bottom left', // 是否固定定位 fixed: true, // 对话框叠加高度值(重要:此值不能超过浏览器最大限制) zIndex: 3000, // 设置遮罩背景颜色 backdropBackground: '#000', // 设置遮罩透明度 backdropOpacity: 0.7, // 消息内容 content: '', // 消息内容类型 contentType: '', // load, jsonload // 自动关闭时间 closeTime: 3000, // 标题 title: '', // 对话框状态栏区域 HTML 代码 statusbar: '', // 自定义按钮 button: null, // 确定按钮回调函数 ok: null, // 取消按钮回调函数 cancel: null, // 确定按钮文本 okValue: '\u786e\u5b9a', // 取消按钮文本 cancelValue: '\u53d6\u6d88', cancelDisplay: true, // 内容宽度 width: '', // 内容高度 height: '', // 内容与边界填充距离 padding: '', // 标题填充距离 titlePadding:'', // 内容为块级元素 contentBlock:false, // 对话框自定义 className skin: 'ax-popup', // 对话框最外层自定义 className boxSkin: 'ui-popup-full fat-title', // 是否支持快捷关闭(点击遮罩层自动关闭) quickClose: false, // css 文件路径,留空则不会使用 js 自动加载样式 // 注意:css 只允许加载一个 cssUri: '', // 模板(使用 table 解决 IE7 宽度自适应的 BUG) // js 使用 i="***" 属性识别结构,其余的均可自定义 innerHTML: '' + '' + '' + ' | ' + '
' + '' + ' | ' + '
' + '' + '' + ' | ' + '
\u52a0\u8f7d\u4e2d\uff0c\u8bf7\u7a0d\u5019...
'; }else{ html=''+this.options.content+'
'; } break; case 'jsonload': if(this.options.content==''){ html='\u6570\u636e\u8f7d\u5165\u4e2d\uff0c\u8bf7\u7a0d\u5019...
'; }else{ html=''+this.options.content+'
'; } break; case 'tipsbox': var th=this; setTimeout(function () { artDialog.list[th.id].close().remove(); }, this.options.closeTime); break; } } $content.html(html); } return this.reset(); }, /** * 设置标题 * @param {String} 标题内容 */ title: function (text) { this._$('title').html(text); this._$('header')[text ? 'show' : 'hide'](); return this; }, /** 设置宽度 */ width: function (value) { this._$('content').css('width', value); return this.reset(); }, /** 设置高度 */ height: function (value) { this._$('content').css('height', value); return this.reset(); }, /** * 设置按钮组 * @param {Array, String} * Options: value, callback, autofocus, disabled */ button: function (args) { args = args || []; var that = this; var html = ''; var number = 0; this.callbacks = {}; if (typeof args === 'string') { html = args; number ++; } else { $.each(args, function (i, val) { var id = val.id = val.id || val.value; var style = ''; that.callbacks[id] = val.callback; if (val.display === false) { style = ' style="display:none"'; } else { number ++; } html += ''; that._$('button') .on('click', '[i-id=' + id +']', function (event) { var $this = $(this); if (!$this.attr('disabled')) {// IE BUG that._trigger(id); } event.preventDefault(); }); }); } this._$('button').html(html); this._$('footer')[number ? 'show' : 'hide'](); return this; }, statusbar: function (html) { this._$('statusbar') .html(html)[html ? 'show' : 'hide'](); return this; }, _$: function (i) { return this._popup.find('[i=' + i + ']'); }, // 触发按钮回调函数 _trigger: function (id) { var fn = this.callbacks[id]; return typeof fn !== 'function' || fn.call(this) !== false ? this.close().remove() : this; } }); artDialog.oncreate = $.noop; /** 获取最顶层的对话框API */ artDialog.getCurrent = function () { return Popup.current; }; /** * 根据 ID 获取某对话框 API * @param {String} 对话框 ID * @return {Object} 对话框 API (实例) */ artDialog.get = function (id) { return id === undefined ? artDialog.list : artDialog.list[id]; }; artDialog.list = {}; /** * 默认配置 */ artDialog.defaults = defaults; return artDialog; }); /*! * drag.js * Date: 2013-12-06 * https://github.com/aui/artDialog * (c) 2009-2014 TangBin, http://www.planeArt.cn * * This is licensed under the GNU LGPL, version 2.1 or later. * For details, see: http://www.gnu.org/licenses/lgpl-2.1.html */ define("drag", function (require) { var $ = require("jquery"); var $window = $(window); var $document = $(document); var isTouch = 'createTouch' in document; var html = document.documentElement; var isIE6 = !('minWidth' in html.style); var isLosecapture = !isIE6 && 'onlosecapture' in html; var isSetCapture = 'setCapture' in html; var types = { start: isTouch ? 'touchstart' : 'mousedown', over: isTouch ? 'touchmove' : 'mousemove', end: isTouch ? 'touchend' : 'mouseup' }; var getEvent = isTouch ? function (event) { if (!event.touches) { event = event.originalEvent.touches.item(0); } return event; } : function (event) { return event; }; var DragEvent = function () { this.start = $.proxy(this.start, this); this.over = $.proxy(this.over, this); this.end = $.proxy(this.end, this); this.onstart = this.onover = this.onend = $.noop; }; DragEvent.types = types; DragEvent.prototype = { start: function (event) { event = this.startFix(event); $document .on(types.over, this.over) .on(types.end, this.end); this.onstart(event); return false; }, over: function (event) { event = this.overFix(event); this.onover(event); return false; }, end: function (event) { event = this.endFix(event); $document .off(types.over, this.over) .off(types.end, this.end); this.onend(event); return false; }, startFix: function (event) { event = getEvent(event); this.target = $(event.target); this.selectstart = function () { return false; }; $document .on('selectstart', this.selectstart) .on('dblclick', this.end); if (isLosecapture) { this.target.on('losecapture', this.end); } else { $window.on('blur', this.end); } if (isSetCapture) { this.target[0].setCapture(); } return event; }, overFix: function (event) { event = getEvent(event); return event; }, endFix: function (event) { event = getEvent(event); $document .off('selectstart', this.selectstart) .off('dblclick', this.end); if (isLosecapture) { this.target.off('losecapture', this.end); } else { $window.off('blur', this.end); } if (isSetCapture) { this.target[0].releaseCapture(); } return event; } }; /** * 启动拖拽 * @param {HTMLElement} 被拖拽的元素 * @param {Event} 触发拖拽的事件对象。可选,若无则监听 elem 的按下事件启动 */ DragEvent.create = function (elem, event) { var $elem = $(elem); var dragEvent = new DragEvent(); var startType = DragEvent.types.start; var noop = function () {}; var className = elem.className .replace(/^\s|\s.*/g, '') + '-drag-start'; var minX; var minY; var maxX; var maxY; var api = { onstart: noop, onover: noop, onend: noop, off: function () { $elem.off(startType, dragEvent.start); } }; dragEvent.onstart = function (event) { var isFixed = $elem.css('position') === 'fixed'; var dl = $document.scrollLeft(); var dt = $document.scrollTop(); var w = $elem.width(); var h = $elem.height(); minX = 0; minY = 0; maxX = isFixed ? $window.width() - w + minX : $document.width() - w; maxY = isFixed ? $window.height() - h + minY : $document.height() - h; var offset = $elem.offset(); var left = this.startLeft = isFixed ? offset.left - dl : offset.left; var top = this.startTop = isFixed ? offset.top - dt : offset.top; this.clientX = event.clientX; this.clientY = event.clientY; $elem.addClass(className); api.onstart.call(elem, event, left, top); }; dragEvent.onover = function (event) { var left = event.clientX - this.clientX + this.startLeft; var top = event.clientY - this.clientY + this.startTop; var style = $elem[0].style; left = Math.max(minX, Math.min(maxX, left)); top = Math.max(minY, Math.min(maxY, top)); style.left = left + 'px'; style.top = top + 'px'; api.onover.call(elem, event, left, top); }; dragEvent.onend = function (event) { var position = $elem.position(); var left = position.left; var top = position.top; $elem.removeClass(className); api.onend.call(elem, event, left, top); }; dragEvent.off = function () { $elem.off(startType, dragEvent.start); }; if (event) { dragEvent.start(event); } else { $elem.on(startType, dragEvent.start); } return api; }; return DragEvent; }); /*! * artDialog-plus * Date: 2013-11-09 * https://github.com/aui/artDialog * (c) 2009-2014 TangBin, http://www.planeArt.cn * * This is licensed under the GNU LGPL, version 2.1 or later. * For details, see: http://www.gnu.org/licenses/lgpl-2.1.html */ define("dialog-plus", function (require) { var $ = require("jquery"); var dialog = require("dialog"); var drag = require("drag"); dialog.oncreate = function (api) { var options = api.options; var originalOptions = options.original; // 页面地址 var url = options.url; // 页面加载完毕的事件 var oniframeload = options.oniframeload; var $iframe; if (url) { this.padding = options.padding = 0; $iframe = $(''); $iframe.attr({ src: url, name: api.id, width: '100%', height: '100%', allowtransparency: 'yes', frameborder: 'no', scrolling: 'no' }) .on('load', function () { var test; try { // 跨域测试 test = $iframe[0].contentWindow.frameElement; } catch (e) {} if (test) { if (!options.width) { api.width($iframe.contents().width()); } if (!options.height) { api.height($iframe.contents().height()); } } if (oniframeload) { oniframeload.call(api); } }); api.addEventListener('beforeremove', function () { // 重要!需要重置iframe地址,否则下次出现的对话框在IE6、7无法聚焦input // IE删除iframe后,iframe仍然会留在内存中出现上述问题,置换src是最容易解决的方法 $iframe.attr('src', 'about:blank').remove(); }, false); api.content($iframe[0]); api.iframeNode = $iframe[0]; } // 对于子页面呼出的对话框特殊处理 // 如果对话框配置来自 iframe if (!(originalOptions instanceof Object)) { var un = function () { api.close().remove(); }; // 找到那个 iframe for (var i = 0; i < frames.length; i ++) { try { if (originalOptions instanceof frames[i].Object) { // 让 iframe 刷新的时候也关闭对话框, // 防止要执行的对象被强制收回导致 IE 报错:“不能执行已释放 Script 的代码” $(frames[i]).one('unload', un); break; } } catch (e) {} } } // 拖拽支持 $(api.node).on(drag.types.start, '[i=title]', function (event) { // 排除气泡类型的对话框 if (!api.follow) { api.focus(); drag.create(api.node, event); } }); }; dialog.get = function (id) { // 从 iframe 传入 window 对象 if (id && id.frameElement) { var iframe = id.frameElement; var list = dialog.list; var api; for (var i in list) { api = list[i]; if (api.node.getElementsByTagName('iframe')[0] === iframe) { return api; } } // 直接传入 id 的情况 } else if (id) { return dialog.list[id]; } }; return dialog; }); window.dialog = require("dialog-plus"); })();