|
|
/**
|
|
|
+-------------------------------------------------------------------
|
|
|
* jQuery thinkbox - 弹出层插件 - http://zjzit.cn/thinkbox
|
|
|
+-------------------------------------------------------------------
|
|
|
* @version 1.0.0 beta2
|
|
|
* @since 2013.05.10
|
|
|
* @author 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
|
|
|
* @github https://github.com/Aoiujz/thinkbox.git
|
|
|
+-------------------------------------------------------------------
|
|
|
*/
|
|
|
(function($){
|
|
|
var
|
|
|
/* 当前脚本文件名 */
|
|
|
__FILE__ = $("script").last().attr("src"),
|
|
|
|
|
|
/* 弹出层对象 */
|
|
|
ThinkBox,
|
|
|
|
|
|
/* 弹出层默认选项 */
|
|
|
defaults = {
|
|
|
"style" : "default", //弹出层样式
|
|
|
"title" : null, // 弹出层标题
|
|
|
"fixed" : true, // 是否使用固定定位(fixed)而不是绝对定位(absolute),IE6不支持。
|
|
|
"center" : true, // 弹出层是否屏幕中心显示
|
|
|
"display" : true, // 创建后是否立即显示
|
|
|
"x" : 0, // 弹出层 x 坐标。 当 center 属性为 true 时此属性无效
|
|
|
"y" : 0, // 弹出层 y 坐标。 当 center 属性为 true 时此属性无效
|
|
|
"modal" : true, // 弹出层是否设置为模态。设置为 true 将显示遮罩背景
|
|
|
"modalClose" : true, // 点击模态背景是否关闭弹出层
|
|
|
"resize" : true, // 是否在窗口大小改变时重新定位弹出层位置
|
|
|
"unload" : false, // 关闭后是否卸载
|
|
|
"escHide" : true, // 按ESC是否关闭弹出层
|
|
|
"delayClose" : 0, // 延时自动关闭弹出层 0表示不自动关闭
|
|
|
"drag" : false, // 点击标题框是否允许拖动
|
|
|
"width" : "", // 弹出层内容区域宽度 空表示自适应
|
|
|
"height" : "", // 弹出层内容区域高度 空表示自适应
|
|
|
"dataEle" : "", // 弹出层绑定到的元素,设置此属性的弹出层只允许同时存在一个
|
|
|
"locate" : ["left", "top"], //弹出层位置属性
|
|
|
"show" : ["fadeIn", "normal"], //显示效果
|
|
|
"hide" : ["fadeOut", "normal"], //关闭效果
|
|
|
"actions" : ["minimize", "maximize", "close"], //窗口操作按钮
|
|
|
"tools" : false, //是否创建工具栏
|
|
|
"buttons" : {}, //工具栏默认按钮 仅tools为true时有效
|
|
|
"beforeShow" : $.noop, //显示前的回调方法
|
|
|
"afterShow" : $.noop, //显示后的回调方法
|
|
|
"afterHide" : $.noop, //隐藏后的回调方法
|
|
|
"beforeUnload": $.noop, //卸载前的回调方法
|
|
|
"afterDrag" : $.noop //拖动停止后的回调方法
|
|
|
},
|
|
|
|
|
|
/* 弹出层层叠高度 */
|
|
|
zIndex = 2013,
|
|
|
|
|
|
/* 弹出层语言包 */
|
|
|
lang = {},
|
|
|
|
|
|
/* 弹出层列表 */
|
|
|
lists = {},
|
|
|
|
|
|
/* 弹出层容器 */
|
|
|
wrapper = [
|
|
|
"<div class=\"thinkbox\" style=\"position:fixed\">",
|
|
|
//使用表格,可以做到良好的宽高自适应,而且方便低版本浏览器做圆角样式
|
|
|
"<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">",
|
|
|
"<tr>",
|
|
|
"<td class=\"thinkbox-top-left\"></td>", //左上角
|
|
|
"<td class=\"thinkbox-top\"></td>", //上边
|
|
|
"<td class=\"thinkbox-top-right\"></td>", //右上角
|
|
|
"</tr>",
|
|
|
"<tr>",
|
|
|
"<td class=\"thinkbox-left\"></td>", //左边
|
|
|
"<td class=\"thinkbox-inner\">", //弹出层inner
|
|
|
"<div class=\"thinkbox-title\"></div>", //弹出层标题栏
|
|
|
"<div class=\"thinkbox-body\"></div>", //弹出层body
|
|
|
"<div class=\"thinkbox-tools\"></div>", //弹出层工具栏
|
|
|
"</td>",
|
|
|
"<td class=\"thinkbox-right\"></td>", //右边
|
|
|
"</tr>",
|
|
|
"<tr>",
|
|
|
"<td class=\"thinkbox-bottom-left\"></td>", //左下角
|
|
|
"<td class=\"thinkbox-bottom\"></td>", //下边
|
|
|
"<td class=\"thinkbox-bottom-right\"></td>", //右下角
|
|
|
"</tr>",
|
|
|
"</table>",
|
|
|
"</div>"].join(""),
|
|
|
|
|
|
/* document和window对象分别对应的jQuery对象 */
|
|
|
_doc = $(document), _win = $(window);
|
|
|
|
|
|
/* 加载指定的CSS文件 */
|
|
|
function includeCss(css, onload){
|
|
|
var path = __FILE__.slice(0, __FILE__.lastIndexOf("/"));
|
|
|
if($("link[href='" + path + css + "']").length){
|
|
|
fire(onload);
|
|
|
return;
|
|
|
};
|
|
|
|
|
|
//加载CSS文件
|
|
|
$("<link/>")
|
|
|
.load(function(){fire(onload)})
|
|
|
.attr({
|
|
|
"href" : path + css + "?" + Math.random(),
|
|
|
"type" : "text/css",
|
|
|
"rel" : "stylesheet"
|
|
|
}).appendTo("head");
|
|
|
}
|
|
|
|
|
|
/* 获取屏幕可视区域的大小和位置 */
|
|
|
function viewport(){
|
|
|
return {
|
|
|
"width" : _win.width(),
|
|
|
"height" : _win.height(),
|
|
|
"left" : _win.scrollLeft(),
|
|
|
"top" : _win.scrollTop()
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/* 调用回调函数 */
|
|
|
function fire(event, data){
|
|
|
if($.isFunction(event))
|
|
|
return event.call(this, data);
|
|
|
}
|
|
|
|
|
|
/* 删除options中不必要的参数 */
|
|
|
function del(keys, options){
|
|
|
if($.isArray(keys)){ //删除多个
|
|
|
for(i in keys){
|
|
|
_(keys[i]);
|
|
|
}
|
|
|
} else { //删除一个
|
|
|
_(keys);
|
|
|
}
|
|
|
|
|
|
//从options中删除一个指定的元素
|
|
|
function _(key){
|
|
|
if(key in options) delete options[key];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 禁止选中文字 */
|
|
|
function unselect(){
|
|
|
var element = $("body")[0];
|
|
|
element.onselectstart = function() {return false}; //ie
|
|
|
element.unselectable = "on"; // ie
|
|
|
element.style.MozUserSelect = "none"; // firefox
|
|
|
element.style.WebkitUserSelect = "none"; // chrome
|
|
|
}
|
|
|
|
|
|
/* 允许选中文字 */
|
|
|
function onselect(){
|
|
|
var element = $("body")[0];
|
|
|
element.onselectstart = function() {return true}; //ie
|
|
|
element.unselectable = "off"; // ie
|
|
|
element.style.MozUserSelect = ""; // firefox
|
|
|
element.style.WebkitUserSelect = ""; // chrome
|
|
|
}
|
|
|
|
|
|
/* 设置为当前选中的弹出层对象 */
|
|
|
function setCurrent(){
|
|
|
var options = lists[this.key][0], box = lists[this.key][1];
|
|
|
if(lists.current != this.key){
|
|
|
lists.current = this.key;
|
|
|
options.modal && box.data("ThinkBoxModal").css({"zIndex": zIndex-1})
|
|
|
box.css({"zIndex": zIndex++});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 卸载弹出层容器 */
|
|
|
function unload(){
|
|
|
var options = lists[this.key][0], box = lists[this.key][1];
|
|
|
fire.call(this, options.beforeUnload); //卸载前的回调方法
|
|
|
options.modal && box.data("ThinkBoxModal").remove();
|
|
|
box.remove();
|
|
|
_win.off("resize." + this.key);
|
|
|
delete lists[this.key];
|
|
|
options.dataEle && $(options.dataEle).removeData("ThinkBox");
|
|
|
}
|
|
|
|
|
|
/* 安装模态背景 */
|
|
|
function setupModal(){
|
|
|
var self = this,
|
|
|
options = lists[this.key][0],
|
|
|
box = lists[this.key][1],
|
|
|
modal = box.data("ThinkBoxModal");
|
|
|
|
|
|
//存在隐藏的遮罩层则直接显示
|
|
|
if(modal){
|
|
|
modal.show();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
modal = $("<div class=\"thinkbox-modal-blackout-" + options.style + "\"></div>")
|
|
|
.css({
|
|
|
"zIndex" : zIndex++,
|
|
|
"position" : "fixed",
|
|
|
"left" : 0,
|
|
|
"top" : 0,
|
|
|
"right" : 0,
|
|
|
"bottom" : 0
|
|
|
})
|
|
|
.click(function(event){
|
|
|
options.modalClose && lists.current == self.key && self.hide();
|
|
|
event.stopPropagation();
|
|
|
})
|
|
|
.mousedown(function(event){event.stopPropagation()})
|
|
|
.appendTo($("body"));
|
|
|
box.data("ThinkBoxModal", modal);
|
|
|
}
|
|
|
|
|
|
/* 安装标题栏 */
|
|
|
function setupTitleBar() {
|
|
|
var title = $(".thinkbox-title", lists[this.key][1]), options = lists[this.key][0];
|
|
|
if(options.title){
|
|
|
//拖动弹出层
|
|
|
if (options.drag) {
|
|
|
title.addClass("thinkbox-draging");
|
|
|
drag.call(this, title);
|
|
|
}
|
|
|
this.setTitle(options.title);
|
|
|
//安装窗口操作按钮
|
|
|
setupWindowActions.call(this, title);
|
|
|
} else {
|
|
|
title.remove();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 安装弹出层操作按钮 */
|
|
|
function setupWindowActions(title){
|
|
|
var actions, button, action, options = lists[this.key][0], self = this;
|
|
|
if(options.actions && $.isArray(options.actions)){
|
|
|
actions = $("<div/>").addClass("thinkbox-window-actions").appendTo(title)
|
|
|
.on("click", "button", function(){
|
|
|
if(!$(this).hasClass("disabled")){
|
|
|
switch(this.name){
|
|
|
case "minimize": //最小化
|
|
|
self.minimize(this);
|
|
|
break;
|
|
|
case "maximize": //最大化
|
|
|
self.maximize(this);
|
|
|
break;
|
|
|
case "close": //关闭
|
|
|
self.hide();
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
.on("mousedown mouseup", function(event){event.stopPropagation()});
|
|
|
for(i in options.actions){
|
|
|
button = options.actions[i];
|
|
|
action = $("<button/>").appendTo(actions).addClass("thinkbox-actions-" + button)
|
|
|
.attr("name", button) //设置名称
|
|
|
.attr("title", button) //设置title
|
|
|
.text(lang[button] || button); //设置显示文本
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 拖动弹出层 */
|
|
|
function drag(title){
|
|
|
var draging = null, self = this, options = lists[this.key][0], box = lists[this.key][1];
|
|
|
_doc.mousemove(function(event){
|
|
|
draging &&
|
|
|
box.css({left: event.pageX - draging[0], top: event.pageY - draging[1]});
|
|
|
});
|
|
|
title.mousedown(function(event) {
|
|
|
var offset = box.offset();
|
|
|
if(options.fixed){
|
|
|
offset.left -= _win.scrollLeft();
|
|
|
offset.top -= _win.scrollTop();
|
|
|
}
|
|
|
unselect(); //禁止选中文字
|
|
|
draging = [event.pageX - offset.left, event.pageY - offset.top];
|
|
|
}).mouseup(function() {
|
|
|
draging = null;
|
|
|
onselect(); //允许选中文字
|
|
|
fire.call(self, options.afterDrag); //拖动后的回调函数
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/* 安装工具栏 */
|
|
|
function setupToolsBar() {
|
|
|
var tools = $(".thinkbox-tools", lists[this.key][1]),
|
|
|
options = lists[this.key][0], button, self = this;
|
|
|
if(options.tools){
|
|
|
if(options.buttons && $.isPlainObject(options.buttons)){
|
|
|
for(name in options.buttons){
|
|
|
this.addToolsButton(name, options.buttons[name]);
|
|
|
}
|
|
|
|
|
|
/* 绑定按钮点击事件 */
|
|
|
tools.on("click", "button", function(){
|
|
|
if(!$(this).hasClass("disabled")){
|
|
|
if(false === options.buttons[this.name][2].call(self)){
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
/* 执行默认事件 */
|
|
|
switch(this.name){
|
|
|
case "close":
|
|
|
case "cancel":
|
|
|
self.hide(false);
|
|
|
break;
|
|
|
case "submit":
|
|
|
self.find("form").submit();
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
} else {
|
|
|
tools.remove();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 构造方法,用于实例化一个新的弹出层对象
|
|
|
+----------------------------------------------------------
|
|
|
* element 弹出层内容元素
|
|
|
* options 弹出层选项
|
|
|
+----------------------------------------------------------
|
|
|
*/
|
|
|
ThinkBox = function(element, options){
|
|
|
var self = this, options, box, boxLeft; //初始化变量
|
|
|
options = $.extend({}, defaults, options || {}); //合并配置选项
|
|
|
|
|
|
/* 创建弹出层容器 */
|
|
|
box = $(wrapper).addClass("thinkbox-" + options.style).data("thinkbox", self);
|
|
|
|
|
|
/* 保存弹出层基本信息到全局变量 */
|
|
|
this.key = "thinkbox_" + new Date().getTime() + (Math.random() + "").substr(2,12);
|
|
|
lists[this.key] = [options, box];
|
|
|
|
|
|
/* 缓存弹出层,防止弹出多个 */
|
|
|
options.dataEle && $(options.dataEle).data("thinkbox", self);
|
|
|
|
|
|
/**
|
|
|
* 给box绑定事件
|
|
|
* 鼠标按下记录当前弹出层对象
|
|
|
* 鼠标点击阻止事件冒泡
|
|
|
*/
|
|
|
box.on("click mousedown", function(event){
|
|
|
setCurrent.call(self);
|
|
|
event.stopPropagation();
|
|
|
});
|
|
|
|
|
|
/* 设置弹出层位置属性 */
|
|
|
options.fixed || box.css("position", "absolute");
|
|
|
|
|
|
/* 安装弹出层相关组件 */
|
|
|
setupTitleBar.call(self); // 安装标题栏
|
|
|
setupToolsBar.call(self);// 安装工具栏
|
|
|
|
|
|
/* 自动加载css文件并显示弹出层 */
|
|
|
includeCss("/skin/" + options.style + "/style.css", function(){
|
|
|
box.hide().appendTo("body"); //放入body
|
|
|
|
|
|
/* 解决拖动出浏览器时左边不显示的BUG */
|
|
|
boxLeft = $(".thinkbox-left", box).width();
|
|
|
boxLeft && $(".thinkbox-left", box).append($("<div/>").css("width", boxLeft));
|
|
|
|
|
|
self.setSize(options.width, options.height);
|
|
|
self.setContent(element || "<div></div>"); //设置内容
|
|
|
options.display && self.show();
|
|
|
});
|
|
|
|
|
|
}; //END ThinkBox
|
|
|
|
|
|
/**
|
|
|
* 注册ThinkBox开放API接口
|
|
|
*/
|
|
|
ThinkBox.prototype = {
|
|
|
/* 显示弹出层 */
|
|
|
"show" : function(){
|
|
|
var self = this, options = lists[this.key][0], box = lists[this.key][1];
|
|
|
if(box.is(":visible")) return this;
|
|
|
options.modal && setupModal.call(this); // 安装模态背景
|
|
|
fire.call(this, options.beforeShow); //调用显示之前回调函数
|
|
|
//显示效果
|
|
|
switch(options.show[0]){
|
|
|
case "slideDown":
|
|
|
box.stop(true, true).slideDown(options.show[1], _);
|
|
|
break;
|
|
|
case "fadeIn":
|
|
|
box.stop(true, true).fadeIn(options.show[1], _);
|
|
|
break;
|
|
|
default:
|
|
|
box.show(options.show[1], _);
|
|
|
}
|
|
|
|
|
|
//窗口大小改变后重设位置和大小
|
|
|
options.resize && _win.on("resize." + self.key, function(){
|
|
|
self.setSize(options.width, options.height);
|
|
|
self.resetLocate();
|
|
|
});
|
|
|
setCurrent.call(this);
|
|
|
return this;
|
|
|
|
|
|
function _(){
|
|
|
options.delayClose &&
|
|
|
$.isNumeric(options.delayClose) &&
|
|
|
setTimeout(function(){
|
|
|
self.hide();
|
|
|
}, options.delayClose);
|
|
|
//调用显示后的回调方法
|
|
|
fire.call(self, options.afterShow);
|
|
|
}
|
|
|
},
|
|
|
|
|
|
/* 关闭弹出层 data 为传递给关闭后回调函数的额外数据 */
|
|
|
"hide" : function(data){
|
|
|
var self = this, options = lists[this.key][0], box = lists[this.key][1], modal;
|
|
|
if(!box.is(":visible")) return this;
|
|
|
|
|
|
//隐藏遮罩层
|
|
|
modal = box.data("ThinkBoxModal");
|
|
|
modal && modal.fadeOut();
|
|
|
|
|
|
//影藏效果
|
|
|
switch(options.hide[0]){
|
|
|
case "slideUp":
|
|
|
box.stop(true, true).slideUp(options.hide[1], _);
|
|
|
break;
|
|
|
case "fadeOut":
|
|
|
box.stop(true, true).fadeOut(options.hide[1], _);
|
|
|
break;
|
|
|
default:
|
|
|
box.hide(options.hide[1], _);
|
|
|
}
|
|
|
return this;
|
|
|
|
|
|
function _() {
|
|
|
fire.call(self, options.afterHide, data); //隐藏后的回调方法
|
|
|
options.unload && unload.call(self);
|
|
|
}
|
|
|
},
|
|
|
|
|
|
/* 显示或隐藏弹出层 */
|
|
|
"toggle" : function(){
|
|
|
return lists[this.key][1].is(":visible") ? self.hide() : self.show();
|
|
|
},
|
|
|
|
|
|
/* 在弹出层内容中查找 */
|
|
|
"find" : function(selector){
|
|
|
var content = $(".thinkbox-body", lists[this.key][1]);
|
|
|
return selector ? $(selector, content) : content.children();
|
|
|
},
|
|
|
|
|
|
/* 获取弹出层内容 */
|
|
|
"getContent" : function(){
|
|
|
return $(".thinkbox-body", lists[this.key][1]).html()
|
|
|
},
|
|
|
|
|
|
/* 设置弹出层内容 */
|
|
|
"setContent" : function(content){ //设置弹出层内容
|
|
|
var options = lists[this.key][0];
|
|
|
$(".thinkbox-body", lists[this.key][1]).empty().append($(content).show()); // 添加新内容
|
|
|
this.resetLocate(); //设置弹出层显示位置
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 设置弹出层内容区域大小 */
|
|
|
"setSize" : function(width, height){
|
|
|
var width = $.isFunction(width) ? width.call(this) : width,
|
|
|
height = $.isFunction(height) ? height.call(this) : height;
|
|
|
$(".thinkbox-body", lists[this.key][1]).css({"width" : width, "height" : height});
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 移动弹出层到屏幕中间 */
|
|
|
"moveToCenter" : function() {
|
|
|
var size = this.getSize(),
|
|
|
view = viewport(),
|
|
|
overflow = lists[this.key][1].css("position") == "fixed" ? [0, 0] : [view.left, view.top],
|
|
|
x = overflow[0] + view.width / 2,
|
|
|
y = overflow[1] + view.height / 2;
|
|
|
this.moveTo(x - size[0] / 2, y - size[1] / 2);
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 移动弹出层到指定坐标 */
|
|
|
"moveTo" : function (x, y) {
|
|
|
var box = lists[this.key][1], options = lists[this.key][0];
|
|
|
$.isNumeric(x) &&
|
|
|
(options.locate[0] == "left" ? box.css({"left" : x}) : box.css({"right" : x}));
|
|
|
$.isNumeric(y) &&
|
|
|
(options.locate[1] == "top" ? box.css({"top" : y}) : box.css({"bottom" : y}));
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 获取弹出层尺寸 */
|
|
|
"getSize" : function (){
|
|
|
var size = [0, 0], box = lists[this.key][1];
|
|
|
if(box.is(":visible")) //获取显示的弹出层尺寸
|
|
|
size = [box.width(), box.height()];
|
|
|
else { //获取隐藏的弹出层尺寸
|
|
|
box.css({"visibility" : "hidden", "display" : "block"});
|
|
|
size = [box.width(), box.height()];
|
|
|
box.css({"visibility" : "visible", "display" : "none"});
|
|
|
}
|
|
|
return size;
|
|
|
},
|
|
|
|
|
|
/* 设置弹出层标题 */
|
|
|
"setTitle" : function(title){
|
|
|
$(".thinkbox-title", lists[this.key][1]).empty().append("<span>" + title + "</span>");
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 重置弹出层位置 */
|
|
|
"resetLocate" : function(){
|
|
|
var options = lists[this.key][0];
|
|
|
options.center ?
|
|
|
this.moveToCenter() :
|
|
|
this.moveTo(
|
|
|
$.isNumeric(options.x) ?
|
|
|
options.x :
|
|
|
($.isFunction(options.x) ? options.x.call($(options.dataEle)) : 0),
|
|
|
$.isNumeric(options.y) ?
|
|
|
options.y :
|
|
|
($.isFunction(options.y) ? options.y.call($(options.dataEle)) : 0)
|
|
|
);
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 设置状态栏信息 */
|
|
|
"setStatus" : function(content, name){
|
|
|
var options = lists[this.key][0],
|
|
|
box = lists[this.key][1],
|
|
|
name = name ? "thinkbox-status-" + name : "", status;
|
|
|
/* 存在工具栏则显示状态信息 */
|
|
|
if(options.tools){
|
|
|
$(".thinkbox-status", box).remove();
|
|
|
status = $("<div class=\"thinkbox-status\">").addClass(name).html(content);
|
|
|
$(".thinkbox-tools", box).prepend(status);
|
|
|
}
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 添加一个按钮 */
|
|
|
"addToolsButton" : function(name, config){
|
|
|
var options = lists[this.key][0],
|
|
|
box = lists[this.key][1], button;
|
|
|
/* 存在工具栏则创建button */
|
|
|
if(options.tools){
|
|
|
button = $("<button/>").attr("name", name).text(config[0]);
|
|
|
config[1] && button.addClass("thinkbox-button-" + config[1]);
|
|
|
if(!$.isFunction(config[2])){config[2] = $.noop};
|
|
|
$(".thinkbox-tools", box).append(button);
|
|
|
}
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 重置一个按钮 */
|
|
|
"setToolsButton" : function(oldName, newName, config){
|
|
|
var options = lists[this.key][0],
|
|
|
box = lists[this.key][1], button;
|
|
|
button = $(".thinkbox-tools", box).find("button[name=" + oldName + "]", box)
|
|
|
.attr("name", newName).text(config[0]);
|
|
|
options.buttons[newName] = config;
|
|
|
config[1] && button.removeClass().addClass("thinkbox-button-" + config[1]);
|
|
|
if(!$.isFunction(config[2])){config[2] = $.noop};
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 卸载一个按钮 */
|
|
|
"removeToolsButton" : function(name){
|
|
|
$(".thinkbox-tools", lists[this.key][1]).find("button[name='" + name + "']").remove();
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 禁用一个按钮 */
|
|
|
"disableToolsButton" : function(name){
|
|
|
$(".thinkbox-tools", lists[this.key][1]).find("button[name='" + name + "']")
|
|
|
.addClass("disabled").attr("disabled", "disabled");
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 启用一个按钮 */
|
|
|
"enableToolsButton" : function(name){
|
|
|
$(".thinkbox-tools", lists[this.key][1]).find("button[name='" + name + "']")
|
|
|
.removeClass("disabled").removeAttr("disabled", "disabled");
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 最小化弹出层 */
|
|
|
"minimize" : function(){
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
/* 最大化弹出层 */
|
|
|
"maximize" : function(){
|
|
|
return this;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 按ESC关闭弹出层 */
|
|
|
_doc.mousedown(function(){lists.current = null})
|
|
|
.keydown(function(event){
|
|
|
lists.current
|
|
|
&& lists[lists.current][0].escHide
|
|
|
&& event.keyCode == 27
|
|
|
&& lists[lists.current][1].data("thinkbox").hide();
|
|
|
});
|
|
|
|
|
|
/**
|
|
|
* 创建一个新的弹出层对象
|
|
|
+----------------------------------------------------------
|
|
|
* element 弹出层内容元素
|
|
|
* options 弹出层选项
|
|
|
+----------------------------------------------------------
|
|
|
*/
|
|
|
$.thinkbox = function(element, options){
|
|
|
if($.isPlainObject(options) && options.dataEle){
|
|
|
var data = $(options.dataEle).data("thinkbox");
|
|
|
if(data) return options.display === false ? data : data.show();
|
|
|
}
|
|
|
return new ThinkBox(element, options);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+----------------------------------------------------------
|
|
|
* 弹出层内置扩展
|
|
|
+----------------------------------------------------------
|
|
|
*/
|
|
|
$.extend($.thinkbox, {
|
|
|
/**
|
|
|
* 设置弹出层默认参数
|
|
|
* @param {string} name 配置名称
|
|
|
* @param {string} value 配置的值
|
|
|
*/
|
|
|
"defaults" : function(name, value){
|
|
|
if($.isPlainObject(name)){
|
|
|
$.extend(defaults, name);
|
|
|
} else {
|
|
|
defaults[name] = value;
|
|
|
}
|
|
|
},
|
|
|
|
|
|
// 以一个URL加载内容并以ThinBox弹出层的形式展现
|
|
|
"load" : function(url, opt){
|
|
|
var options = {
|
|
|
"clone" : false,
|
|
|
"loading" : "加载中...",
|
|
|
"type" : "GET",
|
|
|
"dataType" : "text",
|
|
|
"cache" : false,
|
|
|
"onload" : undefined
|
|
|
}, self, ajax, onload, loading, url = url.split(/\s+/);
|
|
|
$.extend(options, opt || {}); //合并配置项
|
|
|
|
|
|
//保存一些参数
|
|
|
onload = options.onload;
|
|
|
loading = options.loading;
|
|
|
|
|
|
//组装AJAX请求参数
|
|
|
ajax = {
|
|
|
"data" : options.data,
|
|
|
"type" : options.type,
|
|
|
"dataType" : options.dataType,
|
|
|
"cache" : options.cache,
|
|
|
"success" : function(data) {
|
|
|
url[1] && (data = $(data).find(url[1]));
|
|
|
if($.isFunction(onload))
|
|
|
data = fire.call(self, onload, data); //调用onload回调函数
|
|
|
self.setContent(data); //设置内容并显示弹出层
|
|
|
loading || self.show(); //没有loading状态则直接显示弹出层
|
|
|
}
|
|
|
};
|
|
|
|
|
|
//删除ThinkBox不需要的参数
|
|
|
del(["data", "type", "cache", "dataType", "onload", "loading"], options);
|
|
|
|
|
|
self = loading ?
|
|
|
//显示loading信息
|
|
|
$.thinkbox("<div class=\"thinkbox-load-loading\">" + loading + "</div>", options) :
|
|
|
//不显示loading信息则创建后不显示弹出层
|
|
|
$.thinkbox("<div/>", $.extend({}, options, {"display" : false}));
|
|
|
|
|
|
$.ajax(url[0], ajax);
|
|
|
return self;
|
|
|
},
|
|
|
|
|
|
// 弹出一个iframe
|
|
|
"iframe" : function(url, opt){
|
|
|
var options = {
|
|
|
"width" : 500,
|
|
|
"height" : 400,
|
|
|
"scrolling" : "no",
|
|
|
"onload" : undefined
|
|
|
}, self, iframe, onload;
|
|
|
$.extend(options, opt || {}); //合并配置项
|
|
|
onload = options.onload; //设置加载完成后的回调方法
|
|
|
//创建iframe
|
|
|
iframe = $("<iframe/>").attr({
|
|
|
"width" : options.width,
|
|
|
"height" : options.height,
|
|
|
"frameborder" : 0,
|
|
|
"scrolling" : options.scrolling,
|
|
|
"src" : url})
|
|
|
.load(function(){fire.call(self, onload)});
|
|
|
del(["width", "height", "scrolling", "onload"], options);//删除不必要的信息
|
|
|
self = $.thinkbox(iframe, options);
|
|
|
return self;
|
|
|
},
|
|
|
|
|
|
// 提示框 可以配合ThinkPHP的ajaxReturn
|
|
|
"tips" : function(msg, type, opt){
|
|
|
var options = {
|
|
|
"modalClose" : false,
|
|
|
"escHide" : false,
|
|
|
"unload" : true,
|
|
|
"close" : false,
|
|
|
"delayClose" : 1000
|
|
|
}, html;
|
|
|
|
|
|
//数字type转换为字符串type
|
|
|
switch(type){
|
|
|
case 0: type = "error"; break;
|
|
|
case 1: type = "success"; break;
|
|
|
}
|
|
|
html = "<div class=\"thinkbox-tips thinkbox-tips-" + type + "\">" + msg + "</div>";
|
|
|
$.extend(options, opt || {});
|
|
|
return $.thinkbox(html, options);
|
|
|
},
|
|
|
|
|
|
// 成功提示框
|
|
|
"success" : function(msg, opt){
|
|
|
return this.tips(msg, "success", opt);
|
|
|
},
|
|
|
|
|
|
// 错误提示框
|
|
|
"error" : function(msg, opt){
|
|
|
return this.tips(msg, "error", opt);
|
|
|
},
|
|
|
|
|
|
// 数据加载
|
|
|
"loading" : function(msg, opt){
|
|
|
var options = opt || {};
|
|
|
options.delayClose = 0;
|
|
|
return this.tips(msg, "loading", options);
|
|
|
},
|
|
|
|
|
|
//消息框
|
|
|
"msg" : function(msg, opt){
|
|
|
var options = {
|
|
|
"drag" : false,
|
|
|
"escHide" : false,
|
|
|
"delayClose" : 0,
|
|
|
"center" : false,
|
|
|
"title" : "消息",
|
|
|
"x" : 0,
|
|
|
"y" : 0,
|
|
|
"locate" : ["right", "bottom"],
|
|
|
"show" : ["slideDown", "slow"],
|
|
|
"hide" : ["slideUp", "slow"]
|
|
|
}, html;
|
|
|
$.extend(options, opt || {});
|
|
|
html = $("<div/>").addClass("thinkbox-msg").html(msg);
|
|
|
return $.thinkbox(html, options);
|
|
|
},
|
|
|
|
|
|
//提示框
|
|
|
"alert" : function(msg, opt){
|
|
|
var options = {
|
|
|
"title" : lang.alert || "Alert",
|
|
|
"modal" : true,
|
|
|
"modalClose" : false,
|
|
|
"unload" : false,
|
|
|
"tools" : true,
|
|
|
"actions" : ["close"],
|
|
|
"buttons" : {"ok" : [lang.ok || "Ok", "blue", function(){this.hide()}]}
|
|
|
};
|
|
|
|
|
|
$.extend(options, opt || {});
|
|
|
|
|
|
//删除ThinkBox不需要的参数
|
|
|
del("ok", options);
|
|
|
|
|
|
var html = $("<div/>").addClass("thinkbox-alert").html(msg);
|
|
|
return $.thinkbox(html, options);
|
|
|
},
|
|
|
|
|
|
//确认框
|
|
|
"confirm" : function(msg, opt){
|
|
|
var options = {"title" : "确认", "modal" : false, "modalClose" : false},
|
|
|
button = {"ok" : "确定", "cancel" : "取消"};
|
|
|
$.extend(options, opt || {});
|
|
|
options.ok && (button.ok = options.ok);
|
|
|
options.cancel && (button.cancel = options.cancel);
|
|
|
|
|
|
//删除ThinkBox不需要的参数
|
|
|
del(["ok", "cancel"], options);
|
|
|
|
|
|
options.buttons = button;
|
|
|
var html = $("<div/>").addClass("thinkbox-confirm").html(msg);
|
|
|
return $.thinkbox(html, options);
|
|
|
},
|
|
|
|
|
|
//弹出层内部获取弹出层对象
|
|
|
"get" : function(selector){
|
|
|
//TODO:通过弹窗内部元素找
|
|
|
return $(selector).closest(".thinkbox").data("thinkbox");
|
|
|
}
|
|
|
});
|
|
|
|
|
|
$.fn.thinkbox = function(opt){
|
|
|
if(opt == "get") return $(this).data("thinkbox");
|
|
|
return this.each(function(){
|
|
|
var self = $(this), box = self.data("thinkbox"), options, event;
|
|
|
switch(opt){
|
|
|
case "show":
|
|
|
box && box.show();
|
|
|
break;
|
|
|
case "hide":
|
|
|
box && box.hide();
|
|
|
break;
|
|
|
case "toggle":
|
|
|
box && box.toggle();
|
|
|
break;
|
|
|
default:
|
|
|
options = {
|
|
|
"title" : self.attr("title"),
|
|
|
"dataEle" : this,
|
|
|
"fixed" : false,
|
|
|
"center" : false,
|
|
|
"modal" : false,
|
|
|
"drag" : false
|
|
|
};
|
|
|
opt = $.isPlainObject(opt) ? opt : {};
|
|
|
$.extend(options, {
|
|
|
"x" : function(){return $(this).offset().left},
|
|
|
"y" : function(){return $(this).offset().top + $(this).outerHeight()}
|
|
|
}, opt);
|
|
|
if(options.event){
|
|
|
self.on(event, function(){
|
|
|
_.call(self, options);
|
|
|
return false;
|
|
|
});
|
|
|
} else {
|
|
|
_.call(self, options);
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
|
|
|
function _(options){
|
|
|
var href = this.data("href") || this.attr("href");
|
|
|
if(href.substr(0, 1) == "#"){
|
|
|
$.thinkbox(href, options);
|
|
|
} else if(href.substr(0, 7) == "http://" || href.substr(0, 8) == "https://"){
|
|
|
$.thinkbox.iframe(href, options);
|
|
|
} else {
|
|
|
$.thinkbox.load(href, options);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
})(jQuery);
|