chaojidan

导航

弹出框插件

本插件ccShow是用来在前端显示弹出框,用户可以点击按钮,弹出一个框,也可以Ajax请求时,弹出提示语,请求中,等Ajax结束后,就显示已完成或者请求失败等情况。基于jQuery的插件,兼容各种浏览器。

var ccShow = {};

var isSetTimeOut=false;
var isShow = false,

    showType = "";

ccShow.showMsg = function (rb, type, willHide,callback,showTime) {   //此方法,显示提示语,一般用于Ajax请求时,弹出提示语
  //rb是你要显示的内容,type是代表你显示的内容是成功还是失败,成功就是green的底色,失败就是red的底色,willHide代表弹出框是否会显示几秒后消失,callback代表你点击弹出框时,调用的方法,showTime代表弹出框显示多少毫秒。

  var isHide = willHide == false ? false : true;     //willHide为true,isHide为true,代表将会隐藏,

  var showTime = showTime || 3000;    //默认显示3秒
  var p = this;
  type = type || "success";      //默认是成功类型,也就是底色是绿色
  if (!isShow) {           //一个页面只能出现一个tip,所以需要用一个全局变量来操作,第一次调用时,isShow为false,进入if语句
    var tips = $("#tips", top.document);   //取最外面的window对象的document中的tips元素。(此元素就是弹出框容器)
    showType = type;
    tips.attr("class", "");      //先把class清空
    switch (type) {
      case "load":
        tips.addClass("msgBoxdiv msg-orange");    //加载中的底色是黄色
        break;
      case "fail":
        tips.addClass("msgBoxdiv msg-red");
        break;
      default:
        tips.addClass("msgBoxdiv msg-green");
    }
    tips.find('span').html(rb);    //把要显示的内容赋给tips元素中
    tips.show();    //显示tips
    isShow=true;       //标志tips正在显示,如果这时,再次调用showMsg方法,将不会做任何处理
    if(typeof(callback)=="function"){    //如果有回调方法,就绑定tips,当用户点击tips时,调用这个回调方法,同时隐藏这个弹出框tips
      $("#tips").find("a").bind("click",function(){
        callback();
        p.hideMsg();

      });
    }
    if (isHide && type != 'load') {      //如果需要隐藏,并且type不能是load,因为load就代表加载中,不可能会消失
      function _hideMsg(){
        p.hideMsg();
      }
      window.clearTimeout(isSetTimeOut);
      isSetTimeOut = window.setTimeout(_hideMsg, showTime);
    }
  }
};
/*
隐藏加载提示信息
*/
ccShow.hideMsg= function (type) {
  if(showType != "load"){
    $("#tips", parent.document).hide();    //如果显示的类型不是加载中,就隐藏tips,并且设置isShow为false
    isShow = false;
  }
};

/*
显示遮罩层
*/
function showOpactity() {
  if ($("#shareLayer", parent.document).length > 0) {    //如果已经创建过这个遮罩层,直接显示就行    
    $("#shareLayer", parent.document).show();       
  }
  else {
    var opactity = document.createElement("div");
    opactity.id = "shareLayer";
    opactity.style.zIndex = 999;           
    opactity.className = "shareLayer";     //遮罩层的显示主要在这个css类中
    top.document.body.appendChild(opactity);
  }
};
/*
隐藏遮罩层
*/
function hideOpactity() {
  $("#shareLayer", parent.document).hide();
};

/*
显示一个提示信息。alert形式
*/
ccShow.alert = function (rb, wo, title) {

  //rb代表要提示的内容,wo代表按确定按钮后的回调函数,text代表弹出框的标题
  var ao = {
    id: 'alert',
    title: title || "弹出框",
    type: 'text',
    text: '<div class="pmt_div"><p class="col_grey pt_10">' + rb + '</p> <i class="i-pmt"></i></div>',
    zindex: 99999,
    buttons: [
      {
        text: "ok",
        clickEvent: wo
      }
    ],
    dragStyle: 1
  };
  msgBox(ao);
};

