在编写插件之前,大家要先了解做插件的几个要点:

插件需要满足的条件

一个可复用的插件需要满足以下条件:

  1. 插件自身的作用域与用户当前的作用域相互独立,也就是插件内部的私有变量不能影响使用者的环境变量;
  2. 插件需具备默认设置参数;
  3. 插件除了具备已实现的基本功能外,需提供部分API,使用者可以通过该API修改插件功能的默认参数,从而实现用户自定义插件效果;
  4. 插件需提供监听入口,及针对指定元素进行监听,使得该元素与插件响应达到插件效果;
  5. 插件支持链式调用。

以下便针对这几点要求进行逐个讲解,以实现自定义的插件。

1、插件全局函数

实现私有作用域,最好的办法就是使用闭包。可以把插件当做一个函数,插件内部的变量及函数的私有变量,为了在调用插件后依旧能使用其功能,闭包的作用就是延长函数(插件)内部变量的生命周期,使得插件函数可以重复调用,而不影响用户自身作用域。

故需将插件的所有功能写在一个立即执行函数中:

  1. (function () {
  2. //插件所有功能都写在这个函数下
  3. })();

2、插件默认参数

插件的主要功能可以总结至几个关键参数,通过这几个关键参数即可修改插件的主要功能,也是第三步API设置的关键参数。

将默认参数放置在全局函数的最前面,参数变量名为options,通过对象字面量进行赋值:

  1. var options = {
  2. key1: para1,
  3. key2: para2,
  4. key3: para3,
  5. ...
  6. keyn: paran
  7. }

key即为可以插件变量名字,para为该变量对应的值。如我需要编写一个设置颜色的插件,默认颜色为黑色,option应为:

  1. var options = {
  2. color: '#333333'
  3. }

编写功能部分时调用方式:options.color

3、插件API、参数设置和监听

因为API指向的是使用者,故需要在用户调用插件时将API暴露给用户,因用户API时是通过插件提供的名字进行使用,故将API设置为Object类型,用户就可以通过调用API的key进行使用,具体的代码如下:

  1. var api = {
  2. config: function(ops) {
  3. //....
  4. return this;
  5. },
  6. listen: function listen(elem) {
  7. //...
  8. return this;
  9. },
  10. feature1: function() {
  11. //...
  12. },
  13. feature2: function() {
  14. //...
  15. }
  16. }
  17. this.pluginName = api;

上面提供了api的写法示范,该api提供了config以设置自定义参数,listen为插件监听的dom操作,feature为插件的主要功能,使用options参数的功能都要写在api下,注意api.configapi.listen两个函数都应该在最后返回this,以便实现插件的链式调用。

有了上面的框架,针对config设置函数的写法就有了明确的要求:在用户没有传入自定义函数时,默认使用上一节options中的参数,如果用户有设置config参数,使用用户自定义参数:

  1. config: function(opts) {
  2. //没有参数传入,直接返回默认参数
  3. if (!opts) return options;
  4. //有参数传入,通过key将options的值更新为用户的值
  5. for (var key in opts) {
  6. options[key] = opts[key];
  7. }
  8. return this;
  9. }

针对元素的监听listen,需要对所有符合条件的dom元素进行监听:

  1. listen: function listen(elem) {
  2. //这里通过typeof设置监听的元素需为字符串调用,实际可根据需要进行更改
  3. if (typeof elem === 'string') {
  4. //这里使用ES5的querySelectorAll方法获取dom元素
  5. var elems = document.querySelectorAll(elem),
  6. i = elems.length;
  7. //通过递归将listen方法应用在所有的dom元素上
  8. while (i--) {
  9. listen(elems[i]);
  10. }
  11. return
  12. }
  13. //在这里,你可以将插件的部分功能函数写在这里
  14. return this;
  15. }

在config和listen这两个最基本的API完成后,需要将API与插件的名字结合起来:

  1. this.pluginName = api;

则最基本的API如下:

  1. var api = {
  2. //插件参数设定
  3. config: function(opts) {
  4. if (!opts) return options;
  5. for (var key in opts) {
  6. options[key] = opts[key];
  7. }
  8. return this;
  9. },
  10. //插件监听
  11. listen: function listen(elem) {
  12. if (typeof elem === 'string') {
  13. var elems = document.querySelectorAll(elem),
  14. i = elems.length;
  15. while (i--) {
  16. listen(elems[i]);
  17. }
  18. return
  19. }
  20. //插件功能函数可以写在这
  21. return this;
  22. }
  23. }
  24. //将API赋值给插件名字
  25. this.pluginName = api;

