/* !
* zxxbox.js
* © 2010-2011 by zhangxinxu http://www.zhangxinxu.com/
* v1.0 2010-03-20
* v1.1 2010-04-03 #添加拖拽
* v1.2 2010-07-12 #修改浏览器高宽以及页面滚动高度获取
* v2.0 2010-08-01 #重写js,增加可读性,维护性
* #添加问答框确认的回调方法
* #修复浏览器大小变化时黑背景高度不变化的bug,且弹框一直居中显示
* v3.0 2010-09-05 #修改自定义提示的调用方法
#增加提示方法的回调函数接口
#增加弹窗打开和关闭的回调方法接口
#增加Ajax功能
#增加外框CSS3外阴影效果,美化UI
#弹框关闭以渐隐动画显示
* v3.1 2010-11-25 #更准确使用$.noop方法
* v3.2 2010-11-26 #修改些属性,使向下兼容1.3版本
* v3.3 2010-11-30 #阻止弹框重复关闭执行
* v3.4 2011-01-21 #修复错别字符,修复IE下弹框高度超过一屏拖拽会隐藏的bug
* v3.5 2011-03-03 #添加新的api参数protect
* v3.6 2011-04-06
* v3.7 2012-06-05 #修复ajax加载页面或html片段含JavaScript脚本时重复执行的bug
* v3.8 2012-06-12 #修复title记忆shut参数在ajax 加载时不起作用的问题
* v4.0 2012-06-13 #框架CSS实现大调整
*/
(function ($) {
// 给页面装载CSS样式
var LG = 'linear-gradient(top, #fafafa, #eee)', CSS = ''
$('head').append(CSS)
var WRAP = '
' +
''
$.fn.zxxbox = function (options) {
options = options || {}
var s = $.extend({}, zxxboxDefault, options)
return this.each(function () {
var node = this.nodeName.toLowerCase()
if (node === 'a' && s.ajaxTagA) {
$(this).click(function () {
var href = $.trim($(this).attr('href'))
if (href && href.indexOf('javascript:') !== 0) {
if (href.indexOf('#') === 0) {
$.zxxbox($(href), options)
} else {
// 加载图片
$.zxxbox.loading()
var myImg = new Image(), element
myImg.onload = function () {
var w = myImg.width, h = myImg.height
if (w > 0) {
var element = $('')
options.protect = false
// 江鸿宾修改:宽高最大不能超过窗口宽高减去100,如果超出则等比例缩小。
var maxw = $(window).width() - 100
var maxh = $(window).height() - 100
if (w > maxw && h < maxh) { element.width(maxw) }
else if (w < maxw && h > maxh) { element.height(maxh) }
else if (w > maxw && h > maxh) {
if ((w - maxw) / maxw > (h - maxh) / maxh) { element.width(maxw) }
else { element.height(maxh) }
}
// 江鸿宾修改结束
$.zxxbox(element, options)
}
}
myImg.onerror = function () {
// 显示加载图片失败
$.zxxbox.ajax(href, {}, options)
}
myImg.src = href
}
}
return false
})
} else {
$.zxxbox($(this), options)
}
})
}
$.zxxbox = function (elements, options) {
if (!elements) {
return
}
var s = $.extend({}, zxxboxDefault, options || {})
// 弹框的显示
var eleOut = $('#wrapOut'), eleBlank = $('#zxxBlank')
if (eleOut.length) {
eleOut.show()
eleBlank[s.bg ? 'show' : 'hide']()
} else {
$('body').append(WRAP)
}
if (typeof (elements) === 'object') {
elements.show()
} else {
elements = $(elements)
}
// 一些元素对象
$.o = {
s: s,
ele: elements,
bg: eleBlank.length ? eleBlank : $('#zxxBlank'),
out: eleOut.length ? eleOut : $('#wrapOut'),
tit: $('#wrapTitle'),
bar: $('#wrapBar'),
clo: $('#wrapClose'),
bd: $('#wrapBody')
}
// 标题以及关闭内容
$.o.tit.html(s.title)
$.o.clo.html(s.shut)
// 装载元素
$.o.bd.empty().append(elements)
if ($.isFunction(s.onshow)) {
s.onshow()
}
// 尺寸
$.zxxbox.setSize()
// 定位
$.zxxbox.setPosition()
if (s.fix) {
$.zxxbox.setFixed()
}
if (s.drag) {
$.zxxbox.drag()
} else {
$(window).resize(function () {
$.zxxbox.setPosition()
})
}
if (!s.bar) {
$.zxxbox.barHide()
} else {
$.zxxbox.barShow()
}
if (!s.bg) {
$.zxxbox.bgHide()
} else {
$.zxxbox.bgShow()
}
if (!s.btnclose) {
$.zxxbox.closeBtnHide()
} else {
$.o.clo.click(function () {
$.zxxbox.hide()
return false
})
}
if (s.bgclose) {
$.zxxbox.bgClickable()
}
if (s.delay > 0) {
setTimeout($.zxxbox.hide, s.delay)
}
}
$.extend($.zxxbox, {
setSize: function () {
if (!$.o.bd.length || !$.o.ele.length || !$.o.bd.length) {
return
}
// 主体内容的尺寸
$.o.out.css({
'width': $.o.s.width,
'height:': $.o.s.height
})
return $.o.out
},
setPosition: function (flag) {
flag = flag || false
if (!$.o.bg.length || !$.o.ele.length || !$.o.out.length) {
return
}
var w = $(window).width(), h = $(window).height(), st = $(window).scrollTop(), ph = $('body').height()
if (ph < h) {
ph = h
}
$.o.bg.width(w).height(ph).css('opacity', $.o.s.opacity)
// 主体内容的位置
// 获取当前主体元素的尺寸
var xh = $.o.out.outerHeight(), xw = $.o.out.outerWidth()
var t = st + (h - xh) / 2, l = (w - xw) / 2
if ($.o.s.fix && window.XMLHttpRequest) {
t = (h - xh) / 2
}
if (flag === true) {
$.o.out.animate({
top: t,
left: l
})
} else {
$.o.out.css({
top: t,
left: l,
zIndex: $.o.s.index
})
}
return $.o.out
},
// 定位
setFixed: function () {
if (!$.o.out || !$.o.out.length) {
return
}
if (window.XMLHttpRequest) {
$.zxxbox.setPosition().css({
position: 'fixed'
})
} else {
$(window).scroll(function () {
$.zxxbox.setPosition()
})
}
return $.o.out
},
// 背景可点击
bgClickable: function () {
if ($.o.bg && $.o.bg.length) {
$.o.bg.click(function () {
$.zxxbox.hide()
})
}
},
// 背景隐藏
bgHide: function () {
if ($.o.bg && $.o.bg.length) {
$.o.bg.hide()
}
},
// 背景层显示
bgShow: function () {
if ($.o.bg && $.o.bg.length) {
$.o.bg.show()
} else {
$('').prependTo('body')
}
},
// 标题栏隐藏
barHide: function () {
if ($.o.bar && $.o.bar.length) {
$.o.bar.hide()
}
},
// 标题栏显示
barShow: function () {
if ($.o.bar && $.o.bar.length) {
$.o.bar.show()
}
},
// 关闭按钮隐藏
closeBtnHide: function () {
if ($.o.clo && $.o.clo.length) {
$.o.clo.hide()
}
},
// 弹框隐藏
hide: function () {
if ($.o.ele && $.o.out.length && $.o.out.css('display') !== 'none') {
$.o.out.fadeOut('fast', function () {
if ($.o.s.protect && (!$.o.ele.hasClass('wrap_remind') || $.o.ele.attr('id'))) {
$.o.ele.hide().appendTo($('body'))
}
$(this).remove()
if ($.isFunction($.o.s.onclose)) {
$.o.s.onclose()
}
})
if ($.o.bg.length) {
$.o.bg.fadeOut('fast', function () {
$(this).remove()
})
}
}
return false
},
// 拖拽
drag: function () {
if (!$.o.out.length || !$.o.bar.length) {
$(document).unbind('mouseover').unbind('mouseup')
return
}
var bar = $.o.bar, out = $.o.out
var drag = false
var currentX = 0, currentY = 0, posX = out.css('left'), posY = out.css('top')
bar.mousedown(function (e) {
drag = true
currentX = e.pageX
currentY = e.pageY
}).css('cursor', 'move')
$(document).mousemove(function (e) {
if (drag) {
var nowX = e.pageX, nowY = e.pageY
var disX = nowX - currentX, disY = nowY - currentY
out.css('left', parseInt(posX) + disX).css('top', parseInt(posY) + disY)
}
})
$(document).mouseup(function () {
drag = false
posX = out.css('left')
posY = out.css('top')
})
},
// 预载
loading: function () {
var element = $('加载中...
')
$.zxxbox(element, { bar: false })
},
// ask询问方法
ask: function (message, sureCall, cancelCall, options) {
var element = $('')
$.zxxbox(element, options)
// 回调方法
$('#zxxSureBtn').click(function () {
if ($.isFunction(sureCall)) {
sureCall.call(this)
}
})
$('#zxxCancelBtn').click(function () {
if (cancelCall && $.isFunction(cancelCall)) {
cancelCall.call(this)
}
$.zxxbox.hide()
})
},
// remind提醒方法
remind: function (message, callback, options) {
var element = $('')
$.zxxbox(element, options)
$('#zxxSubmitBtn').click(function () {
// 回调方法
if (callback && $.isFunction(callback)) {
callback.call(this)
}
$.zxxbox.hide()
})
},
// uri Ajax方法
ajax: function (uri, params, options) {
if (uri) {
$.zxxbox.loading()
options = options || {}
options.protect = false
$.ajax({
url: uri,
data: params || {},
success: function (html, other) {
$.zxxbox(html, options)
},
error: function () {
$.zxxbox.remind('加载出了点问题。')
}
})
}
}
})
var zxxboxDefault = {
title: '', // 江鸿宾清空标题栏:对话框
shut: '×',
index: 2000,
opacity: 0.5,
width: 'auto',
height: 'auto',
bar: true, // 是否显示标题栏
bg: true, // 是否显示半透明背景
btnclose: true, // 是否显示关闭按钮
fix: false, // 是否弹出框固定在页面上
bgclose: false, // 是否点击半透明背景隐藏弹出框
drag: true, // 是否可拖拽,江鸿宾改为可拖动
ajaxTagA: true, // 是否a标签默认Ajax操作
protect: 'auto', // 保护装载的内容
onshow: $.noop, // 弹窗显示后触发事件
onclose: $.noop, // 弹窗关闭后触发事件
delay: 0 // 弹窗打开后关闭的时间, 0和负值不触发
}
})(jQuery)
// 江鸿宾(QQ33080907)添加
$(function () {
'use strict'
// 图片预览
$('a.zxxbox').zxxbox({
bgclose: true,
fix: true,
btnclose: false
})
// 打开iframe窗口,窗口尺寸用data-winsize="[650,300]"定义,标题用title='xxx'定义
$('a.win').on('click', function () {
// console.log(1);
var winsize = $(this).data('winsize')
var title = $(this).attr('title')
if (winsize === undefined) { winsize = [750, 400] }
if (title === undefined) { title = $(this).text() || ' ' }
$.zxxbox('', {
title: title,
fix: true,
bgclose: true,
onclose: function () { $('#zxxwin').remove() }
})
return false
})
})