当前位置: 首页 > news >正文

jQuery插件封装方法

转载自:https://www.jianshu.com/p/5196cb659fb6


如何编写jQuery插件

闭包


// 立刻执行函数

(function($){

    // code

})(jQuery);

参数说明

形参: $

实参: jQuery

闭包的作用

避免全局依赖

避免第三方破坏

兼容jQuery操作符’$'和jQuery;

开发方式

类级别组件开发

即是给jQuery命名空间下添加新的全局函数,也称为静态方法;

代码结构如下:


jQuery.pluginName = function() {

    // code

};

例如:$.Ajax(), $.extend()就是采用的类级别组件开发;

对象级别组件开发

即是挂在jQuery原型下的方法,这样通过选择器获取的jQuery对象实例也能共享改方法,称为动态方法;

代码结构如下:


$.fn.pluginName = function() {

    // code

};

其中:


    $.fn === $.prototype;

例如:addClass(),attr()等方法,需要创建实例来调用这些方法;


链式调用


// 例子

$('div').next().addClass()...

$.fn.plugin = function() {

    return this.each(function() {

    // code

    })

}

代码说明

return this: 返回当前对象,来维护插件的链式调用;
each: 循环实现每个元素的访问;

单例模式

创建对象的实例,存在单例模式;


$.fn.pluginName = function() {

    var me = $(this),

    instance = me.data('pluginName');

    if (!instance) {

        me.data("pluginName", (instance = new pluginName()));

    }

}

说明:
如果实例存在,则不再重新创建;
利用data方法来存放插件对象的实例;

jQuery框架基本结构

利用闭包创建一个自执行的函数

(function($) {
  // code
})(jQuery);

定义插件对象

var pluginName = (function() {
// code
// 返回插件对象
return pluginName ;
  
})();

在插件对象的原型链上定义用户配置项

$.fn.pluginName.defaults = {
  optionName: value
  ...
}; 

创建插件的实例对象

$.fn.pluginName = function() {
// 实现链式调用
 return this.each(function(options) {
    // 缓存this对象
    var me = this;
    var instance = me.data('pluginName');
   // 判断实例是否存在,不存在则创建对象,并将该对象及配置项传入
    if (!instance) {
         instance = new pluginName(me, options);
          // 存放实例
          me.data('pluginName', instance)
     }
    // 在外部可以通过$(selection).pageSwitch("init")
    if ($.type(options) === "String") {
                return instance[options]();
            }
    });
};

给对象添加属性和方法,及初始化插件

function pluginName(element, options) {
  // 深拷贝,合并对象
  this.settings = $.extend(true, $.fn.pluginName.defaults, options || []);
this.element = element;
// 初始化插件
this.init();
}

在插件的原型上定义方法,以便实例可以调用

pluginName.prototype = { fnName: function() {} };

案例代码


(function($) {

    // 私有方法

    var privateFun = function() {};

    // 合并对象等

    var pageSwitch = (function() {

        function pageSwitch(element, options) {

            // 设置为true深拷贝,合并对象

            this.settings = $.extend(true, $.fn.pageSwitch.default, options || {});

            this.element = element;

            // 初始化插件

            this.init()

        }

        // 在pageSwitch原型上定义方法,让实例可以调用这些方法

        pageSwitch.prototype = {

            // 功能方法

            init: function() {}

        };

        return pageSwitch;

    })();

    // 创建对象实例

    $.fn.pageSwitch = function(options) {

        // 实现链式调用

        return this.each(function() {

            var me = $(this),

                instance = me.data("pageSwitch");

            // 判断实例是否存在,不存在则创建对象,并将该对象及配置项传入

            if (!instance) {

                instance = new pageSwitch(me, options);

                // 存放实例

                me.data("pageSwitch", instance);

            }

            // 在外部可以通过$(selection).pageSwitch("init")

            if ($.type(options) === "String" || $.type(options) === "string") {

                return instance[options]();

            }

        });

    };

    // 配置参数

    $.fn.pageSwitch.default = {

        // 选择器

        selectors: {

            // 父层容器

            sections: '.sections',

            // 页面容器

            section: '.section',

            // 分页容器

            page: '.pages',

            // 分页选中时的高亮效果

            active: '.active'

        },

        // 页面开始的索引值

        index: 0,

        // 动画的效果

        easing: 'ease',

        // 动画执行的时间

        duration: 500,

        // 页面是否循环播放

        loop: false,

        // 是否进行分页处理

        pagination: true,

        // 是否触发键盘事件

        kerboard: true,

        // 全屏方向,横屏,竖屏

        direction: 'vertical',

        // 实现滑屏动画后执行的回调函数

        callback: ""

    };

    // 在插件内部初始化,但是这种写法需要在目标元素上添加data-pageSwitch

     $(function() {

        $("[data-pageSwitch]").pageSwitch();

    }) 

})(jQuery)

插件的初始化

外部初始化


<script>

$("#container").pageSwitch("init")

</script>

使用data-*
在目标元素上添加data-*属性,来初始化;

<div id="container" data-pageSwitch>
        <div class="sections">
            <div class="section" id="section0">
            </div>
            <div class="section" id="section1">
            </div>
            <div class="section" id="section2">
            </div>
            <div class="section" id="section3">
            </div>
        </div>
    </div>

相关文章:

  • npm ERR! gyp verb check python checking for Python executable “python“ in the PATH
  • 创新方法导论 # 笔记
  • C++编写DLL
  • 对Vuejs框架“渐进式”的理解
  • VMware workstation pro 没有开启虚拟机的时候关闭托盘图标
  • 数学建模 # 论文撰写技巧
  • 电子商务概论 # ch1 电子商务框架与模式
  • VSCode C语言中文乱码 解决方法
  • 机器学习笔记 # Ch1 绪论
  • 什么是Vuex
  • Docker快速上手指南
  • vc6代码转到VS8以后的CString::m_pchData undefined 的解决办法
  • ERROR in Template execution failed: ReferenceError: process is not defined
  • Failed to mount component: template or render function not defined.
  • electron-builder依赖包下载失败(winCodeSign)
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • docker容器内的网络抓包
  • emacs初体验
  • Javascript设计模式学习之Observer(观察者)模式
  • jquery ajax学习笔记
  • js ES6 求数组的交集,并集,还有差集
  • node-glob通配符
  • React16时代,该用什么姿势写 React ?
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于 Babel 的 npm 包最小化设置
  • 精彩代码 vue.js
  • 如何在GitHub上创建个人博客
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​虚拟化系列介绍(十)
  • ​一些不规范的GTID使用场景
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #Linux(权限管理)
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • ***检测工具之RKHunter AIDE
  • 、写入Shellcode到注册表上线
  • .Net 8.0 新的变化
  • .NET DataGridView数据绑定说明
  • .Net IE10 _doPostBack 未定义
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .project文件
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @Autowired和@Resource装配
  • [20190113]四校联考
  • [C#7] 1.Tuples(元组)