则用户使用该插件时,调用方式为:

  1. pluginName.listen('#demo');

如需要自定义参数:

  1. pluginName.config({
  2. key: 'para'
  3. }).listen('#demo');
  4. //因为config和listen已经返回this,所有可以这样调用:
  5. pluginName.listen('#demo').config({
  6. key: 'para'
  7. });
  8. //还可以这样调用:
  9. pluginName.config({
  10. key: 'para'
  11. })
  12. .listen('#demo');

JavaScript插件编写指南的更多相关文章

  1. 原生JavaScript插件编写指南(转载)

    原生js开发指南 https://www.jianshu.com/p/e65c246beac1 在jQuery大量使用的环境下,目前网上的众多jQuery插件也能基本满足要求,但是在项目具体需求下,有 ...

  2. javascript插件编写小结

    写JS插件,最好是先通过HTML方式将展示结果显示出来,然后再封装成JS插件,将其画出来.JS模板如下: (function($){ $.fn.fnName = function(options){ ...

  3. Blender插件编写指南

    前言 Blender插件是Blender的利器, 用户可以使用各种插件扩充Blender的功能. Blender Python插件以bpy.props, bpy.types.Operator, bpy ...

  4. 封装js插件学习指南

    封装js插件学习指南 1.原生JavaScript插件编写指南 => 传送门 2.如何定义一个高逼格的原生JS插件 =>传送门 3.手把手教你用原生JavaScript造轮子 =>  ...

  5. javascript&&jquery编写插件模板

    javascrpt插件编写模板 这里不分享如何编写插件,只留一个框架模板,使用面向对象的形式进行编写,方便管理 ;(function(window,document){ function FnName ...

  6. Bookmarklet编写指南

    作者: 阮一峰 日期: 2011年6月11日 前一段日子,我写了两个Bookmarklet----"短网址生成"和"短网址还原". 它们用起来很方便,除了我本人 ...

  7. Bootstrap JavaScript插件

      在bs3.X中,提供了12种JavaScript插件,分别是:动画过渡(Transition).模态弹窗(Modal).下拉菜单(Dropdown).滚动侦测(Scrollspy).选项卡(Tab ...

  8. jQuery插件编写及链式编程模型小结

    JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我们就来看看如何把我们常用的功能做出JQu ...

  9. 初学者--bootstrap(五)JavaScript插件(上)----在路上(6)

    jQuery 插件为 Bootstrap 的组件赋予了“生命”.可以简单地一次性引入所有插件,或者逐个引入到你的页面中. 一:首先要确认的是,单个还是全部引入: JavaScript 插件可以单个引入 ...

随机推荐

  1. maven无法下载依赖jar包—几种仓库的区别

    一.问题背景 最近这两天,感觉自己智商急剧退化,到了自己都捉急的地步,呃,有必要记录下来,以后智商被人甩几条街的时候,看看这篇文字,找找灵感也是好的! 这个项目呢,是用IDEA开发的,我一切都弄好了, ...

  2. MacPorts的安装和使用

    1.安装 MacPorts的官方网站:http://www.macports.org/install.php 有dmg安装和源代码安装两种方式,下载dmg格式一步步安装即可 2.使用 更新ports ...

  3. NOJ——1665夜神的思考(YY+组合问题+分类讨论)

    [1665] 夜神的思考 时间限制: 1000 ms 内存限制: 65535 K 问题描述 最近夜神对二进制很感兴趣,于是他每次看到一串只包含1和0的字符串的时候就会想,这串字符串有多少子串是含有k个 ...

  4. 【bzoj1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 SA+二分

    Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个“模式”. John的牛奶按质 ...

  5. 【bzoj1406】 AHOI2007密码箱 数论

    在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能破解密码就能打开箱子,而箱子背面刻着的古代图标,就是对密码的提示.经过艰苦的破译,小可可发现,这些图标表示一个数 ...

  6. hdu 1695 容斥原理或莫比乌斯反演

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. 剑指Offer 二进制中一的个数

    链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8 来源:牛客网 public class So ...

  8. 洛谷P1120 小木棍(sticks数据加强版)

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...

  9. 【NOIP2016】换教室(DP,期望)

    题意: 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课程 ...

  10. 模仿手机qq空间头部向上滚动颜色加深

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...