/*
显示一个弹出Div
Json 数据格式定义如下:
var ao = {
   id:"example",       
   title:"exampleTitle",
   text:"测试",
   buttons:[{
     text:"确定,"
     clickEven:functin(){},
     isCancelBtn:false
   }]
 };
*/
function msgBox(ao) {
  ao = ao || {};
  var id = ao.id || "";
  var divDialogId = "divDialog" + id;
  if ($("#divDialogId").length > 0) { //id相同时,就代表此弹出已经在显示了,就不做任何处理
    return;
  }
  var divDialogCloseId = "divDialogClose" + id;
  var title = ao.title;    //弹出框标题
  var text = ao.text;   //弹出框内容
  var btns = ao.buttons;    //弹出框按钮数组
  var zindex = ao.zindex || 99999; 

  var type = ao.type || 'div';
  showOpactity();   //显示遮罩层
  var objDivDialog = document.createElement("div");
  objDivDialog.id = divDialogId;
  top.document.body.appendChild(objDivDialog);
  objDivDialog.style.zIndex = zindex;      //显示弹出框,因为弹出框的z-index大于遮罩层的z-index值,因此会显示在遮罩层上面
  objDivDialog.className = "pop";
  var html = [];
  html[html.length] = '<h2 class="pop_hd" id="pop_drag">' + title + '<a class="pop-cls i-wcls" href="javascript:;" id="' + divDialogCloseId + '"></a></h2>';      //标题
  html[html.length] = '<div class="pop_bd" style="min-height:80px" id="btnAlert' + id + '" tabindex="1">';
  html[html.length] = ao.text;      //内容
  if (btns && btns.length > 0) {
    html[html.length] = '<div class="pop_bdiv ta_r">';
    for (var i = 0; i < btns.length; i++) {    //如果有buttons属性,就循环这个数组
      var btnText = btns[i].text;      
      var btnClass = "p_btn_on";
      if (btns.length != 1 && i == btns.length - 1)    //当有2个以及以上选项时,最后一项的class为p_btn
        btnClass = "p_btn";
      html[html.length] = '<a class=" + btnClass + " index="' + i + '" href="javascript:;">' + btnText + '</a>';   //显示这个数组中的每一项
    }
    html[html.length] = '</div>';
  }
  html[html.length] = '</div>';
  objDivDialog.innerHTML = html.join("");
  var width = ao.width || 425;     //弹出框的默认宽度为425
  objDivDialog.style.width = width + "px";
  (function (wrap) {
    var $window = $(parent.window),
    $document = $(parent.document),
    dl = $document.scrollLeft(),
    dt = $document.scrollTop(),
    ww = $window.width(),
    wh = $window.height(),
    ow = wrap.offsetWidth,
    oh = wrap.offsetHeight,
    left = (ww - ow) / 2 + dl,    //窗口宽度-弹出框的宽度,再除以2,弹出框就会显示在窗口中间,但是页面可能有滚动条,这时弹出框的left需要加上滚动的距离才会显示在窗口的中间
    top = (wh - oh) * 382 / 1000 + dt,    // 黄金比例,没有除以2,除以了2.61
    style = wrap.style;

    style.left = Math.max(parseInt(left), dl) + 'px';   //设置弹出框的横向位置,当窗口小于弹出框时,就使用滚动的位置,也就是在窗口的left:0,top:0显示
    style.top = Math.max(parseInt(top), dt) + 'px';   //设置弹出框的纵向位置
  })(objDivDialog);
  //绑定拖拽事件,弹出框可以拖动
  drag( $("#pop_drag"), $(objDivDialog), 9998, true );
  // 第一个参数代表可拖拽区域,也就是弹出框的那个区域可以通过mousedown拖动弹出框,并不是点击弹出框的任何位置就可以进行拖动的。
  // 第二个参数代表需要拖拽的弹出框
  // 第三个参数设置拖拽框的z-index值
  $("#" + divDialogCloseId, parent.document).bind("click", function () {   //如果点击关闭按钮
    var r = true;

    if (typeof(ao.sysCloseEvent) == "function") {  //先判断是否传入了关闭的回调方法
        r = ao.sysCloseEvent();
        if(r!=false){r = true;}//为了兼容回调函数没有返回值
    }
    if (r) {
        objDivDialog.parentNode.removeChild(objDivDialog);
        hideOpactity();
        return false;
    }
    
  });

  $("#btnAlert" + id, parent.document).bind("click", function (event) {   //给按钮选项绑定click事件
    var target = event.target;
    if (target.tagName == "A" && target.getAttribute("index")) {
      var index = parseInt(target.getAttribute("index"));
      var r = true;
      if (typeof(btns[index].clickEvent) == "function") {
        r = btns[index].clickEvent();    //如果按钮选项的回调方法返回false,将不会关闭弹出框。如果返回true,将会移除弹出框,并且隐藏遮罩层
        if(r!=false){r = true;}//为了兼容回调函数没有返回值
      }
      if (r) {
        objDivDialog.parentNode.removeChild(objDivDialog);
        hideOpactity();
        return false;
      }
    }
  });
  $("#btnAlert" + id, parent.document).focus();
  return $(objDivDialog);
};

