实现一个弹窗的封装

前言

   这是阿里春招实习在线编程的一道题目:

用js实现,弹窗弹出时需要有半透明的蒙层,位置需要根据弹窗的大小实现左右、垂直居中,对话框需要有标题栏(标题栏有关闭功能)、内容栏、操作按钮栏,不能直接使用第三方UI库。

回答完这道题目之后,我想说总结一下自己封装的这个弹窗插件,只是简单的完成了部分功能,具体完整的功能,可以自行再添加~

源代码:Gist

演示地址:Demo

主要使用方法:

页面HTML结构:

 1 <div class="modal" id='modal'>
 2     <div class="modal-dialog">
 3   <div class="modal-header">对话框标题<a href="#" class="close">×</a></div>
 4     <div class="modal-content">对话框的内容</div>
 5     <div class="modal-controller">
 6         <button class='btn-ok'>确定</button>
 7         <button class='bnt-close close'>取消</button>
 8     </div>
 9     </div>
10 </div>

js调用方法:

1 var modal=new Modal(document.getElementById('modal'));
2 // 说明 : 实例化弹窗插件
3 
4 function openModal(){
5     modal.open();
6 }
7 // 说明 :modal.close();关闭弹窗 

下面是详细的脚本解释:

 1 (function(window){
 2   // 使用构造函数方法 声明一个Modal对象
 3   var Modal=function(ele){
 4         this.$el=ele;
 5         this.init();
 6     }
 7  // 在Modal的原型上实现close,open,init方法,实现方法的复用
 8     Modal.prototype.close=function(){
 9         this.$el.style.display='none';
10     }
11     Modal.prototype.open=function(){
12         this.$el.style.display='block';
13     }
14     Modal.prototype.init=function(){
15         var self=this;
16        // 绑定关闭按钮点击事件处理函数,检索所有 带 .close类名 的按钮
17         if(this.$el.addEventListener){
18             this.$el.addEventListener('click',function(e){
19                 e.preventDefault();
20                 var target=e.target;
21                 var classNames=target.className.split(' ');
22                 if(classNames.indexOf('close')!==-1){
23                     self.close();
24                 }
25             },false);
26         }else if(this.$el.attachEvent){
27             this.$el.attachEvent('onclick',function(e){
28                     e=e||window.event;
29                 if(e.preventDefault){
30                     e.preventDefault();
31                 }else{
32                     e.returnValue=false;
33                 }
34                 var target=e.target||e.srcElement;
35                 var classNames=target.className.split(' ');
36                 if(classNames.indexOf('close')!==-1){
37                     self.close();
38                 }
39             });
40         }
41     }
42     window.Modal=Modal;
43 })(window);

结束语

  这个弹窗插件使用了闭包,避免的全局环境的污染,只是给全局环境添加了一个Modal对象,可实现任意多个Modal对象的实例化,主要使用了原型+构造函数的方法构建对象。实现了公共方法的复用。如果有什么不好的地方,欢迎指出~

原文地址:https://www.cnblogs.com/kasmine/p/6533318.html