原生Javascript插件開(kāi)發(fā)實(shí)踐
前言
之前公司設(shè)計(jì)的網(wǎng)站比較混亂,很多地方不統(tǒng)一,其中一個(gè)就是彈出層,導(dǎo)致這個(gè)原因是因?yàn)椋镜腢I換了好幾個(gè)人,而他們每個(gè)人做出來(lái)的都不太一樣。最近公司開(kāi)始整頓這個(gè)問(wèn)題,對(duì)于統(tǒng)一的這種東西當(dāng)然是做成一個(gè)模塊,或者插件,而我打算做成插件。之所以寫這篇文章是因?yàn)?,?dāng)寫完這個(gè)插件以后,發(fā)現(xiàn)其中有不少的理念,而這些理念我想把它總結(jié)一下,雖然這個(gè)插件并不復(fù)雜。
該怎樣架構(gòu)?
對(duì)于架構(gòu)這個(gè)概念,接觸的比較少,我的理解,架構(gòu)就是解決未來(lái)可能會(huì)發(fā)生的事。
之前也封裝過(guò)一些插件,但后端嫌我封裝的太難用,于是分析其原因,發(fā)現(xiàn)之前寫的插件,該暴露的接口沒(méi)有,有些不需要傳的參數(shù)反而要傳。該暴露的接口沒(méi)有,這是因?yàn)槲覜](méi)有按照未來(lái)的思想來(lái)寫插件,而往往這樣寫出來(lái)的插件就成了一次性用品。
所以這段時(shí)間,在寫插件之前都會(huì)事先思考清楚,這個(gè)插件都需要哪些參數(shù),而哪些又是必須傳的,哪些是可選的,哪些功能以后可能會(huì)用到,哪些是可以會(huì)更改的,這些都是必須考慮的,不然寫出來(lái)的插件肯定會(huì)有很多的問(wèn)題。
基本雛形
;(function(window,document){
var MaskShare = function(){
};
MaskShare.prototype = {};
window.MaskShare = MaskShare;
}(window,document));
把要寫的代碼,封閉到一個(gè)自執(zhí)行函數(shù)里面,防止變量沖突,然后將這個(gè)構(gòu)造函數(shù)暴露給window對(duì)象,方便我們?cè)谕獠咳ピL問(wèn)這個(gè)構(gòu)造函數(shù)。
效果需要做成如下的:

思考需要哪些參數(shù)
這個(gè)功能就是點(diǎn)擊某個(gè)元素,彈出一個(gè)遮罩層,點(diǎn)擊遮罩層將遮罩層去掉。
因此可以分析出,至少需要一個(gè)參數(shù),也就是我們需要知道點(diǎn)擊誰(shuí)彈出彈出層,另外我們還需要配置一些默認(rèn)參數(shù)。
;(function(window,document){
var MaskShare = function(targetDom,options){
// 判斷是用函數(shù)創(chuàng)建的還是用new創(chuàng)建的。這樣我們就可以通過(guò)MaskShare("dom") 或 new MaskShare("dom")來(lái)使用這個(gè)插件了
if(!(this instanceof MaskShare))return new MaskShare(targetDom,options);
// 參數(shù)合并
this.options = this.extend({
// 這個(gè)參數(shù)以后可能會(huì)更改所以暴露出去
imgSrc:"../static/img/coupon-mask_1.png"
},options);
// 判斷傳進(jìn)來(lái)的是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è)置大一些,防止其他元素層級(jí)比遮罩層高
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";
// 打開(kāi)遮罩層的回調(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)其還是有很多局限性,比如,如果不使用圖片用到的是一段文字呢,又該怎么辦?這些都是很大的問(wèn)題,要寫出一個(gè)實(shí)用的插件,不僅僅技術(shù)需要過(guò)關(guān),思考還得全面性。所以這篇文章還只是剛剛開(kāi)始,路還遠(yuǎn)著呢。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名器
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
javascript實(shí)現(xiàn)的listview效果
javascript實(shí)現(xiàn)的listview效果...2007-04-04
Ionic 2 實(shí)現(xiàn)列表滑動(dòng)刪除按鈕的方法
這篇教程將展示如何使用Ionic2添加一個(gè)簡(jiǎn)單的刪除按鈕到列表,當(dāng)用戶滑動(dòng)列表項(xiàng)到左邊的時(shí)候。這是一個(gè)處理刪除列表數(shù)據(jù)時(shí)候常用的模式,具體內(nèi)容大家通過(guò)本文學(xué)習(xí)吧2017-01-01
微信小程序使用第三方庫(kù)Underscore.js步驟詳解
大家都知道Underscore.js是一個(gè) JavaScript 工具庫(kù),它提供了一整套函數(shù)式編程的實(shí)用功能,但是沒(méi)有擴(kuò)展任何 JavaScript 內(nèi)置對(duì)象。那么這篇文章我們就來(lái)學(xué)習(xí)下微信小程序如何使用第三方庫(kù)Underscore.js,有需要的可以參考學(xué)習(xí)。2016-09-09
JS中Generator函數(shù)與async函數(shù)用法介紹
javascript中經(jīng)常會(huì)用到異步編程,在ES6之后我們使用的?Generator函數(shù)、async函數(shù)、promise都是我們異步編程的一大助力,這里我們主要講解Generator、async函數(shù),并且簡(jiǎn)介他們之間的一些聯(lián)系,本篇文章會(huì)帶著一些簡(jiǎn)易案例,方便大家理解使用2023-06-06
原生js實(shí)現(xiàn)回復(fù)評(píng)論功能
本文主要分享了原生js實(shí)現(xiàn)回復(fù)評(píng)論功能的示例代碼。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01
分享15個(gè)JavaScript的重要數(shù)組方法
這篇文章主要介紹了分享15個(gè)JavaScript的重要數(shù)組方法,數(shù)組方法的重要一點(diǎn)是有些是可變的,有些是不可變的。在決定針對(duì)特定問(wèn)題使用哪種方法時(shí),務(wù)必牢記,下文就來(lái)分享重要數(shù)組方法,需要的小伙伴可以參考一下2022-05-05
JavaScript中的常見(jiàn)錯(cuò)誤與異常處理分析
這篇文章主要為大家信息介紹了JavaScript中的常見(jiàn)錯(cuò)誤與異常處理的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01

