国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

原生Javascript插件開發(fā)實(shí)踐

2019-11-19 17:53:15
字體:
供稿:網(wǎng)友

前言

之前公司設(shè)計的網(wǎng)站比較混亂,很多地方不統(tǒng)一,其中一個就是彈出層,導(dǎo)致這個原因是因?yàn)椋镜腢I換了好幾個人,而他們每個人做出來的都不太一樣。最近公司開始整頓這個問題,對于統(tǒng)一的這種東西當(dāng)然是做成一個模塊,或者插件,而我打算做成插件。之所以寫這篇文章是因?yàn)椋?dāng)寫完這個插件以后,發(fā)現(xiàn)其中有不少的理念,而這些理念我想把它總結(jié)一下,雖然這個插件并不復(fù)雜。

該怎樣架構(gòu)?

對于架構(gòu)這個概念,接觸的比較少,我的理解,架構(gòu)就是解決未來可能會發(fā)生的事。

之前也封裝過一些插件,但后端嫌我封裝的太難用,于是分析其原因,發(fā)現(xiàn)之前寫的插件,該暴露的接口沒有,有些不需要傳的參數(shù)反而要傳。該暴露的接口沒有,這是因?yàn)槲覜]有按照未來的思想來寫插件,而往往這樣寫出來的插件就成了一次性用品。

所以這段時間,在寫插件之前都會事先思考清楚,這個插件都需要哪些參數(shù),而哪些又是必須傳的,哪些是可選的,哪些功能以后可能會用到,哪些是可以會更改的,這些都是必須考慮的,不然寫出來的插件肯定會有很多的問題。

基本雛形

;(function(window,document){ var MaskShare = function(){ }; MaskShare.prototype = {}; window.MaskShare = MaskShare;}(window,document));

把要寫的代碼,封閉到一個自執(zhí)行函數(shù)里面,防止變量沖突,然后將這個構(gòu)造函數(shù)暴露給window對象,方便我們在外部去訪問這個構(gòu)造函數(shù)。

效果需要做成如下的:

思考需要哪些參數(shù)

這個功能就是點(diǎn)擊某個元素,彈出一個遮罩層,點(diǎn)擊遮罩層將遮罩層去掉。

因此可以分析出,至少需要一個參數(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")來使用這個插件了  if(!(this instanceof MaskShare))return new MaskShare(targetDom,options);  // 參數(shù)合并  this.options = this.extend({      // 這個參數(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é)

此時再分析一遍,發(fā)現(xiàn)其還是有很多局限性,比如,如果不使用圖片用到的是一段文字呢,又該怎么辦?這些都是很大的問題,要寫出一個實(shí)用的插件,不僅僅技術(shù)需要過關(guān),思考還得全面性。所以這篇文章還只是剛剛開始,路還遠(yuǎn)著呢。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持武林網(wǎng)!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 滦南县| 天峨县| 安康市| 桓台县| 上思县| 洮南市| 莲花县| 都江堰市| 平塘县| 垣曲县| 阿巴嘎旗| 陵川县| 泰顺县| 天台县| 呼玛县| 宜兰县| 沧州市| 任丘市| 沅江市| 多伦县| 涟源市| 府谷县| 克什克腾旗| 资溪县| 尼木县| 马公市| 突泉县| 大厂| 祥云县| 隆林| 宁强县| 墨玉县| 洛隆县| 会理县| 北海市| 河北区| 大姚县| 舞阳县| 防城港市| 乌兰浩特市| 苗栗县|