`

jquery插件开发

 
阅读更多

此文引自:http://www.cnblogs.com/tonywang711/archive/2012/03/29/2419985.html

 

 

以前写js的时候都没有注意一些封装插件的方法和技巧,如今将jquery的文档翻译一下,在自己学习的同时也给跟我类似的菜鸟一点精神食粮吧~亲~

一、开始

写一个插件,首先是要往 jquery.fn 对象中添加一个由你命名的function对象

jQuery.fn.myPlugin = function() {
// code
};

如果要使用我们熟悉的 $ 符号,并不希望它与其他脚本库冲突,那么如下

(function( $ ) {
$.fn.myPlugin = function() {
// code
};
})( jQuery );

 现在我们就能用美元符号代替那个麻烦的“jQuery”了

二、背景

现在我们可以开始开发我们自己的插件了,但在此之前,我们必须注意一点,在我们所编写的插件function的作用域内,this关键字所代表的是调用该插件的jquery对象。

这是一个常见的错误,因为在jquery的回调函数里this关键字往往是表示一个DOM元素,这导致this关键字总被过度封装。

复制代码
(function( $ ){
$.fn.myPlugin = function() {

// 不需要写成$(this)是因为这里的this已经是一个jquery对象

// $(this) 代表的意思则变成了 $($('#element'));

this.fadeIn('normal', function(){

// 这里的this是代表一个DOM元素

});
};
})( jQuery );
复制代码
$('#element').myPlugin();

三、基础知识

现在我们了解了jquery插件的背景,现在我们写一个小demo来看看插件是怎么实现的

复制代码
(function( $ ){
$.fn.maxHeight = function() {

var max = 0;

this.each(function() {
max = Math.max( max, $(this).height() );
});

return max;
};
})( jQuery );
复制代码
var tallest = $('div').maxHeight(); // 返回最高的div的height

这是一个简单的例子

四、保持链接性

前面的例子返回了一个div的高度值,但通常插件是简单的修改集合的元素,并通过链将元素传递到下一个方法执行。

所以为了保持连接性,我们必须确保我们的插件将this关键字返回

复制代码
(function( $ ){
$.fn.lockDimensions = function( type ) {

return this.each(function() {

var $this = $(this);

if ( !type || type == 'width' ) {
$this.width( $this.width() );
}

if ( !type || type == 'height' ) {
$this.height( $this.height() );
}

});
};
})( jQuery );
复制代码
$('div').lockDimensions('width').css('color', 'red');

因为插件在它的作用域内返回了this关键字,使它保持了关联性并且使其他jquery方法可以继续操作这些jquery集合,例如.css。

所以你的插件如果不返回一个固有值,你应该在你插件function的作用域里返回this关键字。

此外,如你所想的,你传递给你插件调用的参数获得了你插件function的作用域(好吧。。。我承认这句不太会翻。。。大概意思就是传进来的参数在作用域里都可用吧,废话@_@~!)。

所以在前面的例子中,字符串‘width’在插件函数中变为了参数‘type’。

五、默认值(defaults) 和 配置(options) 

对于更复杂的和可配置的插件提供了许多options,当插件调用时,具有可扩展的默认设置(用$.extend)是一种最好的实现方法。

所以与其调用的插件拥有大量的参数,不如调用这个插件时只有一个参数,但这个参数是一个可重写设置的object对象。

这里是如何实现的例子

复制代码
(function( $ ){
$.fn.tooltip = function( options ) {

// 创建一些默认值, 用提供的options来扩展
var settings = $.extend( {
'location' : 'top',
'background-color' : 'blue'
}, options);

return this.each(function() {
// code
});
};
})( jQuery );
复制代码
$('div').tooltip({
'location' : 'left'
});

在这个例子里,用给定的options调用tooltip插件之后,默认的location设置被重新设置为‘left’,而 background-color还是默认的‘blue’。

所以最终的settings对象应该是:

{
'location' : 'left',
'background-color' : 'blue'
}

这是一个伟大的方式,提供了一个不需要开发人员定义所有有效options的高度可配置插件。

六、命名空间(namespace) 

适当的命名空间对于插件开发是一个非常重要的部分。

正确的命名空间可以确保你的插件只有极小的可能被同一个page的其他插件或者代码给覆盖。

命名空间可以让你作为插件开发者的生活更轻松,因为它能帮助你更好的跟踪你的method、event和数据。

6.1 插件的方法(method) 

在任何情况下一个单独的插件都要求在jquery.fn对象里有一个以上的命名空间。

复制代码
(function( $ ){

$.fn.tooltip = function( options ) {
// THIS
};
$.fn.tooltipShow = function( ) {
// IS
};
$.fn.tooltipHide = function( ) {
// BAD
};
$.fn.tooltipUpdate = function( content ) {
// !!!
};

})( jQuery );
复制代码

这个是不好的,因为它使jquery.fn命名空间变得杂乱。

为了解决这个问题,你应该收集你所有的插件里的方法到一个object对象,并且通过传递这个方法的name字符串到插件来调用它们。

复制代码
(function( $ ){

var methods = {
init : function( options ) {
// THIS
},
show : function( ) {
// IS
},
hide : function( ) {
// GOOD
},
update : function( content ) {
// !!!
}
};

$.fn.tooltip = function( method ) {

// Method calling logic
if ( methods[method] ) {
return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return methods.init.apply( this, arguments );
} else {
$.error( 'Method ' + method + ' does not exist on jQuery.tooltip' );
}

};

})( jQuery );

// calls the init method
$('div').tooltip();

// calls the init method
$('div').tooltip({
foo : 'bar'
});
复制代码
// calls the hide method
$('div').tooltip('hide');
// calls the update method
$('div').tooltip('update', 'This is the new tooltip content!');

这种类型的插件架构允许你将你所有的方法封装在插件的父封闭(父作用域?)中,并首先传入方法名称字符串来调用它们,然后为这些方法传入你所需要的参数。

在jquery plugin社区这类方法的封装和结构是一个标准,它被无数插件所使用,包括了jqueryUI的插件和部件。

6.2 事件(Event)

一个鲜为人知的绑定方法的特色是允许命名已绑定的方法。 如果你的插件绑定了一个事件,一个很好的方法是命名它(意思应该就是例子中那种通过命名空间方法传事件名字符串来调用吧?!)

这样,如果你以后要解除绑定(unbind),这样做可以排除可能绑定到同一个事件类型的其他事件的干扰。

你可以通过追加(appending)“.<namespace>”到你绑定的事件类型的方法来命名你的事件。

复制代码
(function( $ ){

var methods = {
init : function( options ) {

return this.each(function(){
$(window).bind('resize.tooltip', methods.reposition);
});

},
destroy : function( ) {

return this.each(function(){
$(window).unbind('.tooltip');
})

},
reposition : function( ) {
// ...
},
show : function( ) {
// ...
},
hide : function( ) {
// ...
},
update : function( content ) {
// ...
}
};

$.fn.tooltip = function( method ) {

if ( methods[method] ) {
return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return methods.init.apply( this, arguments );
} else {
$.error( 'Method ' + method + ' does not exist on jQuery.tooltip' );
}

};

})( jQuery );
复制代码
$('#fun').tooltip();
// Some time later...
$('#fun').tooltip('destroy');

在这个例子中,当tooltip被init方法初始化时,它在“tooltip”命名空间下将reposition方法绑定到了window的resize事件上。

之后,如果开发者需要销毁tooltip,我们可以通过传入它的命名到unbind方法将插件事件解除绑定(unbind),在这个例子里是“tooltip”。

这允许我们安全的解除事件绑定,排除了意外解除掉插件外绑定的事件的情况。

6.3 数据(data)

常常在插件开发的时候,如果你的插件已经初始化一个给定的元素,你需要保持它的状态或者检查它。

使用jquery的data方法是一个伟大的方法以保持对每一个基本元素的变量的跟踪。

然而,最好使用一个object对象容纳你所有的变量,并且通过一个单独的data命名去访问这个object,而不是持续跟踪一堆不同名称的分散的数据。

复制代码
(function( $ ){

var methods = {
init : function( options ) {

return this.each(function(){

var $this = $(this),
data = $this.data('tooltip'),
tooltip = $('<div />', {
text : $this.attr('title')
});

// 如果插件已经初始化
if ( ! data ) {

/*
Do more setup stuff here
*/

$(this).data('tooltip', {
target : $this,
tooltip : tooltip
});

}
});
},
destroy : function( ) {

return this.each(function(){

var $this = $(this),
data = $this.data('tooltip');

// Namespacing FTW
$(window).unbind('.tooltip');
data.tooltip.remove();
$this.removeData('tooltip');

})

},
reposition : function( ) { // ... },
show : function( ) { // ... },
hide : function( ) { // ... },
update : function( content ) { // ...}
};

$.fn.tooltip = function( method ) {

if ( methods[method] ) {
return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return methods.init.apply( this, arguments );
} else {
$.error( 'Method ' + method + ' does not exist on jQuery.tooltip' );
}

};

})( jQuery );
复制代码

使用data帮助你在你的插件方法里跟踪变量和状态。命名你的数据到一个object对象,这样你就能很轻松的从一个中心位置访问到你插件的所有属性,并且能轻松取消你想要移除的数据命名。

七、总结和最佳做法

编写jquery插件能使利用高效的库(library),以及抽象最灵活有用的功能,使之成为可重用的代码,可以节省你的时间和使你的开发更高效。

下面是一个简单的总结,请在下一次开发jquery插件时牢记:

1、始终将您的插件放在一个闭包中: 

(function( $ ){ /* plugin goes here */ })( jQuery );

2、在你的插件function的作用域里不要重复封装this关键字

3、除非你的插件要返回一个固定值,否则使插件总是返回this关键字以保持连续性

4、与其使用大量的参数,不如将你的设置传入一个可扩展你插件默认值的object对象中。

5、不要使一个插件具有超过1个命名空间,导致jquery.fn对象混乱。

6、始终命名(namespace)你的方法、事件和数据。

分享到:
评论

相关推荐

    jQuery插件开发全解析

    ### jQuery插件开发全解析 #### 一、引言 jQuery作为一款优秀的JavaScript库,在前端开发领域具有举足轻重的地位。它简化了许多常见的JavaScript任务,使得开发者能够更轻松地处理DOM操作、事件处理以及Ajax交互等...

    jquery 插件开发

    jquery插件开发是提高前端开发效率的重要方式之一。在本篇文章中,我们将详细解析如何通过$.extend()方法扩展jQuery、如何通过$.fn向jQuery添加新的方法以及如何使用$.widget()方法应用jQuery UI的部件工厂方式创建...

    jQuery插件开发学习

    这篇“jQuery插件开发学习”的主题旨在帮助开发者深入理解如何利用jQuery来开发自定义插件,提高代码复用性和项目效率。下面我们将详细探讨jQuery插件开发的相关知识点。 首先,了解jQuery的核心概念是至关重要的。...

    jQuery插件开发的五种形态小结

    总结来说,jQuery插件开发中的五种形态小结通过一系列的示例和说明,为开发者展示了如何创建一个高效、可维护的插件。这五个形态涉及到了代码的独立性、链式操作、插件的可配置性、生命周期的管理、无冲突处理以及...

    JQuery插件开发

    **jQuery插件开发** 在Web开发领域,jQuery是一款广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画效果和Ajax交互。jQuery插件是扩展jQuery功能的一种方式,允许开发者根据需求定制各种功能,如表单验证、...

    jquery 插件开发 pdf

    jQuery插件开发是扩展这个库功能的一种常见方式,使得开发者能够根据项目需求创建自定义功能。以下是对jQuery插件开发的详细讲解: 1. **插件基础** - jQuery插件通常是通过扩展jQuery对象的原型链来实现的,这...

    jQuery插件开发详解

    《jQuery插件开发详解》 在Web开发领域,jQuery是一个广泛应用的JavaScript库,它极大地简化了DOM操作、事件处理和动画制作。对于开发者而言,掌握jQuery插件的开发技巧是提升工作效率的重要一环。本篇将深入探讨...

    jQuery插件开发及常用插件大全.zip

    jQuery插件开发及常用插件大全PDF;jQuery插件开发.pdf、jQuery常用插件大全.pdf

    jquery插件开发文档

    jQuery插件开发是一项重要的技能,可以让开发者通过创建可复用的代码片段来增强jQuery库的功能。根据提供的文档内容,以下是一些关于jQuery插件开发的关键知识点: 1. 基本插件结构 在编写jQuery插件时,首先要了解...

    跟我一起学JQuery插件开发

    首先,要学习jQuery插件开发,我们先要理解插件的概念。jQuery插件本质上是通过某种机制对jQuery核心模块进行扩展的方法或额外功能。在编写属于自己的插件时,我们不仅可以提高开发效率,还可以在不同的项目中重复...

    jQuery插件开发详细教程

    jQuery插件开发是一项能够极大提升前端开发效率和代码可复用性的技术。在学习开发jQuery插件之前,需要先了解一些基础概念和最佳实践,以及避免在开发过程中的一些常见陷阱。 首先,我们需要掌握什么是jQuery插件。...

    老司机带你解读jQuery插件开发流程

    在学习jQuery插件开发之前,需要了解jQuery库本身的功能和组成。jQuery是一个快速、小巧且功能丰富的JavaScript库,它简化了HTML文档遍历、事件处理、动画和Ajax交互等操作。在进行jQuery插件开发时,尤其需要关注...

    通用 JQuery 插件 开发

    **通用JQuery插件开发详解** 在Web开发领域,jQuery是一个广泛使用的JavaScript库,它极大地简化了DOM操作、事件处理、动画制作以及Ajax交互。由于其简洁的API和丰富的功能,jQuery成为创建交互式网页的强大工具。...

    JQuery插件的写法 最常用的jquery插件开发方式(教程合集).zip

    JQuery插件的写法 最常用的jquery插件开发方式(教程合集) jquery插件的例子 jQuery插件开发教程_看这一本就行了 JQuery插件写法 jq插件最常用的写法

    详解jQuery插件开发方式

    jQuery插件开发是创建可复用、模块化代码的一种有效方式,它允许开发者扩展jQuery的功能,满足特定需求。本文将深入探讨jQuery插件开发的几个关键点:jQuery扩展、私有域以及定义插件的基本步骤。 首先,我们来看...

    jQuery插件开发精品教程让你的jQuery提升一个台阶

    ### jQuery插件开发精品教程 #### 一、引言 jQuery是一个广泛使用的JavaScript库,其核心功能之一是通过插件扩展其功能。在这一部分,我们将了解到插件对jQuery的重要性,以及如何使用插件来提升jQuery的能力。 ##...

    jQuery插件开发精品教程(让你的jQuery更上一个台阶)

    学习jQuery插件开发对于任何希望提升自身前端开发能力的开发者而言,是一项非常重要的技能。 在插件开发中,首先需要了解的是插件开发的基本模式。根据《jQuery高级编程》所述,jQuery插件开发主要有以下几种方式:...

    JQuery插件开发 + 插件

    这篇博文“JQuery插件开发 + 插件”可能涉及到如何创建自定义的jQuery插件以及如何利用这些插件来增强网页功能。下面我们将深入探讨jQuery插件开发的相关知识点。 一、jQuery插件基础 1. 插件定义:jQuery插件是...

Global site tag (gtag.js) - Google Analytics