jQuery弹出层插件Dialog

12年前
/**  * DialogUpdate  *  * @author    huang ji hua  * @copyright Copyright (C) 2012  * @license   FreeBSD license  */  /**  * jQuery的Dialog插件。  *  * @param object content  * @param object options 选项。  * @return   */  function Dialog(content, options) {      var defaults = { // 默认值。           title: '标题',       // 标题文本,若不想显示title请通过CSS设置其display为none           showTitle: true,     // 是否显示标题栏。          closeText: '[关闭]', // 关闭按钮文字,若不想显示关闭按钮请通过CSS设置其display为none           draggable: true,     // 是否移动           modal: true,         // 是否是模态对话框           center: true,        // 是否居中。           fixed: true,         // 是否跟随页面滚动 true表示不滚动 false滚动。          time: 0,             // 自动关闭时间,为0表示不会自动关闭。           id: false,            // 对话框的id,若为false,则由系统自动产生一个唯一id。          dialogClass: 'meBan-box w-390', //最外层div样式名称          iframeAttr:'scrolling="no"',//iframe attr          titleClass: ''//标题样式名称               };      var options = $.extend(defaults, options);      options.id = options.id ? options.id : 'dialog-' + Dialog.__count; // 唯一ID      var overlayId = options.id + '-overlay'; // 遮罩层ID      var timeId = null;  // 自动关闭计时器       var isShow = false;      var isIe = $.browser.msie;      var isIe6 = $.browser.msie && ('6.0' == $.browser.version);      /* 对话框的布局及标题内容。*/      var barHtml = !options.showTitle ? '' :    '<div class="hd"><b class="'+ options.titleClass +'">' + options.title + '</b> <a href="javascript:void(0)" class="close">' + options.closeText + '</a></div>'      dialog = $('<div id="' + options.id + '" class="' + options.dialogClass + '"><div class="borderg">' + barHtml + '<div class="content"></div></div>').hide();      $('body').append(dialog);      /**      * 重置对话框的位置。      *      * 主要是在需要居中的时候,每次加载完内容,都要重新定位      *      * @return void      */      var resetPos = function () {          /* 是否需要居中定位,必需在已经知道了dialog元素大小的情况下,才能正确居中,也就是要先设置dialog的内容。 */          if (options.center) {              var left = ($(window).width() - dialog.width()) / 2;              var top = ($(window).height() - dialog.height()) / 2;              if (!isIe6 && options.fixed)              { dialog.css({ top: top, left: left }); }              else              { dialog.css({ top: top + $(document).scrollTop(), left: left + $(document).scrollLeft() }); }          }      }        /**      * 初始化位置及一些事件函数。      *      * 其中的this表示Dialog对象而不是init函数。      */      var init = function () {          /* 是否需要初始化背景遮罩层 */          if (options.modal) {              $('body').append('<div id="' + overlayId + '" class="dialog-overlay"></div>');              $('#' + overlayId).css({ 'left': 0, 'top': 0,                  /*'width':$(document).width(),*/                  'width': '100%',                  /*'height':'100%',*/                  'height': $(document).height(),                  'z-index': ++Dialog.__zindex,                  'position': 'absolute'              })                  .hide();          }            dialog.css({ 'z-index': ++Dialog.__zindex, 'position': options.fixed ? 'fixed' : 'absolute' });            /*  IE6 兼容fixed代码 */          if (isIe6 && options.fixed) {              dialog.css('position', 'absolute');              resetPos();              var top = parseInt(dialog.css('top')) - $(document).scrollTop();              var left = parseInt(dialog.css('left')) - $(document).scrollLeft();              $(window).scroll(function () {                  dialog.css({ 'top': $(document).scrollTop() + top, 'left': $(document).scrollLeft() + left });              });          }            /* 以下代码处理框体是否可以移动 */          var mouse = { x: 0, y: 0 };          function moveDialog(event) {              var e = window.event || event;              var top = parseInt(dialog.css('top')) + (e.clientY - mouse.y);              var left = parseInt(dialog.css('left')) + (e.clientX - mouse.x);              dialog.css({ top: top, left: left });              mouse.x = e.clientX;              mouse.y = e.clientY;          };          dialog.find('.hd').mousedown(function (event) {              if (!options.draggable) { return; }              var e = window.event || event;              mouse.x = e.clientX;              mouse.y = e.clientY;              $(document).bind('mousemove', moveDialog);          });                   $(document).mouseup(function (event) {              $(document).unbind('mousemove', moveDialog);          });            /* 绑定一些相关事件。 */          dialog.find('.close').bind('click', this.close);          dialog.bind('mousedown', function () { dialog.css('z-index', ++Dialog.__zindex); });            // 自动关闭           if (0 != options.time) { timeId = setTimeout(this.close, options.time); }      }          /**      * 设置对话框的内容。       *      * @param string c 可以是HTML文本。      * @return void      */      this.setContent = function (c) {          var div = dialog.find('.content');          if ('object' == typeof (c)) {              switch (c.type.toLowerCase()) {                  case 'id': // 将ID的内容复制过来,原来的还在。                      div.html($('#' + c.value).html());                      break;                  case 'img':                      div.html('加载中...');                      $('<img alt="" />').load(function () { div.empty().append($(this)); resetPos(); })                      .attr('src', c.value);                      break;                  case 'url':                      div.html('加载中...');                      $.ajax({ url: c.value,                          success: function (html) { div.html(html); resetPos(); },                          error: function (xml, textStatus, error) { div.html('出错啦') }                      });                      break;                  case 'iframe':                      div.append($('<iframe src="' + c.value + '" ' + options.iframeAttr + '/>'));                      break;                  case 'text': break;                  default:                      div.html(c.value);                      break;              }          }          else          { div.html(c); }      }        /**      * 显示对话框      */      this.show = function () {          if (undefined != options.beforeShow && !options.beforeShow())          { return; }            /**          * 获得某一元素的透明度。IE从滤境中获得。          *          * @return float          */          var getOpacity = function (id) {              if (!isIe)              { return $('#' + id).css('opacity'); }                var el = document.getElementById(id);              return (undefined != el                      && undefined != el.filters                      && undefined != el.filters.alpha                      && undefined != el.filters.alpha.opacity)                  ? el.filters.alpha.opacity / 100 : 1;          }          /* 是否显示背景遮罩层 */          if (options.modal)          { $('#' + overlayId).fadeTo('slow', getOpacity(overlayId)); }          dialog.fadeTo('slow', getOpacity(options.id), function () {              if (undefined != options.afterShow) { options.afterShow(); }              isShow = true;          });          // 自动关闭           if (0 != options.time) { timeId = setTimeout(this.close, options.time); }            resetPos();      }          /**      * 隐藏对话框。但并不取消窗口内容。      */      this.hide = function () {          if (!isShow) { return; }            if (undefined != options.beforeHide && !options.beforeHide())          { return; }            dialog.fadeOut('slow', function () {              if (undefined != options.afterHide) { options.afterHide(); }          });          if (options.modal)          { $('#' + overlayId).fadeOut('slow'); }            isShow = false;      }        /**      * 关闭对话框       *      * @return void      */      this.close = function () {          if (undefined != options.beforeClose && !options.beforeClose())          { return; }            dialog.fadeOut('slow', function () {              $(this).remove();              isShow = false;              if (undefined != options.afterClose) { options.afterClose(); }          });          if (options.modal)          { $('#' + overlayId).fadeOut('slow', function () { $(this).remove(); }); }          clearTimeout(timeId);      }            init.call(this);      this.setContent(content);        Dialog.__count++;      Dialog.__zindex++;  }  Dialog.__zindex = 500;  Dialog.__count = 1;  Dialog.version = '1.0 beta';    function dialog(content, options) {      var dlg = new Dialog(content, options);      dlg.show();      return dlg;  }    //调用方式:  new Dialog({type:'url',value:'/dialog/videoplayer/"+shlf.InnerCode +"'},{title:'标题',closeText:'',dialogClass:'meBan-box w-670'}).show()