jQuery 插件开发(1)
JavaScript 是一门混乱的语言,好的特性和坏的特性混杂在一起。而不同浏览器对标准的解析不一致,使得这门语言更加混乱,在这种情况下遵循最佳实践有诸多好处,至少不会掉入坑里。所以就有了《JavaScript: The Good Parts》这类书专门教最佳实践。可惜读完后再去看别人的 js 代码,会发觉几乎没有谁做得很标准。
一、jQuery 插件的类别
在 jQuery 中要使用一个插件,一般有两种形式:
- 类级别。例如
$.myPlugin()
- 对象级别。例如
$('#node').myPlugin()
类级别插件可以理解为拓展 jQuery 类,即给 jQuery 添加新的全局函数,典型的例子就是 $.ajax()
这个函数。jQuery 的全局函数就是属于 jQuery 命名空间的函数。另一种是对象级别的插件,即作用于指定的 jQuery 对象,典型的例子 $('.msg').show()
。
二、类级别 jQuery 插件的开发
1. 原始写法
一般在项目中我们会引入一个 js 文件,里面存放了所有的 js 代码。
<script type="text/javascript" src="http://www.lovelucy.info/all.js"></script> |
只要写一些函数简单地放在文件里,就算是一个模块,直接调用就行了。
function m1(){ |
这种方法缺陷很明显,就是污染了全局空间,无法保证不与其他模块发生变量名冲突,而且方法成员之间看不出直接关系。
2. 扩展写法
使用 jQuery.extend(object) 来扩展 jQuery 类本身,可以理解为 jQuery 添加静态方法。
$.extend({ |
3. 简单写法
给 jQuery 添加一个全局函数,只需如下定义
jQuery.foo = function() { |
这样就能直接用了:jQuery.foo()
或者 $.foo()
。
4. 使用命名空间
虽然上面的 2 种写法相对于原始写法要干净很多,减少了在全局空间冲突的概率,但是在 jQuery 命名空间中,仍然不可避免某些函数或变量名可能和其他 jQuery 插件冲突。因此我们习惯再封装一层,将一些方法封装到另一个自定义的命名空间。
jQuery.myPlugin = { |
采用命名空间的函数仍然是全局函数,使用独立的插件名我们可以避免命名空间内函数的冲突。
三、对象级别 jQuery 插件的开发
大部分 jQuery 插件都是对象级别的,开发一个对象级别插件会遇到闭包这个概念,简单起见先只看闭包的表现形式
(function($){ |
1. 扩展写法
给 jQuery 对象添加方法,就是对 jQuery.prototype 进行扩展,为 jQuery 类添加成员方法,需要用到jQuery.fn.extend(object);
。下面是一个例子:
$.fn.extend({ |
2. 通用写法
对象级别的插件也可以这样定义 $.fn.myPlugin = function(){}
,同样的,和类级别相比多了一个 fn。
一个通用的对象级别插件框架——
(function($){ |
$.extend(defaults, options)
通过合并 defaults 和 options 来扩展默认参数,实现插件接受外部 options 参数的功能。于是我们就可以见到这样的用法:
$('#myDiv').hilight({ |
3. 改进的通用写法
上面代码的一种改进是暴露插件的默认设置。这可以让插件的使用者更容易用较少的代码覆盖和修改插件。
(function($){ |
于是我们就可以见到这样使用的
$.fn.hilight.defaults.foreground = 'blue'; |
覆盖默认的配置就只需要调用一次,而不必在每次调用插件时都传递参数。是否需要传递参数,在不同的场景下可以灵活处理,两者的使用可以结合起来。
更高级的插件写法还包括暴露一些函数给使用者,让他们可以覆盖。另一方面,也可以保持私有函数的私有性。具体的代码这里就不多赘述了。学习的最好方式就是阅读别人的插件代码。
jQuery插件的种类
编写插件的目的是给已有的一系列方法或函数做一个封装,以便在其他地方重复使用,方便后期维护和提高开发效率。jQuery的插件主要分为以下三种类型:
1.封装对象方法的插件
这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是一种最常见的插件。绝大部分的jQuery插件都是封装对象方法的插件。此类插件可以发挥出jQuery的强大优势。
2.封装全局函数的插件
可以将独立的函数加到jQuery命名空间之下。例如noConflict()方法是jQuery内部作为全局函数的插件附加到内核上去的。
3.选择器插件
极少数的情况下,需要用到选择器插件。虽然jQuery的选择器十分强大,但还是会需要扩充一些适用的选择器。
jQuery插件的基本要点
(1)jQuery插件的文件名推荐命名为jquery.[插件名].js,以免和其他JavaScript库插件混淆。
(2)所有对象方法都应该附加到jQuery.fn对象上,所有的全局函数都应当附加到jQuery对象本身上。
(3)插件内部,this指向的是当前通过选择器获取的jQuery对象,对于一般的方法,内部的this指向的是DOM元素。
(4)可以通过this.each来遍历所有元素。
(5)所有的方法或函数插件,都应当以分号结尾,否则压缩的时候可能出现问题。为了更稳妥些,甚至可以在插件头部先加上一个分号,以免他人的不规范的代码给插件带来影响。
(6)通常情况下,插件应该返回一个jQuery对象,以保证插件能够链式操作。
(7)避免在插件内部使用$作为jQuery对象的别名,而应使用完整的jQuery来表示,这样可以避免冲突。当然可以用笔包这种技巧来回避这个问题,使插件内部继续使用$作为jQuery的别名。常见的jQuery插件的结构如下:
- //为了更好的兼容性,开始前加分号
- ;(function($){
- /*这里放置代码,可以使用$作为jQuery对象别名*/
- })(jQuery);//这里将jQuery作为实参传递给匿名函数
jQuery插件的机制
jQuery提供了两个用于扩展jQuery功能的方法,即jQuery.fn.extend()方法和jQuery.extend()方法。这两个方法都接受一个参数,类型为Object。Object的”键/值对”分别代表“函数方法名/函数主体”。
1.jQuery.extend()
可以用于扩展后两种插件。该方法是对jQuery对象的扩展,可以理解为静态方法,不需要实例jQuery就可以使用,代码如下:
- jQuery.extend({
- add : function(a, b){
- return a + b;
- }
- });
- alert($.add(2, 3)); //7
jQuery.extend()方法除了可以用于扩展jQuery对象之外,还能用于扩展已有的Object对象。如合并settings对象和options对象,修改并返回settings对象,代码如下:
- var defaults = {name:'ZhangSan', sex:'男', age:20};
- var options = {name:'LiSi', age:22};
- var newOpts = $.extend(defaults, options);
- //结果newOpts = {name:'LiSi', sex:'男', age:22};
2.jQuery.fn.extend()
用于扩展之前提到的三种类型插件中的第一种。该方法是对jQuery元素的扩展,只能用在jQuery元素上,可以理解为普通方法,即获取了相应的jQuery对象才能调用。定义插件时需要返回this,以支持jQuery的链式操作,代码如下:
- $.fn.extend({
- color : function(c){
- this.css("color", c);
- }
- });
- alert($('#test').color('red'));
编写jQuery插件
常见jQuery插件的结构如下:
- ;(function($){
- //这里编写插件的代码,可以继续使用$作为jQuery的别名
- //定义一个局部变量foo,仅方法内部可以访问
- var foo;
- var bar = function(){
- /*
- 在匿名函数内部的函数都可以访问foo,即使在外部调
- 用bar()的时候,也可以在bar()的内部访问foo,但
- 无法在匿名函数外部直接访问foo
- */
- }
- /*
- 下面的语句让匿名函数内部的函数bar()逃逸到全局可访问的范围,
- 这样就可以在匿名函数的外部通过$.BAR()来访问内部定义的函数
- bar(),并且内部函数bar()也能访问foo
- */
- $.BAR = bar;
- })(jQuery);
1.封装jQuery对象方法的插件
这里主要是为了说明编写jQuery插件的过程和注意事项,就以一个简单的实例(设置和获取颜色)来说明。
1)插件功能说明
(1)设置匹配元素的颜色。
(2)获取匹配元素的颜色。
2)将该插件按规范命名为jquery.color.js。
3)在JS文件中搭好框架,由于是对jQuery对象的方法扩展,因此采用扩展插件方法jQuery.fn.extend()来编写,代码如下:
- ;(function($){
- $.fn.extend({
- color : function(c){
- //这里写插件的代码
- }
- });
- })(jQuery);
4)编写插件的实现代码如下:
- ;(function($){
- $.fn.extend({
- color : function(c){
- if(c == undefined){//如果不传值,则获取字体颜色
- return this.css("color");
- } else { //如果传值,则设置字体颜色
- return this.css("color", c);
- }
- }
- });
- })(jQuery);
这样,一个简单的jQuery插件算是完成了。
2.封装全局函数的插件
这类插件是在jQuery命名空间内部添加一个函数。这类插件只是普通的函数。
例如新增两个函数,分别用于去除左侧和右侧的空格,代码如下:
- ;(function($){
- $.extend({
- ltrim : function(text){
- return (text || "").replace(/^\s+/g, "");
- },
- rtrim : function(text){
- return (text || "").replace(/\s+$/g, "");
- }
- //(text || "")部分是用于放置传递进来的text这个字符串变量是未定义的状态
- //当text是undified,则返回字符串"",否则返回字符串text
- });
- })(jQuery);
jQuery 插件开发(1)的更多相关文章
- JavaScript学习笔记(四)——jQuery插件开发与发布
jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...
- JavaScript学习总结(四)——jQuery插件开发与发布
jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...
- jQuery插件开发精品教程,让你的jQuery提升一个台阶
要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...
- jquery插件开发
jQuery是一个封装的很好的类,比如我们用语句$("#btn1") 会生成一个 jQuery类的实例. 一.jQuery插件开发注意要点 1.使用闭包,避免全局依赖,避免第三方破 ...
- jQuery插件开发(溢出滚动)
声明:此程序仅针对手机端,简单的封装一个插件,意在记载插件的开发过程,如有错误及不足之处,还望即时指出. 移动开发的时候,我们经常会遇到滑动事件,众所周知手机端滑动主要依靠touch事件.最近接连遇到 ...
- 从零开始学jQuery插件开发
http://www.w3cfuns.com/notes/19462/ec18ab496b4c992c437977575b12736c.html jQuery 最成功的地方,是它的可扩展性,通过吸引了 ...
- jquery插件开发继承了jQuery高级编程思路
要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...
- jQuery插件开发(转)
jQuery插件开发全解析 jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命 ...
- jQuery插件开发的两种方法及$.fn.extend的详解
jQuery插件开发分为两种: 1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.ex ...
- Jquery插件开发学习
一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#"),$("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人 ...
随机推荐
- black hack
黑客技 关于在不知道系统的情况下 long long 的使用时 那么 #ifdef WIN32 #define LL "%I64d" #else #define LL " ...
- Python 集成开发环境(IDE)
DiscoverSDK网站进行了一次调查 - 什么是最好的Python IDE,这里是调查的结果 Python是一种非常流行的开源编程语言.得益于无尽的模块选项,Python今天广泛用于脚本 ...
- 这算是CSS的bug吗?
移动端web开发越来越火,同时移动端适配也是一个很让人头疼的事情,你不能让一个同样大小的元素在不同的设备上都显示一样大小.(iphone6和iphone4下大小肯定是应该不一样的,否则用户体验很差) ...
- SQL-基础学习4--聚集函数:AVG(),COUNT(),MAX(),MIN(),SUM();聚集不同值:DISTINCT
第九课 9.1 聚集函数(对某些行运行的函数,计算并返回一个值) 我们经常需要汇总数据而不用把它们实际检索出来,为此SQL提供了专门的函数.使用这些函数,SQL查询可用于检索数据,以便分析和报表生成. ...
- python遍历当前目录并删除某文件
#coding: utf-8 """ this programe is to clear driverlog below this dir __author__:the_ ...
- 如何查看linux版本 如何查看LINUX是多少位
一.如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案! 1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux ...
- docker入门小结(一)
入职需要学习docker,记录学习随笔.争取两天大致看完docker学习.博客也算是迁移到cnblogs. 学习的链接参考<docker从入门到实践>http://dockerpool.c ...
- String转Map的工具类
借鉴代码 public class StringToMapUtil { public static Map<String, String> getValue(String param) { ...
- vue 父子通信过程
1.概述 每个 Vue 实例都实现了事件接口,即: 使用 $on(eventName) 监听事件 使用 $emit(eventName, optionalPayload) 触发事件 2.示例一(未传递 ...
- css:颜色名和十六进制数值
http://www.w3school.com.cn/cssref/css_colornames.asp