jQuery编写插件

引言:

  在项目中不同页面经常要用到已经写好的交互,比如弹窗,比如下拉菜单,比如选项卡,比如删除...

此时如果每次都把代码copy一份无疑是一件比较麻烦并且无趣的事情,而且个人认为有些low了,我们可是要追寻

高大上的90后有为青年呢~可是该如何高大上呢?这时jQuery自定义插件开发来了,第一次听到插件开发觉得如此happy,

遂动手网上查找资料进行学习,如下,我用自己的语言将插件开发的程序步骤写出来,如有错误,欢迎指正。

 

1:jQuery插件开发分为类级别开发对象级别开发,因为类级别开发在真实项目中几乎不用,下面只对象级别进行探究。

 

a , 首先准备好一个架子,如下:

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

b, 这个架子是你编写插件代码要写入的空间,下面简单解释一下这个架子:

1)在jQuery环境下封装自己的插件,首先为避免与其他库的冲突,需要在插件的后面传一个jQuery参数进去,对应的函数里面的参数写入$

2)未避免出现问题,需在插件的前后加入分号(分号的增加并不会影响程序的运行)

 

2:再上一个架子

 

复制代码
;(function($){$.fn.tab = function(options){var defaults = {//各种参数,各种属性}var options = $.extend(defaults,options);this.each(function(){//各种功能});return this;}})(jQuery);
复制代码

这个架子是个什么东西呢?原来他是jQuery官方提供的一个标准化的开发模式,这里简单地介绍一下,不作详要说明,细节有兴趣的童鞋可以自己百度一下。

$.fn.tab  这个tab是你这个功能插件的名字,可任意改变名字,你自己知道就好了。

 

var options = $.extend(defaults,options);  这个是利用extend方法把 defaults对象的方法属性全部整合到 options里,

也就是options继承了defaults对象的方法以及属性。这个defaults和options名字是可以随意更改的,只要是满足js的命名规范。

 

this.each(function(){});就不介绍了,下面会通过一个实例表现它,这里你只需要知道他是实现功能代码的地方就可以啦~

至于return this; 就留到实例结束后面再说,这样做肯定是有原因的啦,别心急~

 

3:心细的girls or boys 肯定知道这个实例是什么啦,没错,是tab选项卡~

下面以tab选项卡的方式来explore这个插件的编写。

 

a: 先备好html,

复制代码
<div class="tab">

  <ul class="tab_nav">
    <li class="current">html</li>
    <li>css</li>
    <li>js</li>
  </ul>

  <div class="tab_content">
    <div style="display:block;">html</div>
    <div>css</div>
    <div>js</div>
  </div>
</div>

复制代码

b,页面是这样的:

 

c,ok,页面已经准备就绪,现在可以来写插件了,先上代码

复制代码
;(function($){
    $.fn.tab = function(options){var defaults = {//各种参数,各种属性}var options = $.extend(defaults,options);this.each(function(){//各种功能  //可以理解成功能代码var _this = $(this);_this.find('.tab_nav>li').click(function(){$(this).addClass('current').siblings().removeClass('current');var index = $(this).index();_this.find('.tab_content>div').eq(index).show().siblings().hide();});});return this;}})(jQuery);
复制代码

 

d,这个时候只需要看this.each下的功能代码,学过jQuery的同学都知道代码实现,这里主要就调用插件和配置参数这一块来进行探究。

 

4,在html代码里我们只需要:

<script>$(function(){$('.tab').tab();});
</script>

a,找到外部容器,并调用你所写的tab方法(就是你所写的插件名字):

$.fn.tab = function(options){}

 

b,敏感的童鞋肯定发现了功能代码里面的class元素以及事件是被写死的,要是我们在另外一个页面写的class和事件需求和这个插件的不同,

除了改插件源码之外这个插件就没法用用了,作为可扩展性的插件我们怎么可以把它写死呢?嗯哼?当然不可以啦~

 

好,就让我们一起来解决它吧:

1)请看下图:

 

2) 没错,就在这里配置它,我们可以看到哪些东西被写死了呢?下图:

3) 现在我们可以在default对象里面绘画你的小空间啦~见下图:

 

3)有的同学可能会疑惑为什么用options调用呢?其实上面已经说过啦,因为extends将default对象的属性以及方法都整合到了options里。

这时候只需要用options调用就可以了。

4)同样的如果需求是把click事件改为mouseover事件,此时我们需要用到on() or bind() ,这样就方便我们改事件参数啦,如下:

_this.find(options.tabNav).on('click',function(){}

此时只要在default里写入相应的代码

eventType:'click'

而后同样的变化

_this.find(options.tabNav).on(options.eventType,function(){}

5)此时因为需求是mouseover,这是就不需要改插件源码啦,直接在html里的js代码(or你自己的js总文件里)进行相应的变化就ok啦,如下:

1
2
3
4
5
6
7
8
9
<script>
        $(function(){
            $('.tab').tab({
                currentClass:'current123',
                eventType:'mouseover'
                                .....
            });
        });
</script>

*此时在这里更改class和事件就很方便啦,温馨提示,class改变虽好,可别忘了改对应的css样式名字哦,要成双成配呢~

 

好了,到这里基本上就要结束啦,哦,对了,return this;还没说呢,宝宝是不会忘记的~

5:jQuery最强大的特性之一莫过于链式操作啦,此时如果你在$('.tab').tab()后面追加操作,你会发现无法实现,如下:

$('.tab').tab().find('.tab_nav>li').css('background','red');

但是当你return this把对象返回出去的时候你会发现又重新实现了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webstorm中nodejs代码提示

preferences->languages&frameworks->Node.js and Npm中选择一个本地的node版本 preferences->languages&frameworks->JavaScript->Libraries 勾选node.js Core 回到代码

9012教你如何使用gulp4开发项目脚手架

本文将会介绍如何使用gulp4来搭建项目脚手架&#xff0c;如果您还在使用gulp3或更老的版本&#xff0c;您也以通过本文的一些思想将之前的项目进行完善&#xff0c;更新。如果gulp不是你们团队的重点&#xff0c;也可以移步我的另一篇文章:用 webpack 4.0 撸单页/多页脚手架 (j…

nodejs模块

nodejs模块遵循commonJS规范&#xff0c;但并不是完全实现规范&#xff0c;主要使用require引入模块、使用exports导出模块。 导出属性或方法 使用exports mouduleA.js&#xff1a; var say function(world){console.info("say: "world); }var sing function(wo…

Array.prototype.slice.call(arguments)

Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组&#xff0c;除了IE下的节点集合&#xff08;因为ie下的dom对象是以com对象的形式实现的&#xff0c;js对象与com对象不能进行转换&#xff09;如&#xff1a;1 var a{length:2,0:first,1:second}; 2 Ar…

动态内存分配导致内存泄漏之处

摘要&#xff1a;举了几个动态内存分配过程中&#xff0c;发生内存泄漏的例子 1. 分配了内存&#xff0c;却没有及时删除,导致泄漏 1: void doSomething() 2: { 3: int *pnValue new int; 4: } 2. 为指针变量分配了一个内存&#xff0c;然后又让指针变量指向其他的值,导致…

nodejs常用模块-url

URL nodejs中针对url的常用方法。 node下打印url&#xff0c;结果&#xff1a; 引入url模块 var url require(url) 1、parse方法 将url解析成对象&#xff0c;parse方法原型&#xff1a; url.parse(urlStr[, parseQueryString][, slashesDenoteHost]) 可传递三个参数…

常用的javascript设计模式

请坚持 什么是设计模式 百度百科&#xff1a; 设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问&#xff0c;设计模式…

express项目创建

1、安装项目生成器 cnpm i express-generator -g express4.0以后&#xff0c;express与express-generator包分离&#xff0c;全局使用express命令生成项目骨架时应该安装express-generator包。 2、生成项目骨架 express server 默认使用的是jade模板&#xff0c;使用ejs模…

设置Jexus开机启动

把jexus做成系统服务&#xff0c;就像windows服务一样&#xff0c;可以设置开机启动就可以了。 第一、进入目录 /lib/systemd/system/ 第二、新建文件 vi jexus.service 文件内容 [Unit] Descriptionjexus Afternetwork.target[Service] Typeforking ExecStart/usr/jexus/jw…

iOS警告-This block declaration is not a prototype

关于警告 我们定义一个不带参数的block,通常是如下的方式 1typedefvoid (^UpdateSwichBtnBlock)();在xcode9中会提示一个警告 12This block declaration is not a prototypeInsert ‘void解决方式可以是如下的几种 1typedefvoid (^UpdateSwichBtnBlock)(void);但是这样,很多第三…

mac环境mongodb安装与配置

一、安装 MAC环境安装mongodb有两种方式&#xff0c;一种方式是通过下载安装包&#xff0c;另一种方式是通过homebrew。 1、安装包方式 从mongodb官网可以下载MAC安装包&#xff1a;https://www.mongodb.com/download-center#community 或者使用curl下载 # 进入 /usr/loca…

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型...

以下为借鉴 var stack1 [], stack2[]; function push(node){stack1.push(node);}function pop(){if(stack2.length){return stack2.pop();}else{if(stack1.length){var len stack1.length;for(var i0;i<len;i){stack2.push(stack1.pop());}return stack2.pop()}else{retur…

使用CocoaPods导入百度地图SDK所遇到的坑

执行pod install遇到的问题:解决方安:百度了下,发现pod install命令被墙了,换成pod install --verbose --no-repo-update

NSTimer不准确与GCDTimer详解

NSTimer不准&#xff0c;scheduleTimer放在runloop里面&#xff0c;受runloop模式影响会不准// [NSTimer scheduledTimerWithTimeInterval:<#(NSTimeInterval)#> target:<#(nonnull id)#> selector:<#(nonnull SEL)#> userInfo:<#(nullable id)#> r…

flex的12个属性

容器&#xff08;父元素&#xff09;的属性&#xff1a; flex-direction属性决定主轴的方向 flex-wrap 属性决定项目在一行排不下的情况下是否换行 flex-flow flex-flow属性是flex-direction属性和flex-wrap属性的简写形式&#xff0c;默认值为row nowrap。 jstify-content …

vue图片懒加载插件vue-lazyload

插件地址&#xff1a;https://github.com/hilongjw/vue-lazyload demo&#xff1a;http://hilongjw.github.io/vue-lazyload/ 1、安装 cnpm i vue-lazyload -S 2、使用 main.js import VueLazyLoad from vue-lazyloadVue.use(VueLazyLoad, {error:/static/error.png,loadin…

IT需求过程管理

IT部门就是为其他业务、内勤部门提供信息化手段的&#xff0c;所以在实施信息化系统的时候首先要做的就是需求调研&#xff0c;但是针对于绝大多数业务部门的人员而言&#xff0c;信息系统是很不熟悉的&#xff0c;我们会经常听到这样的回复“这个应该很快就可以实现吧”、“当…

maskView与CAGradientLayer详解

#maskView基本原理 - png图片透明像素的原理 - maskView可类比于多张png图片的叠加遮罩&#xff0c;原理类似 - maskView是iOS8以上才有的&#xff0c;如果要考虑兼容低版本&#xff0c;用maskLayer替代 //使用maskView的情况 property (nonatomic, strong)UIImageView *addIma…

nodejs的启动方式

1、原始node命令 直接命令行中使用node命令 node xxx.js 或者安装nodemon&#xff0c;使用nodemon启动方便在开发阶段热部署代码改动 npm i nodemon -G nodemon xxx.js 2、webstorm方式 webstorm中&#xff0c;需要执行的文件的上&#xff0c;右键->run&#xff0c;右…

win7rc 序列号- 10/21之前

安装介绍&#xff1a;http://www.microsoft.com/china/windows/windows-7/download.aspx 注册获得序列号&#xff1a;http://technet.microsoft.com/zh-cn/evalcenter/dd353205.aspx?ITPIDmscomsc在 2009 年 10 月 21 日之前&#xff0c;您仍可以通过注册来获取产品密钥或查找…