原生Javascript插件開發(fā)實(shí)踐
前言
之前公司設(shè)計(jì)的網(wǎng)站比較混亂,很多地方不統(tǒng)一,其中一個(gè)就是彈出層,導(dǎo)致這個(gè)原因是因?yàn)椋镜腢I換了好幾個(gè)人,而他們每個(gè)人做出來的都不太一樣。最近公司開始整頓這個(gè)問題,對于統(tǒng)一的這種東西當(dāng)然是做成一個(gè)模塊,或者插件,而我打算做成插件。之所以寫這篇文章是因?yàn)?,?dāng)寫完這個(gè)插件以后,發(fā)現(xiàn)其中有不少的理念,而這些理念我想把它總結(jié)一下,雖然這個(gè)插件并不復(fù)雜。
該怎樣架構(gòu)?
對于架構(gòu)這個(gè)概念,接觸的比較少,我的理解,架構(gòu)就是解決未來可能會發(fā)生的事。
之前也封裝過一些插件,但后端嫌我封裝的太難用,于是分析其原因,發(fā)現(xiàn)之前寫的插件,該暴露的接口沒有,有些不需要傳的參數(shù)反而要傳。該暴露的接口沒有,這是因?yàn)槲覜]有按照未來的思想來寫插件,而往往這樣寫出來的插件就成了一次性用品。
所以這段時(shí)間,在寫插件之前都會事先思考清楚,這個(gè)插件都需要哪些參數(shù),而哪些又是必須傳的,哪些是可選的,哪些功能以后可能會用到,哪些是可以會更改的,這些都是必須考慮的,不然寫出來的插件肯定會有很多的問題。
基本雛形
;(function(window,document){ var MaskShare = function(){ }; MaskShare.prototype = {}; window.MaskShare = MaskShare; }(window,document));
把要寫的代碼,封閉到一個(gè)自執(zhí)行函數(shù)里面,防止變量沖突,然后將這個(gè)構(gòu)造函數(shù)暴露給window對象,方便我們在外部去訪問這個(gè)構(gòu)造函數(shù)。
效果需要做成如下的:
思考需要哪些參數(shù)
這個(gè)功能就是點(diǎn)擊某個(gè)元素,彈出一個(gè)遮罩層,點(diǎn)擊遮罩層將遮罩層去掉。
因此可以分析出,至少需要一個(gè)參數(shù),也就是我們需要知道點(diǎn)擊誰彈出彈出層,另外我們還需要配置一些默認(rèn)參數(shù)。
;(function(window,document){ var MaskShare = function(targetDom,options){ // 判斷是用函數(shù)創(chuàng)建的還是用new創(chuàng)建的。這樣我們就可以通過MaskShare("dom") 或 new MaskShare("dom")來使用這個(gè)插件了 if(!(this instanceof MaskShare))return new MaskShare(targetDom,options); // 參數(shù)合并 this.options = this.extend({ // 這個(gè)參數(shù)以后可能會更改所以暴露出去 imgSrc:"../static/img/coupon-mask_1.png" },options); // 判斷傳進(jìn)來的是DOM還是字符串 if((typeof targetDom)==="string"){ this.targetDom = document.querySelector(targetDom); }else{ this.targetDom = targetDom; } var boxDom = document.createElement("div"); var imgDom = document.createElement("img"); // 設(shè)置默認(rèn)樣式 注意將z-index值設(shè)置大一些,防止其他元素層級比遮罩層高 boxDom.style.cssText = "display: none;position: absolute;left: 0;top: 0;width: 100%;height:100%;background-color: rgba(0,0,0,0.8);z-index:9999;"; imgDom.style.cssText = "margin-top:20px;width: 100%;"; // 追加或重設(shè)其樣式 if(this.options.boxDomStyle){ this.setStyle(boxDom,this.options.boxDomStyle); } if(this.options.imgDomStyle){ this.setStyle(imgDom,this.options.imgDomStyle); } imgDom.src = this.options.imgSrc; boxDom.appendChild(imgDom); this.boxDom = boxDom; // 初始化 this.init(); }; MaskShare.prototype = { init:function(){ this.event(); }, extend:function(obj,obj2){ for(var k in obj2){ obj[k] = obj2[k]; } return obj; }, setStyle:function(dom,objStyle){ for(var k in objStyle){ dom.style[k] = objStyle[k]; } }, event:function(){ var _this = this; this.targetDom.addEventListener("click",function(){ document.body.appendChild(_this.boxDom); _this.boxDom.style.display = "block"; // 打開遮罩層的回調(diào) _this.options.open&&_this.options.open(); },false); this.boxDom.addEventListener("click",function(){ this.style.display = "none"; // 關(guān)閉遮罩層的回調(diào) _this.options.close&&_this.options.close(); },false); } }; // 暴露方法 window.MaskShare = MaskShare; }(window,document));
使用示例:
MaskShare(".immediately",{ imgSrc:"../static/img/loading_icon.gif", boxDomStyle:{ opacity:".9" }, imgDomStyle:{ opacity:".8" }, open:function(){ console.log("show"); }, close:function(){ console.log("close"); } });
本次總結(jié)
此時(shí)再分析一遍,發(fā)現(xiàn)其還是有很多局限性,比如,如果不使用圖片用到的是一段文字呢,又該怎么辦?這些都是很大的問題,要寫出一個(gè)實(shí)用的插件,不僅僅技術(shù)需要過關(guān),思考還得全面性。所以這篇文章還只是剛剛開始,路還遠(yuǎn)著呢。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
js圖片滾動效果時(shí)間可隨意設(shè)定當(dāng)鼠標(biāo)移上去時(shí)停止
這篇文章主要介紹了js圖片滾動效果時(shí)間可隨意設(shè)定當(dāng)鼠標(biāo)移上去時(shí)停止,需要的朋友可以參考下2014-06-06js中eval()函數(shù)和trim()去掉字符串左右空格應(yīng)用
對于js中eval()函數(shù)的理解和寫一個(gè)函數(shù)trim()去掉字符串左右空格;對于js中eval()函數(shù)的理解是本人心得不一定正確,感興趣的朋友參考下,或許對你學(xué)習(xí)eval()函數(shù)有所幫助2013-02-02頁面下沉抖動效果-網(wǎng)站HTTP連接沒有效果-PC上有效果
頁面下沉抖動效果實(shí)現(xiàn)代碼,代碼少,功能還可以2008-05-05基于javascript實(shí)現(xiàn)簡單的抽獎(jiǎng)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于javascript實(shí)現(xiàn)簡單的抽獎(jiǎng)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03JavaScript實(shí)現(xiàn)把數(shù)字轉(zhuǎn)換成中文
這篇文章主要介紹了JavaScript實(shí)現(xiàn)把數(shù)字轉(zhuǎn)換成中文,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-06-06