简单来说,所谓 jQuery 插件就是扩展在 jQuery 原型对象上的一个方法。通过扩展 jQuery 对象,每次调用 jQuery 对象的时候,对象里面都包含了我们自己所添加的那个方法。
一般插件的设计目的都是为了能在选择器所选择的结果集上做某些事情,本质上和 jQuery 自带的 fadeOut
和 addClass
之类的方法没什么区别。
制作好自己的插件后,可以在自己的项目中私用,如果你愿意的话,也可以免费公开给其它人使用。而且,现在互联网上的免费插件也非常的多。另外,制作一个属于自己的 jQuery 插件的门槛真的很低。
如何制作一个插件
一个典型的插件制作方法如下:
(function($){
$.fn.myNewPlugin = function() {
return this.each(function(){
// do something
});
};
}(jQuery));
不要被上面的代码迷惑,制作 jQuery 插件的关键点就是扩展 jQuery 的原型对象,其实也就是下面这行代码:
$.fn.myNewPlugin = function() { /* do something */ }
然后再将其封装在一个自执行函数中:
(function($){
//...
}(jQuery));
其实也就是创建一个私有的作用域来扩展 jQuery,在这个作用域中可以随意使用 $
符号,而不用担心和其它 JavaScript 库中的 $
产生冲突。
所以,真正意义上的插件代码就是以下部分:
$.fn.myNewPlugin = function() {
return this.each(function(){
// do something
});
};
其中的 this
关键字,指向的是调用这个插件的 jQuery 对象。
var somejQueryObject = $('#something');
$.fn.myNewPlugin = function() {
alert(this === somejQueryObject);
};
somejQueryObject.myNewPlugin(); // alerts 'true'
一个典型的 jQuery 对象通常包含许多 DOM 元素,所以说 jQuery 对象也被看做是 DOM 对象集。因此,如果要对对象集中的每个元素作处理,就要借助于 jQuery 的 each()
方法:
$.fn.myNewPlugin = function() {
return this.each(function(){
});
};
和其它大多数 jQuery 方法一样,jQuery 的 each()
方法返回的也是一个 jQuery 对象,所以我们才可以使用 $(...).css().attr()...
这种广受喜爱的链式操作。为了使我们的插件也支持链式操作,插件也要返回 jQuery 对象。通过 each()
方法,可以对 jQuery 结果集中的 DOM 元素逐个进行处理,下面是个示例:
(function($){
$.fn.showLinkLocation = function() {
return this.filter('a').each(function(){
$(this).append(
' (' + $(this).attr('href') + ')'
);
});
};
}(jQuery));
// Usage example:
$('a').showLinkLocation();
此小插件的功能就是将每个超链接的地址,在超链接后面也显示出来:
<!-- 插件调用前: -->
<a href="page.html">Foo</a>
<!-- 插件调用后: -->
<a href="page.html">Foo (page.html)</a>
其实,这个插件的代码还可以再优化一下:
(function($){
$.fn.showLinkLocation = function() {
return this.filter('a').append(function(){
return ' (' + this.href + ')';
});
};
}(jQuery));
我们使用一个匿名的回调函数作为 append
方法的参数,并且这个回调函数的返回值即为超链接的地址,和上面例子中使用 attr
方法不一样,此示例中使用了 DOM 内置的 API,通过元素的 href
属性来取得相关的值。
这里还有另外一个插件的例子,这个例子中并没有使用 each()
做循环,而是直接调用了 jQuery 的其它方法:
(function($){
$.fn.fadeInAndAddClass = function(duration, className) {
return this.fadeIn(duration, function(){
$(this).addClass(className);
});
};
}(jQuery));
// Usage example:
$('a').fadeInAndAddClass(400, 'finishedFading');
什么时候才需要自己写插件
有时候我们需要用一小段代码实现某功能,并且这个功能在其它很多地方都可能被复用,那么这时可以考虑将这个功能写成插件。
大多数插件都仅仅是在 $.fn
命名空间下添加方法而已,jQuery 确保在此方法中使用的 this
都是指向调用该方法的 jQuery 对象。反过来,编写插件的时候,也要确保插件方法返回的也是这个对象。
下面又是一个简单的 jQuery 插件示例:
// 定义插件
(function($){
$.fn.hoverClass = function(c) {
return this.hover(
function() { $(this).toggleClass(c); }
);
};
})(jQuery);
// 调用插件
$('li').hoverClass('hover');
要想了解更多关于 jQuery 插件开发的方法,可以参考 Mike Alsup 撰写的 A Plugin Development Pattern 一文,文中详细介绍了一款名为 $.fn.hilight
插件的开发方法。
该插件的设计模式如下:
//
// create closure
//
(function($) {
//
// plugin definition
//
$.fn.hilight = function(options) {
debug(this);
// build main options before element iteration
var opts = $.extend({}, $.fn.hilight.defaults, options);
// iterate and reformat each matched element
return this.each(function() {
$this = $(this);
// build element specific options
var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
// update element styles
$this.css({
backgroundColor: o.background,
color: o.foreground
});
var markup = $this.html();
// call our format function
markup = $.fn.hilight.format(markup);
$this.html(markup);
});
};
//
// private function for debugging
//
function debug($obj) {
if (window.console && window.console.log)
window.console.log('hilight selection count: ' + $obj.size());
};
//
// define and expose our format function
//
$.fn.hilight.format = function(txt) {
return '<strong>' + txt + '</strong>';
};
//
// plugin defaults
//
$.fn.hilight.defaults = {
foreground: 'red',
background: 'yellow'
};
//
// end of closure
//
})(jQuery);
如果有兴趣,可至原文深度阅读。
via http://jqfundamentals.com/#chapter-8
相关推荐
jquery插件库(jquery.treeview插件库)jquery插件库(jquery.treeview插件库)jquery插件库(jquery.treeview插件库)jquery插件库(jquery.treeview插件库)jquery插件库(jquery.treeview插件库)jquery插件库(jquery....
jquery插件库大全(200个): jqueryQQ表情插件 jquery下拉菜单导航 jquery下拉菜单栏 jquery仿Windows系统选中图标效果 jquery仿京东商品详情页图片放大效果 jquery仿百度新闻焦点轮播 jquery分离布局模版 jquery...
通过这样的结构,我们可以创建一个易于使用且功能强大的jQuery插件,用户只需一行代码就能在页面上添加一个数字时钟: ```javascript $('.clock').digitclock(); ``` 总的来说,学习jQuery插件开发有助于提升...
jQuery插件开发是一项重要的技能,可以让开发者通过创建可复用的代码片段来增强jQuery库的功能。根据提供的文档内容,以下是一些关于jQuery插件开发的关键知识点: 1. 基本插件结构 在编写jQuery插件时,首先要了解...
一个简单的jQuery插件通常包含以下部分: 1. **命名空间定义**:为了防止与其他插件冲突,我们通常使用`.fn.extend`来创建一个新的命名空间,例如`$.fn.myPlugin`。 ```javascript (function($) { $.fn.myPlugin ...
jQuery插件开发是扩展这个库功能的一种常见方式,使得开发者能够根据项目需求创建自定义功能。以下是对jQuery插件开发的详细讲解: 1. **插件基础** - jQuery插件通常是通过扩展jQuery对象的原型链来实现的,这...
### jQuery插件开发全解析 #### 一、引言 jQuery作为一款优秀的JavaScript库,在前端开发领域具有举足轻重的地位。它简化了许多常见的JavaScript任务,使得开发者能够更轻松地处理DOM操作、事件处理以及Ajax交互等...
jQuery作为JavaScript领域中广泛使用的库之一,...每一个形态都是对前一个形态的优化和补充,共同构成了一个完整的jQuery插件开发流程。掌握这些形态能够帮助开发者更好地进行插件开发,提升项目的开发效率和维护性。
总的来说,jquery插件开发是一个非常强大且灵活的过程,通过灵活使用$.extend()、$.fn以及$.widget()等方法,我们可以轻松地扩展或者创建新的jQuery功能或者部件。只要我们能够掌握这些方法,相信一定能够有效地提升...
JQuery插件的写法 最常用的jquery插件开发方式(教程合集) jquery插件的例子 jQuery插件开发教程_看这一本就行了 JQuery插件写法 jq插件最常用的写法
2. **函数结构**:一个简单的jQuery插件通常包含以下结构: ```javascript (function($){ $.fn.myPlugin = function(options) { // 插件代码 }; })(jQuery); ``` 这里的匿名函数保证了`$`符号代表jQuery,并...
jQuery插件开发及常用插件大全PDF;jQuery插件开发.pdf、jQuery常用插件大全.pdf
组织架构图之JQuery插件组织架构图之JQuery插件组织架构图之JQuery插件组织架构图之JQuery插件组织架构图之JQuery插件组织架构图之JQuery插件组织架构图之JQuery插件组织架构图之JQuery插件组织架构图之JQuery插件...
jQuery插件是JavaScript库jQuery生态系统中的一个重要组成部分,它极大地扩展了jQuery的核心功能,为开发者提供了丰富的功能和便捷的API,以实现各种复杂的网页交互和特效。jQuery插件通常由开发者社区创建并开源,...
1. 插件结构:一个基本的jQuery插件通常由一个函数构成,该函数接收jQuery对象作为参数,这样可以作用于匹配的DOM元素集合。例如: ```javascript $.fn.myPlugin = function(options) { this.each(function() { /...
你可以通过查看源代码来学习其工作原理,这对于初学者或者希望深入了解jQuery插件开发的人来说是一个很好的学习机会。 标签“清除html格式”是这个插件的核心特性,它可能包括移除HTML标签、属性、样式以及其他非...
在IT行业中,jQuery是一个广泛使用的JavaScript库,它极大地简化了JavaScript的DOM操作、事件处理、动画设计和Ajax交互。jQuery的流行在于其易用性、兼容性和丰富的插件生态系统。"50个jQuery插件介绍"这篇文档很...
以"jquery插件库-jquery抽奖插件"为例,这个插件可能包含一个旋转盘的HTML结构,结合CSS3的transform属性实现3D旋转效果。JavaScript部分则通过jQuery选择器获取元素,设置动画时间和旋转角度,然后绑定click事件,...
这个资源包含的"240多个jQuery插件"是开发者们为了扩展jQuery功能而创建的各种工具,它们能帮助我们实现更丰富的交互效果和视觉体验。 首先,jQuery插件的核心在于其模块化设计,允许开发者通过简单的API接口,将...