自编jQuery插件实现模拟alert和confirm


Posted in Javascript onSeptember 01, 2014

啥也不说,先上图,有图有真相 :)

自编jQuery插件实现模拟alert和confirm

自编jQuery插件实现模拟alert和confirm

现在绝大多数网站都不用自带的alert和confirm了,因为界面太生硬了。因此这个插件就这样产生了...

来看插件的实现代码吧:

(function () {
  $.MsgBox = {
    Alert: function (title, msg) {
      GenerateHtml("alert", title, msg);
      btnOk(); //alert只是弹出消息,因此没必要用到回调函数callback
      btnNo();
    },
    Confirm: function (title, msg, callback) {
      GenerateHtml("confirm", title, msg);
      btnOk(callback);
      btnNo();
    }
  }

  //生成Html
  var GenerateHtml = function (type, title, msg) {

    var _html = "";

    _html += '<div id="mb_box"></div><div id="mb_con"><span id="mb_tit">' + title + '</span>';
    _html += '<a id="mb_ico">x</a><div id="mb_msg">' + msg + '</div><div id="mb_btnbox">';

    if (type == "alert") {
      _html += '<input id="mb_btn_ok" type="button" value="确定" />';
    }
    if (type == "confirm") {
      _html += '<input id="mb_btn_ok" type="button" value="确定" />';
      _html += '<input id="mb_btn_no" type="button" value="取消" />';
    }
    _html += '</div></div>';

    //必须先将_html添加到body,再设置Css样式
    $("body").append(_html); GenerateCss();
  }

  //生成Css
  var GenerateCss = function () {

    $("#mb_box").css({ width: '100%', height: '100%', zIndex: '99999', position: 'fixed',
      filter: 'Alpha(opacity=60)', backgroundColor: 'black', top: '0', left: '0', opacity: '0.6'
    });

    $("#mb_con").css({ zIndex: '999999', width: '400px', position: 'fixed',
      backgroundColor: 'White', borderRadius: '15px'
    });

    $("#mb_tit").css({ display: 'block', fontSize: '14px', color: '#444', padding: '10px 15px',
      backgroundColor: '#DDD', borderRadius: '15px 15px 0 0',
      borderBottom: '3px solid #009BFE', fontWeight: 'bold'
    });

    $("#mb_msg").css({ padding: '20px', lineHeight: '20px',
      borderBottom: '1px dashed #DDD', fontSize: '13px'
    });

    $("#mb_ico").css({ display: 'block', position: 'absolute', right: '10px', top: '9px',
      border: '1px solid Gray', width: '18px', height: '18px', textAlign: 'center',
      lineHeight: '16px', cursor: 'pointer', borderRadius: '12px', fontFamily: '微软雅黑'
    });

    $("#mb_btnbox").css({ margin: '15px 0 10px 0', textAlign: 'center' });
    $("#mb_btn_ok,#mb_btn_no").css({ width: '85px', height: '30px', color: 'white', border: 'none' });
    $("#mb_btn_ok").css({ backgroundColor: '#168bbb' });
    $("#mb_btn_no").css({ backgroundColor: 'gray', marginLeft: '20px' });


    //右上角关闭按钮hover样式
    $("#mb_ico").hover(function () {
      $(this).css({ backgroundColor: 'Red', color: 'White' });
    }, function () {
      $(this).css({ backgroundColor: '#DDD', color: 'black' });
    });

    var _widht = document.documentElement.clientWidth; //屏幕宽
    var _height = document.documentElement.clientHeight; //屏幕高

    var boxWidth = $("#mb_con").width();
    var boxHeight = $("#mb_con").height();

    //让提示框居中
    $("#mb_con").css({ top: (_height - boxHeight) / 2 + "px", left: (_widht - boxWidth) / 2 + "px" });
  }


  //确定按钮事件
  var btnOk = function (callback) {
    $("#mb_btn_ok").click(function () {
      $("#mb_box,#mb_con").remove();
      if (typeof (callback) == 'function') {
        callback();
      }
    });
  }

  //取消按钮事件
  var btnNo = function () {
    $("#mb_btn_no,#mb_ico").click(function () {
      $("#mb_box,#mb_con").remove();
    });
  }
})();

Html代码结构如下,js里面拼接的不直观,给出如下:

