在进行开发jQuery插件前,首先要了解一些知识:

1、闭包

1.1、闭包的作用:

· 避免全局依赖

· 避免第三方破坏

· 兼容jQuery操作符'$'和jQuery

1.2、闭包的形式

	(function(arg){...})(param)

相当于定义了一个参数为arg的匿名函数(function(arg){...}),并且将param作为参数来调用这个匿名函数。

在调用函数function(arg){...}时,是在函数后面写上括号和实参(param)的,而由于操作符的优先级,函数本身也需要用括号(function(arg){...})

(function($){...})(jQuery)是一样的,之所以只在形参使用$,是为了不与其他库冲突,所以实参用jQuery。

另外,(function($){...})(jQuery)用来定义一些需要预先定义好的函数,用来存放开发插件的代码,执行其中的代码时DOM不一定存在。而$(function(){...})则是用来在DOM加载完成之后运行/执行那些预先定义好的函数,用来存放操作DOM对象的代码,执行其中代码时DOM对象已存在。

2、jQuery插件的开发方式

2.1、类级别组件开发

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

	jQuery.myPlugin = function(){
// do something
}

例:$.Ajax()、$.extend()

2.2、对象级别组件开发

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

	$.fn.myPlugin = function(){		//这里$.fn === $.prototype
// do something
}

例:addClass(),attr()等,都需要创建实例来调用

3、链式调用

使用例子:$('div').next().addClass(...)...

与上面介绍对象级别组件开发$.fn.myPlugin = function(){...}组合的实现:

	$.fn.myPlugin = function(){
return this.each(function(){
// do something
})
}

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

4、单例模式

使用单例模式是为了只生成一个实例,可以避免过多的实例不好管理,比如一个人售票还好,再多一个人售票就会产生进程之间的一系列问题。

1	$.fn.myPlugin = function(){
2 var me = this,
3 instance = me.data('myPlugin');
4
5 //如果实例存在则不再重新创建实例
6 //利用data()方法来存放插件对象的实例
7 if(!instance){
8 me.data('myPlugin',(instance = new myPlugin()));
9 }
10 }

其中,data()方法向被选元素附加数据(第8行),或者从被选元素获取数据(第3行)。

5、开发jQuery插件

基本结构为:

(function($){

	//定义插件myPlugin
var myPlugin = (function(){
//定义每个实例对象各自特有的属性和方法
function myPlugin(element,options){...} //定义所有实例对象共有的属性和方法
myPlugin.prototype={...} return myPlugin;
})(); //使myPlugin能被通过选择器获取的jQuery对象实例使用,并实现链式调用
$.fn.myPlugin=function(options){
return this.each(function(){
var me = this,
instance = me.data('myPlugin'); if(!instance){
me.data('myPlugin',(instance = new myPlugin()));
} })
}; //一般情况下,允许别人在使用我们开发的插件时修改一些默认的属性变量以达到不同的实现效果
//例如:我们开发一个全屏切换的插件,默认情况下为竖直变换,但允许用户使用是改为水平切换
$.fn.myPlugin.defaults={
direction:'vertical', //默认情况下为竖直变换
...
...
}; //使DOM元素调用插件方法实现效果
$(function(){
$('DOM元素').myPlugin();
}); })(jQuery);

一个全屏切换插件的例子。

以上为个人见解,望指教。

最新文章

  1. git stash -u 添加新文件
  2. JAVA调用动态链接库DLL之JNative学习
  3. gethostbyname 亲测可用
  4. (工具)source insight高速增加时间代码
  5. 关于sping quartz定时执行理解与思考
  6. 学习整理与细化(2)——HTML VS XHTML
  7. python 人工智能资源推荐
  8. windows上安装nodejs,升级npm,安装webpack指南
  9. ArcGIS API for JavaScript 入门教程[5] 再讲数据——Map类之底图与高程
  10. ELK平台搭建(下)
  11. 在git服务器上创建项目过程及遇到的问题
  12. 创建Java多线程的两种方式和线程异常
  13. Android Color颜色代码
  14. 自学工业控制网络之路2.2-PROFINET
  15. Linux服务器---流量监控MRTG
  16. [转]JS组件系列——表格组件神器:bootstrap table
  17. Mr Cao 的提问
  18. Devexpress VCL Build v2013 vol 14.1.5 发布
  19. Linux下堆漏洞的利用机制
  20. mysql data_add data_sub

热门文章

  1. 浅析Java源码之HashMap
  2. AutoMapper之集合和数组映射
  3. windows下使用python操作redis(Visual Studio Code)
  4. C# 往线程里传参数的方法总结
  5. [日常] Go语言圣经--作用域,基础数据类型,整型
  6. Java-函数式编程(一)初识篇
  7. 使用memcache对wordpress优化,提速
  8. TCP 回顾
  9. php中的static静态变量
  10. js-ES6学习笔记-函数的扩展