前言
這是阿里春招實習在線編程的一道題目:
用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對象的實例化,主要使用了原型+構造函數的方法構建對象。實現了公共方法的復用。如果有什么不好的地方,歡迎指出~