弹出框插件

本插件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对象的各种方法就行了。

加油!

时间: 2024-10-01 14:35:51

弹出框插件的相关文章

吐槽JS弹出框插件

一个弹出框插件,多层弹出,最重要的事情是什么?就是不管多少层,全部弹出框都可以弹出到框架最顶层,也就是top层(为什么?因为页面复杂,我要最大化!),能方便的找到弹出框里面的页面以便父窗口操作弹出框中的内容,在弹出框内的页面,能方便找到父页面(注意,不是框架最顶层),能方便操作父页面的内容.也许你会觉得页面之前耦合严重,我告诉你,这样最简单最方便最灵活最随心所欲学习成本最低!多少高手都不明白这个道理.

移动端弹出框插件

在H5移动端项目开发过程,肯定会遇到不少与客户打交道的弹出框. 当然基于H5+ API中有提供系统的弹出对话框,虽然能够达到效果,但是实际的美观是几乎不存在的. 应项目需要,草草的写了一个弹出框的效果. 作为程序猿代码是最敏感的,废话也少说了,直接看下面的代码: css代码部分: #lee-mask { background: #000; opacity: 0.7; position: absolute; z-index: 1000; top: 0; left: 0; right: 0; bot

jQuery+css3弹出框插件

先来看DEMO:https://codepen.io/jonechen/pen/regjGG 插件的开发很简单,运用了CSS3的动画效果,并且弹出框的内容可以自定义.插件的默认配置参数有三个: var defaults = { event: 'click', // 默认点击事件 dialogBox: 'selector', // 弹出框容器 hover: false, // 默认滑动事件关闭 } CSS部分: *{padding: 0; margin: 0; list-style: none;f

javascript制作弹出框插件

1 var AI=AI||{}; //定义自己的库,防止冲突 2 AI.alertMsg=function(obj){ 3 var _title=obj.title||'提示框'; 4 var _message=obj.message||'你没有设置提示内容'; 5 var backgroundImg=obj.backgroundImg||"http://wegames.sinaapp.com/myImg/bg.png"; 6 var btnImg=obj.btnImg||"

弹出框插件集合

sweetalert: http://t4t5.github.io/sweetalert/       提示 bootStrap: class="modal-dialog"    表单 bootbox: http://bootboxjs.com/documentation.html jnotify: 小提示框

Bootstrap 弹出框(Popover)插件

Bootstrap 弹出框(Popover)插件与Bootstrap 提示工具(Tooltip)插件类似,提供了一个扩展的视图,用户只需要把鼠标指针悬停到元素上面即可.弹出框的内容完全由Bootstrap Data API来填充. 用法 弹出框插件根据需要生成内容或标记,默认情况下把弹出框(Popover)放在它们触发元素的后面,您可以有两种方法来启动弹出框 1.通过data属性:如需要添加一个弹出框,只需要向锚或按钮添加一个data-toggle="popover"即可.锚的 tit

Bootstrap 弹出框和警告框插件

一.弹出框 弹出框即点击一个元素弹出一个包含标题和内容的容器. //基本用法 <button class="btn btn-lg btn-danger" type="button" data-toggle="popover" title="弹出框" data-content="这是一个弹出框插件"> 点击弹出/隐藏弹出框 </button>   <script type=&qu

第 16 章 弹出框和警告框插件

学习要点: 1.弹出框 2.警告框 主讲教师:李炎恢 本节课我们主要学习一下 Bootstrap 中的弹出框和警告框插件. 一.弹出框 弹出框即点击一个元素弹出一个包含标题和内容的容器. //基本用法 <button class="btn btn-lg btn-danger" type="button" data-toggle="popover" title="弹出框" data-content="这是一个弹出

第二百四十六节,Bootstrap弹出框和警告框插件

Bootstrap弹出框和警告框插件 学习要点: 1.弹出框 2.警告框 本节课我们主要学习一下 Bootstrap 中的弹出框和警告框插件. 一.弹出框 弹出框即点击一个元素弹出一个包含标题和内容的容器. 基本用法 注意:必须在js结合popover()方法使用 data-toggle="popover"弹出框事件绑定,写在触发弹出框的元素里,执行弹出框事件点击弹出或隐藏(Bootstrap)title=""设置弹出框标题,写在弹出框元素里,(Bootstrap)