<div id="mb_box"></div>
<div id="mb_con">
    <span id="mb_tit">title</span><a id="mb_ico">x</a>
    <div id="mb_msg">msg</div>
    <div id="mb_btnbox">
      <input id="mb_btn_ok" type="button" value="确定" />
      <input id="mb_btn_no" type="button" value="取消" />
    </div>
</div>

mb_box为半透明遮罩层,将整个页面遮住,禁止操作;mb_con为提示框。之所以没把mb_con放在mb_box里面,是因为如果放里面的话,对mb_box设置的透明度会影响到mb_con,使mb_con也会变成透明的。之前也试过background-color:rgba(),可惜ie8及以下版本不支持。所以还是把mb_con拿到外面来了,通过设置z-index使其mb_box的上面。

为了使插件使用方便,特意的没有用到图片,全是通过css来控制界面效果,使用时,引用一个js文件就可以了。css样式在js中写死了,这点可能不太灵活,但使用却很方便如果你对界面样式不满意或者与你网站的色彩风格不一致,那只能自行修改了。

由于弹出层(div)无法做到像原始的alert和confirm那样做到页面阻塞效果,因此只能通过 回调函数 来进行模拟。也因为这个原因,后台数据操作只能通过回调函数配合ajax来完成的。

Demo如下:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>模拟alert和confirm提示框</title>
</head>
<body>
  <input id="add" type="button" value="添加" />
  <input id="delete" type="button" value="删除" />
  <input id="update" type="button" value="修改" />

  <script src="../js/jquery-1.4.1.min.js" type="text/javascript"></script>
  <script src="../js/jquery.similar.msgbox.js" type="text/javascript"></script>
  <script type="text/javascript">

    $("#add").bind("click", function () {
      $.MsgBox.Alert("消息", "哈哈,添加成功!");
    });

    //回调函数可以直接写方法function(){}
    $("#delete").bind("click", function () {
      $.MsgBox.Confirm("温馨提示", "执行删除后将无法恢复,确定继续吗?温馨提示", function () { alert("你居然真的删除了..."); });
    });


    function test() {
      alert("你点击了确定,进行了修改");
    }
    //也可以传方法名 test
    $("#update").bind("click", function () {
      $.MsgBox.Confirm("温馨提示", "确定要进行修改吗?", test);
    });

    //当然你也可以不给回调函数,点击确定后什么也不做,只是关闭弹出层

 //$("#update").bind("click", function () { $.MsgBox.Confirm("温馨提示", "确定要进行修改吗?"); });

  </script>
</body>
</html>

代码量并不多,如有什么疑问可以留言 :)

Javascript 相关文章推荐
jquery文字上下滚动的实现方法
Mar 22 Javascript
js select option对象小结
Dec 20 Javascript
jQuery实现购物车数字加减效果
Mar 14 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
Sep 19 Javascript
js弹出对话框方式小结
Nov 17 Javascript
分享10个优化代码的CSS和JavaScript工具
May 11 Javascript
Vue.js实战之利用vue-router实现跳转页面
Apr 01 Javascript
如何解决vue2.0下IE浏览器白屏问题
Sep 13 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
Jul 27 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
Aug 05 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
Oct 18 Javascript
Node.js文本文件BOM头的去除方法
Nov 22 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
Sep 01 #Javascript
JQuery $.each遍历JavaScript数组对象实例
Sep 01 #Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
Sep 01 #Javascript
用js通过url传参把数据从一个页面传到另一个页面
Sep 01 #Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
Sep 01 #Javascript
Javascript让DEDECMS告别手写Tag
Sep 01 #Javascript
通过JS来动态的修改url,实现对url的增删查改
Sep 01 #Javascript
You might like
隐藏你的.php文件的实现方法
2007/03/19 PHP
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
JQuery触发事件例如click
2013/09/11 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
[48:20]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
pytorch:model.train和model.eval用法及区别详解
2020/02/20 Python
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
Solaris操作系统的线程机制
2012/12/23 面试题
《桥》教学反思
2014/04/09 职场文书
学校就业推荐信范文
2014/05/19 职场文书
十佳少年事迹材料
2014/12/25 职场文书
高三教师工作总结2015
2015/07/21 职场文书
小学语文教师研修日志
2015/11/13 职场文书
Python上下文管理器Content Manager
2021/06/26 Python
CPU不支持Windows11系统怎么办
2021/11/21 数码科技