/* * jQuery layerModel V1.0.0 * Dual licensed under the MIT and GPL licenses. * * Copyright (c) 2014 (http://zk.citier.net/layerModel.html) * * Autor: zhoukun * webSite: http://zk.citier.net/layerModel.html * Date: 星期日 2014-03-30 * Version: 1.0.0 ********************************************************************** * @example $("#example").layerModel(); 使用layerModel可以轻松的弹出各种层 ********************************************************************** * layerModel参数可配置项: **************************************************************************** * 配置项 * 类型 * 默认值 * 描述 **************************************************************************** * * center Boolean true 弹出层是否始终居中 (浏览器大小改变居中/拖动滚动条居中) * drag Boolean true 拖拽效果 true:启用拖拽效果。false:禁用拖拽效果。 * locked Boolean true 是否开启遮罩层 true:开启遮罩。false:禁用遮罩。 * zIndex number 9999 弹出层的层级大小 * opacity number 0.5 背景遮罩透明度 0:为完全透明 1:未完全不透明 * title string 系统提示 弹出层的标题 * timer Number 0 定时关闭的时间,大于0才会有效 * bgColor string #fffaf6 背景遮罩的颜色 (可采用#666,#999,#e5dfda ,#e5e5e5,#ff8800) * width/height Number 0/0 设置弹出层的宽度和高度,单位为px,传参时无需带单位,建议少用,一般在样式中指定width最好。 * close Function null 设置关闭弹出层后执行的回调函数,只有返回false才不会关闭。 * left/top Number 350/100 设置弹出层的位置,单位为px,传参时无需带单位,要想让其生效,必须设置fixed:false和center:false。如{"fixed":false,"center":false,"left":200,"top":100} * head Boolean true 是否显示头部title * isClose Boolean true 是否出现关闭按钮 * shake Boolean false 是否出现抖动效果 * staySame Boolean false 是否保持弹出元素原样,也就是没有插件自己装饰的头部和边框,元素本来啥样就弹出啥样。 * init function null 初始化弹出层完成后的回调函数! * blurClose Boolean false 是否点击弹出层外部空间可将其关闭。 * **********************************************************************/ ; (function($) { "use strict"; var methods = { o: { isIe: !-[1, ] || document.documentMode >= 9, //后面的是判断IE9、IE10的 ie6: !-[1, ] && !window.XMLHttpRequest, ie9_10: document.documentMode >= 9, bgLayer: "layerModel_mask", dataId: "layerModel_main", wrapper: "layerModel_wrapper", warpperContent: "layerModel_content", warpperTitle: "layerModel_title", warpperCloseBtn: "layerModel_closeBtn", warpperOwnContent: "layerModel_ownContent", replaceClose: "replaceClose", dragableClass: "dragable", defaultWidth: 300 }, generateId: function() { return "_" + new Date().getTime(); }, init: function(data, options) { var defaults = { center: true,locked: true,fixed: true,drag: true,zIndex: 9999,opacity: "0.5",title: "系统提示",staySame: false,isLoading : false,width: 0,height: 0,timer: 0,bgColor: "#e5dfda",left: 350,top: 100,head: true,isClose: true,shake: false,blurClose: false,close: null,init: null }; var settings = $.extend({},defaults, options); //将一个空对象做为第一个参数 var s = this; var generateId = s.generateId(); if (typeof data === 'object') { data = data instanceof $ ? data: $(data); if(settings.isLoading) { data = s.createRender(data, settings, generateId).hide(); } else { data = settings.staySame ? s.createRender(data, settings, generateId).hide() : s.createContainer(data, settings, generateId).hide(); } } else if (typeof data === 'string' || typeof data === 'number') { data = $("
").html(data).appendTo(document.body).hide(); } else { alert("Layer Error : Unsupport data type :" + typeof data); return; } if (settings.locked && !s.hasBgLayer()) { var mask = $("
").appendTo(document.body).css({"background": settings.bgColor,"opacity": settings.opacity}); if (s.o.ie6) { mask.html(''); } } data.css({ "position": settings.fixed ? s.o.ie6 ? "absolute": "fixed": "absolute","z-index": settings.zIndex,"left": settings.left,"top": settings.top }).show(); if (settings.center) { s.fixLayer(data); $(window).bind("resize scroll", function() { s.fixLayer(data); }); } if (settings.drag) { s.dragLayer(data, settings); } if (settings.shake) { s.shakeLayer(data); } if (settings.init && typeof settings.init === "function") { settings.init(); } if (settings.timer > 0) { setTimeout(function() { $("#" + s.o.replaceClose + generateId).trigger("click"); }, parseInt(settings.timer, 10) || 3000); } // 点击弹出层外部自动关闭弹出层,默认不关闭 if (settings.blurClose) { $("#" + s.o.bgLayer).click(function(e) { s.close($("#" + s.o.wrapper + generateId), settings, generateId); e.stopPropagation(); }); } return data; }, createContainer: function(data, settings, generateId) { var s = this; //如果context未定义,则是通过html拼接的方式追加的否则就是原本就存在的,关闭后需要返回原地方 var isHtmlSlice = data.context == undefined ? true: false; var wrapperHtml = new Array(); wrapperHtml.push("
"); wrapperHtml.push("
"); wrapperHtml.push(""); if (settings.head) { wrapperHtml.push("

"); if (settings.isClose) { wrapperHtml.push("×"); } wrapperHtml.push(settings.title + "

"); } wrapperHtml.push("
"); s.container = $(wrapperHtml.join("")); s.container.appendTo(document.body); data.clone(true).appendTo("#" + s.o.warpperOwnContent + generateId).show().attr('id', data.attr('id') || s.o.dataId + generateId); //div默认宽度为100%,所以建议将所有弹出的元素设置宽度,否则弹出层宽度为100% var w = $("#" + data.attr('id')).width() || $("#" + s.o.dataId + generateId).width() || s.o.defaultWidth; //指定了高度 var tempWidth = w; if (settings.height > 0) { if (settings.width > 0) { tempWidth = settings.width; if (settings.width <= w) { $("#" + s.o.warpperOwnContent + generateId).css({"width": settings.width,"overflow-x": "auto"}); } else { //如果指定的宽度大于元素本身的宽度,那么需要将元素居中 //让元素始终居中显示 var xPadding = (settings.width - w) / 2 + 8; $("#" + s.o.warpperOwnContent + generateId).css({"padding": "4px " + xPadding + "px"}); } } s.container.width(tempWidth + 32); $("#" + s.o.warpperContent + generateId).width(tempWidth + 30); $("#" + s.o.warpperOwnContent + generateId).css({"height": settings.height,"overflow-y": "auto"}); } else { if (settings.width > 0) { tempWidth = settings.width; if (settings.width <= w) { $("#" + s.o.warpperOwnContent + generateId).css({"width": settings.width,"overflow-x": "auto"}); } } s.container.width(tempWidth + 22); $("#" + s.o.warpperContent + generateId).width(tempWidth + 20); } $("#" + s.o.warpperCloseBtn + generateId).click(function(e) { $("#" + s.o.replaceClose + generateId).trigger("click"); }); $("#" + s.o.replaceClose + generateId).click(function(e) { s.close($("#" + s.o.wrapper + generateId), settings, generateId); e.stopPropagation(); }); if (!isHtmlSlice) { s.elemBack(data, generateId); } data.detach(); return s.container; }, createRender: function(data, settings, generateId) { var s = this; //如果context未定义,则是通过html拼接的方式追加的否则就是原本就存在的,关闭后需要返回原地方 var style = "border:none;"; if(settings.isLoading) { style +="box-shadow:none;"; } else { style +="background:#fff;"; } var isHtmlSlice = data.context == undefined ? true: false; s.container = $("
"); s.container.appendTo(document.body); data.clone(true).appendTo(s.container).show().attr('id', data.attr('id') || s.o.dataId + generateId); $("#" + s.o.replaceClose + generateId).click(function(e) { s.close($("#" + s.o.wrapper + generateId), settings, generateId); e.stopPropagation(); }); if (!isHtmlSlice) { s.elemBack(data, generateId); } data.detach(); return s.container; }, elemBack: function(data, generateId) { var s = this; // 让传入的元素在对话框关闭后可以返回到原来的地方 var display = data.css("display"); var obj = data[0]; var prev = obj.previousSibling; var next = obj.nextSibling; var parent = obj.parentNode; s["elemBack_" + generateId] = function() { if (prev && prev.parentNode) { prev.parentNode.insertBefore(obj, prev.nextSibling); } else if (next && next.parentNode) { next.parentNode.insertBefore(obj, next); } else if (parent) { parent.appendChild(obj); }; data.css({ "display": display }); }; }, isLastLayer: function() { var s = this; return $("." + s.o.wrapper).length <= 0; }, hasBgLayer: function() { var s = this; return $("." + s.o.bgLayer).length > 0; }, close: function(data, settings, generateId) { var s = this; var result = true; if (settings.close) { result = settings.close(); } //调用回调函数 if (result == undefined || result) { data.remove(); if (s.isLastLayer()) { $("#" + s.o.bgLayer).remove(); } } if (s["elemBack_" + generateId]) { s["elemBack_" + generateId](); }; }, closeLayer: function(obj) { var s = this; var $wapper = $(obj).parents("div." + s.o.wrapper); $("." + s.o.replaceClose, $wapper).trigger("click"); }, fixLayer: function(data) { var s = this; var T = ($(window).height() - data.innerHeight()) / 2 + (s.o.ie6 ? $(document).scrollTop() : data.scrollTop()); var L = ($(window).width() - data.width()) / 2 + (s.o.ie6 ? $(document).scrollLeft() : data.scrollLeft()); // 考虑到用户体验,T不能 < 0 return data.css({"left": L,"top": (T >= 0 ? T: 50)}); }, dragLayer: function(data, settings) { var s = this; var move = false; // 移动标记 var x = 0, y = 0; // 鼠标离控件左上角的相对位置 var o = data.find("." + s.o.dragableClass).css({"cursor": "move"}); var a = o[0]; o.mousedown(function(e) { //IE9 IE10居然把e.button改成0了,艹 var isLeftClick = (s.o.isIe && e.button == 1) || (!s.o.isIe && e.button == 0) || (s.o.ie9_10 && e.button == 0); if (isLeftClick) { // data.fadeTo(20, 0.25);// 点击后开始拖动并透明显示 s.o.isIe ? a.setCapture() : window.captureEvents(Event.MOUSEMOVE); move = true; x = e.pageX - parseInt(data.css("left")); y = e.pageY - parseInt(data.css("top")); $(document).mousemove(function(e) { if (move) { var sx = e.pageX - x; // 移动时根据鼠标位置计算控件左上角的绝对位置 var sy = e.pageY - y; data.css({"top": sy,"left": sx}); } }).mouseup(function() { // data.fadeTo("fast", 1);// 松开鼠标后停止移动并恢复成不透明 move = false; x = 0; y = 0; s.o.isIe ? a.releaseCapture() : window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP); }); } else { return false; } }); }, shakeLayer: function(data) { var ll = ($(window).width() - data.width()) / 2; var loop = 4; for (var i = 1; i <= loop; i++) { data.animate({left: ll - (loop * 10 - 10 * i)},50); data.animate({left: ll + 2 * (loop * 10 - 10 * i)},50); } } }; $.fn.layerModel = function(options) { return this.each(function(idx, item) { methods.init(item, options); }); }; $.fn.close = function() { methods.closeLayer(this); }; $.fn.fix = function() { var mn = $(this).parents("." + methods.o.wrapper); return methods.fixLayer($(mn[0])); }; })(jQuery);