/*
dragElement: 可拖拽区域
wrap: 需要拖拽的弹出框
zIndex: 设置拖拽框的z-index值
*/
function drag( dragElement, wrap, zIndex, limitRange ){
  var d = document,
  dd = document.documentElement,
  db = document.body,
  //获取当前视口高度和宽度
  cHeight = Math.max( dd.clientHeight, db.clientHeight ),
  cWidth = Math.max( dd.clientWidth, db.clientWidth ),
  //获取弹出框高度和宽度
  wrapWidth = wrap.width();
  wrapHeight = wrap.height();
  win = window;
  dragElement.bind("mousedown", function(e){    //可拖动区域绑定mousedown事件
    var ev = e || event,
    x = ev.clientX,     //鼠标点击的位置
    y = ev.clientY,
    os = wrap.offset(), //相对于视口的偏移,position()获得父元素的偏移
    disX = x - os.left,
    disY = y - os.top;

    wrap.css({ position: "absolute"});     //只有绝对定位,才能进行拖动
    if(zIndex){
      wrap.css({ zIndex: ++zIndex }); 
    }

    if(wrap[0].setCapture){    //针对IE浏览器。这段代码其实不影响拖动效果。之所以加这段是为了处理特殊情况,比如:当你在A页面触发mousedown,并且进行拖动时,突然弹出一个页面B,页面B覆盖了A,于是你的鼠标会在页面B上(这时你不松手,鼠标只是在页面B上,还没有focus)。这种情况下,如果你不写这段代码,将会出现A页面的mouseup没有触发,引起程序出错。但是你写了这段代码,就意味着,即便鼠标跳到了页面B上,鼠标的事件,页面A也能监听(这时页面B还没有获得鼠标focus)。当你在页面B上松开鼠标触发mouseup事件,页面A将会监听到,于是取消掉这个功能。这时鼠标在页面B的操作就不会影响到页面A了,页面A的拖动效果也能正常结束。
      wrap[0].setCapture();    
    }else if(win.captureEvents){   //针对火狐浏览器
      win.captureEvents(ev.MOUSEMOVE|ev.MOUSEUP );
    }

    //这段代码的意思是,IE:元素wrap[0]捕获窗口内所有的鼠标事件。火狐:捕获窗口内所有的鼠标move和鼠标up事件。这段代码,很偏门,可以不用理解,知道是怎么回事就行,不写也没错的。

    d.onmousemove = function(e){    //给document绑定mousemove事件
      var ev = e || event,
        size = {};
      size.l = ev.clientX - disX;   //鼠标移动的位置,减去的是mousedown时,鼠标与拖动框位置的偏移
      size.h = ev.clientY - disY;
      if(limitRange){     //是否有传入true,如果有,就需要调用限制区域的私有函数,此私有函数,是限制拖动的范围的。不传,或传入false,将不会限制
        limitRange( size );
      }
      wrap[0].style.left = size.l + "px";
      wrap[0].style.top = size.h + "px";
    }
    d.onmouseup = function(){
      if(wrap[0].releaseCapture){  //释放捕获
        wrap[0].releaseCapture();
      }else if(win.captureEvents){        
        win.releaseEvents(ev.MOUSEMOVE|ev.MOUSEUP);
      }

      d.onmousemove = null;
      d.onmouseup = null;
    }
    return false;
  });
  function limitRange( size ){  //不能把弹出框拖动到可视区之外。
    var l = size.l,
      h = size.h;
    if( l < 0 ){
      size.l = 0;
    }else if( l > cWidth - wrapWidth ){
      size.l = cWidth - wrapWidth;
    }
    if( h < 0 ){
      size.h = 0;
    }else if( h > cHeight - wrapHeight ){
      size.h = cHeight - wrapHeight;
    }
  }
};

/*
显示一个确认窗口。Confirm形式.
rb 提示的内容.
wo 确定按钮的回调函数.
title 标题
cancelCallbak 取消按钮回调函数

addId 额外的id字符串

*/
ccShow .confirm=function (rb, wo, title, cancelCallbak, addId) {

  var ao = {
    id: 'confirm' + (addId || ""),
    title: title || "确认",
    type: 'text',
    text: '<div class="pmt_div"><p class="col_grey pt_10">' + rb + '</p> <i class="i-pmt"></i></div>',
    zindex: 99999,
    buttons: [
      {
        text: "ok",
        clickEvent: wo
      },
      {
        text: "cancel",
        clickEvent: cancelCallbak
      }
    ]
  };
  msgBox(ao);
};

//显示默认弹出框

ccShow.showMsgBox = function(ao){
  return msgBox(ao);
};

/*
关闭弹出的Div
ids代表打开的div对象的id
*/
ccShow.closeMsgBox = function (ids) {
  var id = ids || "";
  $("#divDialogClose" + id).click();
}

使用该插件,只需要调用 ccShow对象的各种方法就行了。

 

 

加油!

posted on 2014-12-24 20:52  chaojidan  阅读(872)  评论(0编辑  收藏  举报