首頁  >  文章  >  web前端  >  原生Javascript插件開發實踐

原生Javascript插件開發實踐

高洛峰
高洛峰原創
2017-01-10 10:58:281120瀏覽

前言

之前公司設計的網站比較混亂,很多地方不統一,其中一個就是彈出層,導致這個原因是因為,公司的UI換了好幾個人,而他們每個人做出來的都不太一樣。最近公司開始整頓這個問題,對於統一的這種東西當然是做成一個模組,或者插件,而我打算做成插件。之所以寫這篇文章是因為,當寫完這個插件以後,發現其中有不少的理念,而這些理念我想把它總結一下,雖然這個插件並不復雜。

該怎麼架構?

對於架構這個概念,接觸的比較少,我的理解,架構就是解決未來可能會發生的事。

之前也封裝過一些插件,但後端嫌我封裝的太難用,於是分析其原因,發現之前寫的插件,該暴露的接口沒有,有些不需要傳的參數反而要傳。該暴露的介面沒有,這是因為我沒有按照未來的想法來寫插件,而往往這樣寫出來的插件就成了一次性用品。

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

基本雛形

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

   

把要寫的程式碼,封閉到一個自執行函數裡面,防止變數衝突,然後將這個建構子暴露給window對象,方便我們在外部去存取這個建構子。

效果需要做成如下的:

原生Javascript插件開發實踐

思考需要哪些參數

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

因此可以分析出,至少需要一個參數,也就是我們需要知道點擊誰彈出彈出層,另外我們還需要配置一些預設參數。

;(function(window,document){
 var MaskShare = function(targetDom,options){
  // 判断是用函数创建的还是用new创建的。这样我们就可以通过MaskShare("dom") 或 new MaskShare("dom")来使用这个插件了
  if(!(this instanceof MaskShare))return new MaskShare(targetDom,options);
  // 参数合并
  this.options = this.extend({
      // 这个参数以后可能会更改所以暴露出去
   imgSrc:"../static/img/coupon-mask_1.png"
  },options);
  // 判断传进来的是DOM还是字符串
  if((typeof targetDom)==="string"){
   this.targetDom = document.querySelector(targetDom);
  }else{
   this.targetDom = targetDom;
  }
  var boxDom = document.createElement("div");
  var imgDom = document.createElement("img");
  // 设置默认样式 注意将z-index值设置大一些,防止其他元素层级比遮罩层高
  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%;";
  // 追加或重设其样式
  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";
        // 打开遮罩层的回调
    _this.options.open&&_this.options.open();
   },false);
   this.boxDom.addEventListener("click",function(){
    this.style.display = "none";
        // 关闭遮罩层的回调
    _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");
 }
});

本次總結

此時再分析局限性,發現其還是有很多,比如,如果不使用圖片用到該文字的圖片是用到該文字呢怎麼辦?這些都是很大的問題,要寫出一個實用的插件,不只技術需要過關,思考還得全面性。所以這篇文章還只是剛開始,路還遠著呢。

以上就是本文的全部內容,希望本文的內容對大家的學習或是工作能帶來一定的幫助,同時也希望多多支持PHP中文網!

更多原生Javascript外掛程式開發實作相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn