/* ! * 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 = $('
' + message + '

  

') $.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 = $('
' + message + '

') $.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 }) })