/*! * layer - 通用 Web 弹出层组件 * MIT Licensed */ ;!function(window, undefined){ "use strict"; var isLayui = window.layui && layui.define, $, win, ready = { getPath: function(){ var jsPath = document.currentScript ? document.currentScript.src : function(){ var js = document.scripts ,last = js.length - 1 ,src; for(var i = last; i > 0; i--){ if(js[i].readyState === 'interactive'){ src = js[i].src; break; } } return src || js[last].src; }() ,GLOBAL = window.LAYUI_GLOBAL || {}; return GLOBAL.layer_dir || jsPath.substring(0, jsPath.lastIndexOf('/') + 1); }(), config: {}, end: {}, minIndex: 0, minLeft: [], btn: ['确定', '取消'], //五种原始层模式 type: ['dialog', 'page', 'iframe', 'loading', 'tips'], //获取节点的style属性值 getStyle: function(node, name){ var style = node.currentStyle ? node.currentStyle : window.getComputedStyle(node, null); return style[style.getPropertyValue ? 'getPropertyValue' : 'getAttribute'](name); }, //载入 CSS 依赖 link: function(href, fn, cssname){ //未设置路径,则不主动加载css if(!layer.path) return; var head = document.getElementsByTagName("head")[0] ,link = document.createElement('link'); if(typeof fn === 'string') cssname = fn; var app = (cssname || href).replace(/\.|\//g, ''); var id = 'layuicss-'+ app ,STAUTS_NAME = 'creating' ,timeout = 0; link.rel = 'stylesheet'; link.href = layer.path + href; link.id = id; if(!document.getElementById(id)){ head.appendChild(link); } if(typeof fn !== 'function') return; //轮询 css 是否加载完毕 (function poll(status) { var delay = 100 ,getLinkElem = document.getElementById(id); //获取动态插入的 link 元素 //如果轮询超过指定秒数,则视为请求文件失败或 css 文件不符合规范 if(++timeout > 10 * 1000 / delay){ return window.console && console.error(app +'.css: Invalid'); }; //css 加载就绪 if(parseInt(ready.getStyle(getLinkElem, 'width')) === 1989){ //如果参数来自于初始轮询(即未加载就绪时的),则移除 link 标签状态 if(status === STAUTS_NAME) getLinkElem.removeAttribute('lay-status'); //如果 link 标签的状态仍为「创建中」,则继续进入轮询,直到状态改变,则执行回调 getLinkElem.getAttribute('lay-status') === STAUTS_NAME ? setTimeout(poll, delay) : fn(); } else { getLinkElem.setAttribute('lay-status', STAUTS_NAME); setTimeout(function(){ poll(STAUTS_NAME); }, delay); } //parseInt(ready.getStyle(document.getElementById(id), 'width')) === 1989 ? fn() : setTimeout(poll, 1000); }()); } }; //默认内置方法。 var layer = { v: '3.5.2', ie: function(){ //ie版本 var agent = navigator.userAgent.toLowerCase(); return (!!window.ActiveXObject || "ActiveXObject" in window) ? ( (agent.match(/msie\s(\d+)/) || [])[1] || '11' //由于ie11并没有msie的标识 ) : false; }(), index: (window.layer && window.layer.v) ? 100000 : 0, path: ready.getPath, config: function(options, fn){ options = options || {}; cache = layer.cache = ready.config = $.extend({}, ready.config, options); layer.path = ready.config.path || layer.path; typeof options.extend === 'string' && (options.extend = [options.extend]); //如果设置了路径,则加载样式 if(ready.config.path) layer.ready(); if(!options.extend) return this; isLayui ? layui.addcss('modules/layer/' + options.extend) : ready.link('theme/' + options.extend); return this; }, //主体CSS等待事件 ready: function(callback){ var cssname = 'layer', ver = '' ,path = (isLayui ? 'modules/layer/' : 'theme/') + 'default/layer.css?v='+ layer.v + ver; isLayui ? layui.addcss(path, callback, cssname) : ready.link(path, callback, cssname); return this; }, //各种快捷引用 alert: function(content, options, yes){ var type = typeof options === 'function'; if(type) yes = options; return layer.open($.extend({ content: content, yes: yes }, type ? {} : options)); }, confirm: function(content, options, yes, cancel){ var type = typeof options === 'function'; if(type){ cancel = yes; yes = options; } return layer.open($.extend({ content: content, btn: ready.btn, yes: yes, btn2: cancel }, type ? {} : options)); }, msg: function(content, options, end){ //最常用提示层 var type = typeof options === 'function', rskin = ready.config.skin; var skin = (rskin ? rskin + ' ' + rskin + '-msg' : '')||'layui-layer-msg'; var anim = doms.anim.length - 1; if(type) end = options; return layer.open($.extend({ content: content, time: 3000, shade: false, skin: skin, title: false, closeBtn: false, btn: false, resize: false, end: end }, (type && !ready.config.skin) ? { skin: skin + ' layui-layer-hui', anim: anim } : function(){ options = options || {}; if(options.icon === -1 || options.icon === undefined){ options.skin = skin + ' ' + (options.skin||'layui-layer-hui'); } return options; }())); }, load: function(icon, options){ return layer.open($.extend({ type: 3, icon: icon || 0, resize: false, shade: 0.01 }, options)); }, tips: function(content, follow, options){ return layer.open($.extend({ type: 4, content: [content, follow], closeBtn: false, time: 3000, shade: false, resize: false, fixed: false, maxWidth: 260 }, options)); } }; var Class = function(setings){ var that = this, creat = function(){ that.creat(); }; that.index = ++layer.index; // that.config.maxWidth = $(win).width() - 15*2; //初始最大宽度:当前屏幕宽,左右留 15px 边距 that.config = $.extend({}, that.config, ready.config, setings); document.body ? creat() : setTimeout(function(){ creat(); }, 30); }; Class.pt = Class.prototype; //缓存常用字符 var doms = ['layui-layer', '.layui-layer-title', '.layui-layer-main', '.layui-layer-dialog', 'layui-layer-iframe', 'layui-layer-content', 'layui-layer-btn', 'layui-layer-close']; doms.anim = ['layer-anim-00', 'layer-anim-01', 'layer-anim-02', 'layer-anim-03', 'layer-anim-04', 'layer-anim-05', 'layer-anim-06']; doms.SHADE = 'layui-layer-shade'; doms.MOVE = 'layui-layer-move'; //默认配置 Class.pt.config = { type: 0, shade: 0.3, fixed: true, move: doms[1], title: '信息', offset: 'auto', area: 'auto', closeBtn: 1, time: 0, //0表示不自动关闭 zIndex: 19891014, maxWidth: 360, anim: 0, isOutAnim: true, //退出动画 minStack: true, //最小化堆叠 focusBtn: 0, icon: -1, moveType: 1, resize: true, scrollbar: true, //是否允许浏览器滚动条 tips: 2 }; //容器 Class.pt.vessel = function(conType, callback){ var that = this, times = that.index, config = that.config; var zIndex = config.zIndex + times, titype = typeof config.title === 'object'; var ismax = config.maxmin && (config.type === 1 || config.type === 2); var titleHTML = (config.title ? '
' + (titype ? config.title[0] : config.title) + '
' : ''); config.zIndex = zIndex; callback([ //遮罩 config.shade ? ('
') : '', //主体 '
' + (conType && config.type != 2 ? '' : titleHTML) + '
' + (config.type == 0 && config.icon !== -1 ? '' : '') + (config.type == 1 && conType ? '' : (config.content||'')) + '
' + ''+ function(){ var closebtn = ismax ? '' : ''; config.closeBtn && (closebtn += ''); return closebtn; }() + '' + (config.btn ? function(){ var button = ''; typeof config.btn === 'string' && (config.btn = [config.btn]); for(var i = 0, len = config.btn.length; i < len; i++){ button += ''+ config.btn[i] +'' } return '
'+ button +'
' }() : '') + (config.resize ? '' : '') + '
' ], titleHTML, $('
')); return that; }; //创建骨架 Class.pt.creat = function(){ var that = this ,config = that.config ,times = that.index, nodeIndex ,content = config.content ,conType = typeof content === 'object' ,body = $('body'); if(config.id && $('#'+config.id)[0]) return; if(typeof config.area === 'string'){ config.area = config.area === 'auto' ? ['', ''] : [config.area, '']; } //anim兼容旧版shift if(config.shift){ config.anim = config.shift; } if(layer.ie == 6){ config.fixed = false; } switch(config.type){ case 0: config.btn = ('btn' in config) ? config.btn : ready.btn[0]; layer.closeAll('dialog'); break; case 2: var content = config.content = conType ? config.content : [config.content||'', 'auto']; config.content = ''; break; case 3: delete config.title; delete config.closeBtn; config.icon === -1 && (config.icon === 0); layer.closeAll('loading'); break; case 4: conType || (config.content = [config.content, 'body']); config.follow = config.content[1]; config.content = config.content[0] + ''; delete config.title; config.tips = typeof config.tips === 'object' ? config.tips : [config.tips, true]; config.tipsMore || layer.closeAll('tips'); break; } //建立容器 that.vessel(conType, function(html, titleHTML, moveElem){ body.append(html[0]); conType ? function(){ (config.type == 2 || config.type == 4) ? function(){ $('body').append(html[1]); }() : function(){ if(!content.parents('.'+doms[0])[0]){ content.data('display', content.css('display')).show().addClass('layui-layer-wrap').wrap(html[1]); $('#'+ doms[0] + times).find('.'+doms[5]).before(titleHTML); } }(); }() : body.append(html[1]); $('#'+ doms.MOVE)[0] || body.append(ready.moveElem = moveElem); that.layero = $('#'+ doms[0] + times); that.shadeo = $('#'+ doms.SHADE + times); config.scrollbar || doms.html.css('overflow', 'hidden').attr('layer-full', times); }).auto(times); //遮罩 that.shadeo.css({ 'background-color': config.shade[1] || '#000' ,'opacity': config.shade[0] || config.shade }); config.type == 2 && layer.ie == 6 && that.layero.find('iframe').attr('src', content[0]); //坐标自适应浏览器窗口尺寸 config.type == 4 ? that.tips() : function(){ that.offset() //首次弹出时,若 css 尚未加载,则等待 css 加载完毕后,重新设定尺寸 parseInt(ready.getStyle(document.getElementById(doms.MOVE), 'z-index')) || function(){ that.layero.css('visibility', 'hidden'); layer.ready(function(){ that.offset(); that.layero.css('visibility', 'visible'); }); }(); }(); //如果是固定定位 if(config.fixed){ win.on('resize', function(){ that.offset(); (/^\d+%$/.test(config.area[0]) || /^\d+%$/.test(config.area[1])) && that.auto(times); config.type == 4 && that.tips(); }); } config.time <= 0 || setTimeout(function(){ layer.close(that.index); }, config.time); that.move().callback(); //为兼容jQuery3.0的css动画影响元素尺寸计算 if(doms.anim[config.anim]){ var animClass = 'layer-anim '+ doms.anim[config.anim]; that.layero.addClass(animClass).one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){ $(this).removeClass(animClass); }); }; //记录关闭动画 if(config.isOutAnim){ that.layero.data('isOutAnim', true); } }; //自适应 Class.pt.auto = function(index){ var that = this, config = that.config, layero = $('#'+ doms[0] + index); if(config.area[0] === '' && config.maxWidth > 0){ //为了修复IE7下一个让人难以理解的bug if(layer.ie && layer.ie < 8 && config.btn){ layero.width(layero.innerWidth()); } layero.outerWidth() > config.maxWidth && layero.width(config.maxWidth); } var area = [layero.innerWidth(), layero.innerHeight()] ,titHeight = layero.find(doms[1]).outerHeight() || 0 ,btnHeight = layero.find('.'+doms[6]).outerHeight() || 0 ,setHeight = function(elem){ elem = layero.find(elem); elem.height(area[1] - titHeight - btnHeight - 2*(parseFloat(elem.css('padding-top'))|0)); }; switch(config.type){ case 2: setHeight('iframe'); break; default: if(config.area[1] === ''){ if(config.maxHeight > 0 && layero.outerHeight() > config.maxHeight){ area[1] = config.maxHeight; setHeight('.'+doms[5]); } else if(config.fixed && area[1] >= win.height()){ area[1] = win.height(); setHeight('.'+doms[5]); } } else { setHeight('.'+doms[5]); } break; }; return that; }; //计算坐标 Class.pt.offset = function(){ var that = this, config = that.config, layero = that.layero; var area = [layero.outerWidth(), layero.outerHeight()]; var type = typeof config.offset === 'object'; that.offsetTop = (win.height() - area[1])/2; that.offsetLeft = (win.width() - area[0])/2; if(type){ that.offsetTop = config.offset[0]; that.offsetLeft = config.offset[1]||that.offsetLeft; } else if(config.offset !== 'auto'){ if(config.offset === 't'){ //上 that.offsetTop = 0; } else if(config.offset === 'r'){ //右 that.offsetLeft = win.width() - area[0]; } else if(config.offset === 'b'){ //下 that.offsetTop = win.height() - area[1]; } else if(config.offset === 'l'){ //左 that.offsetLeft = 0; } else if(config.offset === 'lt'){ //左上角 that.offsetTop = 0; that.offsetLeft = 0; } else if(config.offset === 'lb'){ //左下角 that.offsetTop = win.height() - area[1]; that.offsetLeft = 0; } else if(config.offset === 'rt'){ //右上角 that.offsetTop = 0; that.offsetLeft = win.width() - area[0]; } else if(config.offset === 'rb'){ //右下角 that.offsetTop = win.height() - area[1]; that.offsetLeft = win.width() - area[0]; } else { that.offsetTop = config.offset; } } if(!config.fixed){ that.offsetTop = /%$/.test(that.offsetTop) ? win.height()*parseFloat(that.offsetTop)/100 : parseFloat(that.offsetTop); that.offsetLeft = /%$/.test(that.offsetLeft) ? win.width()*parseFloat(that.offsetLeft)/100 : parseFloat(that.offsetLeft); that.offsetTop += win.scrollTop(); that.offsetLeft += win.scrollLeft(); } if(layero.attr('minLeft')){ that.offsetTop = win.height() - (layero.find(doms[1]).outerHeight() || 0); that.offsetLeft = layero.css('left'); } layero.css({top: that.offsetTop, left: that.offsetLeft}); }; //Tips Class.pt.tips = function(){ var that = this, config = that.config, layero = that.layero; var layArea = [layero.outerWidth(), layero.outerHeight()], follow = $(config.follow); if(!follow[0]) follow = $('body'); var goal = { width: follow.outerWidth(), height: follow.outerHeight(), top: follow.offset().top, left: follow.offset().left }, tipsG = layero.find('.layui-layer-TipsG'); var guide = config.tips[0]; config.tips[1] || tipsG.remove(); goal.autoLeft = function(){ if(goal.left + layArea[0] - win.width() > 0){ goal.tipLeft = goal.left + goal.width - layArea[0]; tipsG.css({right: 12, left: 'auto'}); } else { goal.tipLeft = goal.left; }; }; //辨别tips的方位 goal.where = [function(){ //上 goal.autoLeft(); goal.tipTop = goal.top - layArea[1] - 10; tipsG.removeClass('layui-layer-TipsB').addClass('layui-layer-TipsT').css('border-right-color', config.tips[1]); }, function(){ //右 goal.tipLeft = goal.left + goal.width + 10; goal.tipTop = goal.top; tipsG.removeClass('layui-layer-TipsL').addClass('layui-layer-TipsR').css('border-bottom-color', config.tips[1]); }, function(){ //下 goal.autoLeft(); goal.tipTop = goal.top + goal.height + 10; tipsG.removeClass('layui-layer-TipsT').addClass('layui-layer-TipsB').css('border-right-color', config.tips[1]); }, function(){ //左 goal.tipLeft = goal.left - layArea[0] - 10; goal.tipTop = goal.top; tipsG.removeClass('layui-layer-TipsR').addClass('layui-layer-TipsL').css('border-bottom-color', config.tips[1]); }]; goal.where[guide-1](); /* 8*2为小三角形占据的空间 */ if(guide === 1){ goal.top - (win.scrollTop() + layArea[1] + 8*2) < 0 && goal.where[2](); } else if(guide === 2){ win.width() - (goal.left + goal.width + layArea[0] + 8*2) > 0 || goal.where[3]() } else if(guide === 3){ (goal.top - win.scrollTop() + goal.height + layArea[1] + 8*2) - win.height() > 0 && goal.where[0](); } else if(guide === 4){ layArea[0] + 8*2 - goal.left > 0 && goal.where[1]() } layero.find('.'+doms[5]).css({ 'background-color': config.tips[1], 'padding-right': (config.closeBtn ? '30px' : '') }); layero.css({ left: goal.tipLeft - (config.fixed ? win.scrollLeft() : 0), top: goal.tipTop - (config.fixed ? win.scrollTop() : 0) }); } //拖拽层 Class.pt.move = function(){ var that = this ,config = that.config ,_DOC = $(document) ,layero = that.layero ,moveElem = layero.find(config.move) ,resizeElem = layero.find('.layui-layer-resize') ,dict = {}; if(config.move){ moveElem.css('cursor', 'move'); } moveElem.on('mousedown', function(e){ e.preventDefault(); if(config.move){ dict.moveStart = true; dict.offset = [ e.clientX - parseFloat(layero.css('left')) ,e.clientY - parseFloat(layero.css('top')) ]; ready.moveElem.css('cursor', 'move').show(); } }); resizeElem.on('mousedown', function(e){ e.preventDefault(); dict.resizeStart = true; dict.offset = [e.clientX, e.clientY]; dict.area = [ layero.outerWidth() ,layero.outerHeight() ]; ready.moveElem.css('cursor', 'se-resize').show(); }); _DOC.on('mousemove', function(e){ //拖拽移动 if(dict.moveStart){ var X = e.clientX - dict.offset[0] ,Y = e.clientY - dict.offset[1] ,fixed = layero.css('position') === 'fixed'; e.preventDefault(); dict.stX = fixed ? 0 : win.scrollLeft(); dict.stY = fixed ? 0 : win.scrollTop(); //控制元素不被拖出窗口外 if(!config.moveOut){ var setRig = win.width() - layero.outerWidth() + dict.stX ,setBot = win.height() - layero.outerHeight() + dict.stY; X < dict.stX && (X = dict.stX); X > setRig && (X = setRig); Y < dict.stY && (Y = dict.stY); Y > setBot && (Y = setBot); } layero.css({ left: X ,top: Y }); } //Resize if(config.resize && dict.resizeStart){ var X = e.clientX - dict.offset[0] ,Y = e.clientY - dict.offset[1]; e.preventDefault(); layer.style(that.index, { width: dict.area[0] + X ,height: dict.area[1] + Y }) dict.isResize = true; config.resizing && config.resizing(layero); } }).on('mouseup', function(e){ if(dict.moveStart){ delete dict.moveStart; ready.moveElem.hide(); config.moveEnd && config.moveEnd(layero); } if(dict.resizeStart){ delete dict.resizeStart; ready.moveElem.hide(); } }); return that; }; Class.pt.callback = function(){ var that = this, layero = that.layero, config = that.config; that.openLayer(); if(config.success){ if(config.type == 2){ layero.find('iframe').on('load', function(){ config.success(layero, that.index); }); } else { config.success(layero, that.index); } } layer.ie == 6 && that.IE6(layero); //按钮 layero.find('.'+ doms[6]).children('a').on('click', function(){ var index = $(this).index(); if(index === 0){ if(config.yes){ config.yes(that.index, layero) } else if(config['btn1']){ config['btn1'](that.index, layero) } else { layer.close(that.index); } } else { var close = config['btn'+(index+1)] && config['btn'+(index+1)](that.index, layero); close === false || layer.close(that.index); } }); //按钮焦点 if (typeof config.focusBtn === 'number') { layero.find('.' + doms[6]).children('a').each(function () { var currentBtn = $(this); var confirmBtn = $("