原生Javascript插件开发实践


Posted in Javascript onJanuary 09, 2017

前言

之前公司设计的网站比较混乱,很多地方不统一,其中一个就是弹出层,导致这个原因是因为,公司的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");
 }
});

本次总结

此时再分析一遍,发现其还是有很多局限性,比如,如果不使用图片用到的是一段文字呢,又该怎么办?这些都是很大的问题,要写出一个实用的插件,不仅仅技术需要过关,思考还得全面性。所以这篇文章还只是刚刚开始,路还远着呢。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
Jun 26 Javascript
JavaScript关于select的相关操作说明
Jan 13 Javascript
js 获取Listbox选择的值的代码
Apr 15 Javascript
javascript 设计模式之单体模式 面向对象学习基础
Apr 18 Javascript
js getElementsByTagName的简写方式
Jun 27 Javascript
原生javascript实现简单的datagrid数据表格
Jan 02 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
Oct 27 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
Jan 15 Javascript
JavaScript拖动层Div代码
Mar 01 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
Apr 22 Javascript
详解使用vue实现tab 切换操作
Jul 03 Javascript
React Fragment介绍与使用详解
Nov 11 Javascript
Angular下H5上传图片的方法(可多张上传)
Jan 09 #Javascript
详解网站中图片日常使用以及优化手法
Jan 09 #Javascript
jQuery实现表格元素动态创建功能
Jan 09 #Javascript
input输入密码变黑点密文的实现方法
Jan 09 #Javascript
微信小程序 css使用技巧总结
Jan 09 #Javascript
详解Jquery Easyui的验证扩展
Jan 09 #Javascript
Javascript blur与click冲突解决办法
Jan 09 #Javascript
You might like
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
php强制运行广告的方法
2014/12/01 PHP
php递归遍历多维数组的方法
2015/04/18 PHP
php中各种定义变量的方法小结
2017/10/18 PHP
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
Python操作CouchDB数据库简单示例
2015/03/10 Python
Python httplib模块使用实例
2015/04/11 Python
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
python挖矿算力测试程序详解
2019/07/03 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
教育专业个人求职信
2013/12/02 职场文书
生物技术专业毕业生求职信范文
2013/12/14 职场文书
家长评语大全
2014/01/22 职场文书
浙大毕业生自荐信
2014/01/26 职场文书
委托书样本
2014/04/02 职场文书
白血病捐款倡议书
2014/05/14 职场文书
合作意向书
2014/07/30 职场文书
党代会心得体会
2014/09/04 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android