jQuery 如何创建基本插件(翻译)
有时候,你希望有一块功能在整个代码当中都可以使用。例如,你可能想要有一个单一的方法可以在jQuery选择器上进行调用,用于处理该选择器上的一系列操作。又或许你编写了一个十分有用的工具函数,并希望能够简单的迁移到其它的项目当中。在这种情况下,你也许想要编写一个插件。
jQuery工作原理101:jQuery对象方法和工具方法
在我们编写插件前,首先需要对jQuery的工作原理有一些了解。看一下这段代码:
$( "a" ).css( "color", "red" );
这是一段相当基础的jQuery代码,但你知道在幕后都发生了什么吗?每当你使用那个 $ 方法选择一个元素时,它返回一个jQuery对象。该对象包含了所有你已经用过的方法(.css(), .click(), etc.)以及所有与选择器相符的元素。jQuery对象从 $.fn 对象获得这些方法。该对象包含了所有jQuery对象的方法,并且如果我们想要编写自己的方法,它也会同样包含这些方法。
此外,jQuery工具方法 $.trim() 被用来将用户输入内容中的任意前置或后置空白字符移除。工具方法是指那些直接驻留在 $ 方法自身的方法。当你所扩展的jQuery API不需要对你所取回的DOM元素进行操作时,你或许就会想要编写一个工具方法插件。
(原文说的大意是上面使用到了$.trim() 方法,然后对其进行一下说明,可是上面哪有什么 $.trim(),因此只好这么翻了。)
基本插件编写
比如说我们想要创建一个插件,用于将一组取回元素中的文本变成绿色。我们所需要做的就是添加一个名为 greenify 的方法到 $.fn 当中,之后你将可以像使用其他jQuery对象方法那样使用它。
$.fn.greenify = function() {
this.css( "color", "green" );
}; $( "a" ).greenify(); // Makes all the links green.
要注意的是,在使用另一个方法 .css() 时,我们使用了 this 而不是 $(this) 。这是因为我们的 greenify 方法和 .css() 同属于一个对象。
连缀
插件已经可以使用了,但是想要让我们的插件真正用于实战,还有几件事情需要我们来完成。连缀是jQuery的特性之一,它使你可以在一个选择器上连接五个或是更多的操作。这些都是通过将所有的jQuery对象方法再次返回到原始的jQuery对象来实现的(但也有一些例外:调用不带参数的 .width() 方法将返回被选中元素的宽度,并且它是无法进行连缀的)。下面使用一行代码使我们的插件方法可以进行连缀:
$.fn.greenify = function() {
this.css( "color", "green" );
return this;
} $( "a" ).greenify().addClass( "greenified" );
注意,连缀的概念并不适用于jQuery工具方法,例如:$.trim()。
保护 $Alias 并添加作用域
在JavaScript类库当中, $ 变量十分的流行,如果你在使用jQuery的同时又使用其它的类库,你或许将不得不使用 jQuery.noConflict() 方法来使jQuery不再使用 $ 变量。然而,这将会打乱我们的插件,因为它是在假定 $ 是jQuery的别名的情况下编写的。为了可以兼容其它的插件,并且仍旧使用jQuery的 $ 别名,我们需要将所有的代码放置在立即调用的函数表达式(Immediately Invoked Function Expression)当中,然后传递jQuery函数,并将 $ 作为参数:
(function ( $ ) { $.fn.greenify = function() {
this.css( "color", "green" );
return this;
}; $.ltrim = function( str ) {
return str.replace( /^\s+/, "" );
}; $.rtrim = function( str ) {
return str.replace( /\s+$/, "" );
}; }( jQuery ));
此外,立即调用的函数表达式的主要作用是允许我们拥有自己的私有变量。假设我们需要不同的绿色,并且想要把它存储到一个变量当中。
(function ( $ ) { var shade = "#556b2f"; $.fn.greenify = function() {
this.css( "color", shade );
return this;
}; }( jQuery ));
最小化插件足迹
当编写插件时,最佳的实践是只占用一个 $.fn 扩展槽。这会降低插件被覆盖的几率,同时也会降低覆盖其它插件的几率。换句话说,下面的做法是不恰当的:
(function( $ ) { $.fn.openPopup = function() {
// Open popup code.
}; $.fn.closePopup = function() {
// Close popup code.
}; }( jQuery ));
更为合理的做法应当是只使用一个扩展槽,使用参数来控制扩展槽进行什么操作。
(function( $ ) { $.fn.popup = function( action ) { if ( action === "open") {
// Open popup code.
} if ( action === "close" ) {
// Close popup code.
} }; }( jQuery ));
使用 each() 方法
标准的jQuery对象将包含对任意数量DOM元素的引用,这就是为什么jQuery对象通常被当成集合。如果你想对具体的元素集进行任意操作(例如,得到一个data属性,计算具体的属性等)此时你就需要使用 .each() 方法来遍历元素集。
$.fn.myNewPlugin = function() { return this.each(function() {
// Do something to each element here.
}); };
需要注意的是,我们返回 .each() 方法的结果而非返回 this 。因为 .each() 方法是可连缀的,它将返回 this ,和我们直接返回 this 是一样的。这是目前为止我们进行的保持连缀的最佳做法。
接受选项
当插件变得越来越复杂时,让插件可以通过选项进行自定义是一个不错的想法。尤其是当选项数量较多时,最简单的方式是使用对象字面量(object literal)。让我们对插件进行一些修改,使其能够接受一些选项。
(function ( $ ) { $.fn.greenify = function( options ) { // This is the easiest way to have default options.
var settings = $.extend({
// These are the defaults.
color: "#556b2f",
backgroundColor: "white"
}, options ); // Greenify the collection based on the settings variable.
return this.css({
color: settings.color,
backgroundColor: settings.backgroundColor
}); }; }( jQuery ));
使用范例:
$( "div" ).greenify({
color: "orange"
});
color 的默认值 #556b2f 通过 $.extend() 方法被进行了覆盖,从而变成了橙色。
完整实现
下面是一个小插件的范例,它使用了我们之前所讨论的一些技巧:
(function( $ ) { $.fn.showLinkLocation = function() { return this.filter( "a" ).each(function() {
$( this ).append( " (" + $( this ).attr( "href" ) + ")" );
}); }; }( jQuery )); // Usage example:
$( "a" ).showLinkLocation();
这个便利的插件将遍历集合中的所有锚点,然后将 href 属性附加到括号当中。
<!-- Before plugin is called: -->
<a href="page.html">Foo</a> <!-- After plugin is called: -->
<a href="page.html">Foo (page.html)</a>
该插件还可以进行如下的优化:
(function( $ ) { $.fn.showLinkLocation = function() { return this.filter( "a" ).append(function() {
return " (" + this.href + ")";
}); }; }( jQuery ));
我们将使用 .append() 方法的特性来接受一个回调函数,并且该回调函数的返回值取决于集合中的每个元素各自所附加的内容。要注意的是,与此同时同时我们并没有使用 .attr() 方法来取得 href 属性,因为原生的DOM API让我们可以轻松的访问已合理命名的 href 属性。
原文地址:http://learn.jquery.com/plugins/basic-plugin-creation/
jQuery 如何创建基本插件(翻译)的更多相关文章
- jQuery自定义滚动条样式插件mCustomScrollbar
如果你构建一个很有特色和创意的网页,那么肯定希望定义网页中的滚动条样式,这方面的 jQuery 插件比较不错的,有两个:jScrollPane 和 mCustomScrollbar. 关于 jScro ...
- 强大的支持多文件上传的jQuery文件上传插件Uploadify
支持多文件上传的jQuery文件上传插件Uploadify,目前此插件有两种版本即Flash版本和HTML5版本,对于HTML5版本会比较好的支持手机浏览器,避免苹果手机Safari浏览器不支持Fla ...
- jQuery文件上传插件Uploadify(转)
一款基于flash的文件上传,有进度条和支持大文件上传,且可以多文件上传队列. 这款在flash的基础上增加了html5的支持,所以在移动端也可以使用. 由于官方提供的版本是flash免费,html5 ...
- jQuery打造智能提示插件二(可编辑下拉框)
在上一篇 jQuery打造智能提示插件 上改进,增加下拉按钮,修复点击下拉区域外不隐藏BUG 效果 下拉按钮素材: js封装,注意红色部分为BUG修复,然后传入boxwidth不带px: /* /// ...
- 12款经典的白富美型—jquery图片轮播插件—前端开发必备
图片轮播是网站中的常用功能,用于在有限的网页空间内展示一组产品图片或者照片,同时还有非常吸引人的动画效果.本文向大家推荐12款实用的 jQuery 图片轮播效果插件,帮助你在你的项目中加入一些效果精美 ...
- jQuery文件上传插件jQuery Upload File 有上传进度条
jQuery文件上传插件jQuery Upload File 有上传进度条 jQuery文件上传插件jQuery Upload File,插件使用简单,支持单文件和多文件上传,支持文件拖拽上传,有进度 ...
- 【jquery】Validform,一款不错的 jquery 表单验证插件
关于 Validform 这是一款很不错的 jquery 表单验证插件,它几乎能够满足任何验证需求,仅仅一行代码就能搞定整站的表单验证. $('form').Validform(); 为什么能如此方便 ...
- 【jQuery基础学习】06 jQuery表单验证插件-Validation
jQuery的基础部分前面都讲完了,那么就看插件了. 关于jQuery表单验证插件-Validation validation特点: 内置验证规则:拥有必填.数字.E-Mail.URL和信用卡号码等1 ...
- jQuery extend() & jQuery.fn.extend(),插件编写
资料来源:网上资料整理并自行改编测试.复制以下代码并依赖jquery.js,jquery.validate.js即可执行.有误之处,请@我啊,敬请赐教. <!DOCTYPE html PUBLI ...
随机推荐
- Qt入门(19)——自定义窗口部件
我们介绍可以画自己的第一个自定义窗口部件.我们也加入了一个有用的键盘接口.我们添加了一个槽:setRange(). void setRange( int minVal, int maxV ...
- Qt入门(18)——使用信号和槽连接控件
下面显示了如何使用信号和槽来创建自定义窗口部件,和如何使用更加复杂的方式把它们连接起来. 首先,源文件被我们分成几部分并放在放在t7目录下. t7/lcdrange.h包含LCDRange类定义.t7 ...
- JQuery固定表头插件fixedtableheader源码注释
在开发XX车站信息系统时,需要将大量数据显示在一个巨大的表格内部,由于表格是一个整体,无法分页,加之数据很多,超出一屏,为了方便用户,决定使用固定表头的插件,经过测试,发现JQuery 插件:fixe ...
- vim下缩进及高亮设置
1.配置文件的位置 在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效.而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc” ...
- Safecracker(搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1015 / 题意; 从所给的一串字符串中选出5个字母假如是(A B C D E)使得A-B^2+C^3-D^4+E ...
- 80 多个 Linux 系统管理员的监控工具
原文出处: serverdensity 译文出处:Linux中国 随着互联网行业的不断发展,各种监控工具多得不可胜数.这里列出网上最全的监控工具.让你可以拥有超过80种方式来管理你的机器.在本文中 ...
- PHP学习之[第04讲]PHP5.4 运算符、流程控制
一.运算符: 1.算数运算符:+.-.*./.%.++.-- 2.字符串运算符: <?php $str="string php100"; echo $str."we ...
- vs2008 多人同时开发项目时的代码注释规范格式 分类: C#小技巧 2014-04-23 14:12 297人阅读 评论(0) 收藏
多人同时开发一个项目,区分项目的那个窗体是谁开发的,例:下面的格式 /************************************************ 模块:服务器设置 ...
- Hibernate详解(5)——Hibernate核心接口和工作原理
Hibernate核心接口 Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration .这五个接口构成了Hi ...
- Appium官网Introduction
英文官网:http://appium.io/introduction.html?lang=zh Appium 简介 Appium是一个开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏 ...