前言
这是阿里春招实习在线编程的一道题目:
用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对象的实例化,主要使用了原型+构造函数的方法构建对象。实现了公共方法的复用。如果有什么不好的地方,欢迎指出~