jQuery插件开发--(转)
1,开始
可以通过为jQuery.fn增加一个新的函数来编写jQuery插件。属性的名字就是你的插件的名字:
- jQuery.fn.myPlugin = function(){
- //开始写你的代码吧!
- };
但是,那惹人喜爱的美元符号$哪里去了?她就是jQuery,但是为了确保你的插件与其他使用$的库不冲突,最好使用一个立即执行的匿名函数,这个匿名函数的参数是jQuery,这样其他的库就可以放心的使用$符号了。
- (function( $ ){
- $.fn.myPlugin = function() {
- // 开始吧!
- };
- })( jQuery );
这样更好了就。在闭包内,可以放心的使用$符号了~
2,上下文
现在已经可以编写我们的代码了,但是编写之前,我必须说一说上下文。在插件内部的范围中,this关键字指向的是jQuery对象。人们很容易误解这一点,因为在正常使用jQuery的时候,this通常指向的是一个DOM元素。不了解这一点,会经常使用$又包装了一次。
- (function( $ ){
- $.fn.myPlugin = function() {
- // 没有必要使用$(this)
- // $(this) 跟 $($('#element'))是一样的
- this.fadeIn('normal', function(){
- //这里的this指的就是一个DOM元素了
- });
- };
- })( jQuery );
- $('#element').myPlugin();
3,基本开发
接下来写一个能用的插件吧。
- (function( $ ){
- $.fn.maxHeight = function() {
- var max = 0;
- this.each(function() {
- max = Math.max( max, $(this).height() );
- });
- return max;
- };
- })( jQuery );
- var tallest = $('div').maxHeight();
这是一个简单的插件,通过调用height()返回页面上height最大的div的height。
4,维护链式开发的特性
上一个例子是返回了一个整数,但是大多数情况下,一个插件紧紧是修改收集到的元素,然后返回这个元素让链条上的下一个使用。这是jQuery设计的精美之处,也是jQuery如此流行的原因之一。为了保证可链式,你必须返回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方法进行修改,如css()。如果你的插件如果不是返回一个简单值,你通常应该返回this。而且,正如你可能想到的,你传进去的参数也可以在你的插件中访问。所以在这个例子中,可以访问到type。
5,默认值和选项
为了一些复杂的,可订制的插件,最好提供一套默认值,在被调用的时候扩展默认值。这样,调用函数的时候就不用传入一大堆参数,而是传入需要被替换的参数。你可以这样做:
- (function( $ ){
- $.fn.tooltip = function( options ) {
- var settings = {
- 'location' : 'top',
- 'background-color' : 'blue'
- };
- return this.each(function() {
- // 如果存在选项,则合并之
- if ( options ) {
- $.extend( settings, options );
- }
- // 其他代码咯
- });
- };
- })( jQuery );
- $('div').tooltip({'location':'left'});
在这个例子中,调用插件后,默认的location会被替换城'left',而background-color还是'blue'。这样可以保证高度可配置性,而不需要开发者定义所有可能的选项了。
6,命名空间
正确的命名空间对于插件开发十分重要,这样能确保你的插件不被其他插件重写,也能避免被页面上其他代码重写。命名空间可以使你更长寿,因为你能记录你自己的方法,事件,数据等。
a,插件方法
在任何情况下,都不要在一个插件中为jQuery.fn增加多个方法。如:
- (function( $ ){
- $.fn.tooltip = function( options ) { // 这样 };
- $.fn.tooltipShow = function( ) { // 是 };
- $.fn.tooltipHide = function( ) { // 不好的 };
- $.fn.tooltipUpdate = function( content ) { // 同学! };
- })( jQuery );
不推荐这样使用,搞乱了$.fn命名空间。要纠正之,你可以把所有的方法放进一个对象中,然后通过不同的参数来调用。
- (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 );
- $('div').tooltip({ // calls the init method
- foo : 'bar'
- });
- $('div').tooltip('hide'); // calls the hide method
- $('div').tooltip('update', 'This is the new tooltip content!'); // calls the update method
jQuery自己的扩展也是使用这种插件结构。
b,事件
绑定事件的命名空间是比较不为人知的。如果你的插件绑定了某个事件,最好将它搞到一个命名空间中。这样,如果你以后需要解绑,就不会影响到其他绑定到这个事件上的函数了。你可以使用".<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方法中初始化,它将reposition方法绑定到window对象的resize事件的tooltip名字空间下。稍候,如果开发者需要去掉这个tooltip,我们可以解绑这个绑定。这样就不会影响到其他绑定到window对象的resize事件的方法了。
c,数据
在开发插件的时候,你通常会有保持状态或者检查你的插件是否已经初始化的需要。使用jQuery的data方法是保持变量的很好的方法。但是,我们不把变量单独保存,而是放在一个对象中,这样就可以在一个名字空间下统一访问了。
- (function( $ ){
- var methods = {
- init : function( options ) {
- return this.each(function(){
- var $this = $(this),
- data = $this.data('tooltip'),
- tooltip = $('<div />', {
- text : $this.attr('title')
- });
- // If the plugin hasn't been initialized yet
- 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方法可以帮助你在插件的各个方法间保持变量和状态。将各种变量放在一个对象中,可以方便访问,也可以方便移除。
7,总结与最佳实践
编写jQuery插件可以充分利用库,将公用的函数抽象出来,“循环利用”。以下是简短的总结:
- 使用(function($){//plugin})(jQuery);来包装你的插件
- 不要在插件的初始范围中重复包裹
- 除非你返回原始值,否则返回this指针来保证可链式
- 不要用一串参数,而是使用一个对象,并且设置默认值
- 一个插件,不要为jQuery.fn附上多个函数
- 为你的函数,事件,数据附着到某个命名空间
jQuery插件开发--(转)相关推荐
- jQuery插件开发 - 其实很简单
[前言] jQuery已经被广泛使用,凭借其简洁的API,对DOM强大的操控性,易扩展性越来越受到web开发人员的喜爱,我在社区也发布了很多的jQuery插件,经常有人询问一些技巧,因此干脆写这么一篇 ...
- jquery 插件开发的作用域及基础
2019独角兽企业重金招聘Python工程师标准>>> 之前一直有开发jquery插件的冲动,所以一直想学习如何进行插件开发,最近一个项目需要使用图片上传组件及自动无限下拉组件,百度 ...
- jQuery插件开发学习笔记
今天想了解一下jQuery的插件开发,于是google了一下,列在前面的两篇文章都很不错,jQuery插件开发全解析 更是将插件开发的方方面面细致入微的进行了讲解,并提供了PDF进行下载.笔者今天详细 ...
- jQuery插件开发(一):jQuery类方法
一.jQuery插件开发的方法 jQuery插件的编写方法主要有两种: 1.基于jQuery对象的插件 2.基于jQuery类的插件 二.基于jQuery类的插件 1.什么是jQuery类的插件? j ...
- jQuery插件开发的两种方法及$.fn.extend的详解
2019独角兽企业重金招聘Python工程师标准>>> 作者: 字体:[增加 减小] 类型:转载 时间:2014-01-16 我要评论 jQuery插件开发分为两种:1 类级别.2 ...
- 【转载】jQuery插件开发精品教程,让你的jQuery提升一个台阶
jQuery插件开发精品教程,让你的jQuery提升一个台阶 要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样, ...
- jQuery插件开发中$.extend和$.fn.extend辨析
jQuery插件开发分为两种: 1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery. ...
- JQuery学习使用笔记 -- JQuery插件开发
内容转载自 http://www.css88.com/archives/4821 扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间.这篇文章将概述jQuery插件开发的基本知识,最 ...
- 掌握jQuery插件开发,这篇文章就够了
2019独角兽企业重金招聘Python工程师标准>>> 在实际开发工作中,总会碰到像滚动,分页,日历等展示效果的业务需求,对于接触过jQuery以及熟悉jQuery使用的人来说,首先 ...
- jQuery插件开发教程
jQuery插件开发精品教程,让你的jQuery提升一个台阶 要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样, ...
最新文章
- 计算机技能测试小学老师,小学信息技术教师专业技能测习题-20210726171728.docx-原创力文档...
- 如何设计Kafka?
- boost::uuid::string_generator相关的测试程序
- rz、sz 命令 安装(Xshell 安装)
- 绘制等压面图_等压面练习
- 一些关于大数据的总结
- LTE IDLE DRX和CDRX
- roc_curve()的用法及用途
- MAC Pro开机密码忘记了怎么办?
- 自棱镜事件,隐私保护搜索引擎DuckDuckGo流量增长600%
- 小白面试新媒体运营岗位
- Excel数据分析入门-数据图表
- 【编程实践】什么是计算机编程?定义软件开发。What is Computer Programming? Defining Software Development.
- idea无法识别java文件、Maven下载依赖报错:Cannot resolve...或者Could not find artifact...实测有效
- 魁拔妖侠传 之 浮云骑士语录
- 点云笔记01---点云基本概念
- python使用列表推导式生成5个数字8的列表_【菜鸟学Python】列表推导式
- 每天笑一笑2012年8月28日
- Linux Command
- 记录 mac os 下一些好用的软件
热门文章
- linux pwm控制蜂鸣器 滴滴_兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证
- STM32添加项目所需要的工程文件
- r语言用行名称提取数据框信息显示na_用R语言提取数据框中日期对应年份(列表转矩阵)...
- 【Harvest源码分析】GetFourZeroCrossingIntervals函数
- LeetCode 1195. Fizz Buzz Multithreaded--并发系列题目--Java 解法--AtomicInteger/CountDownLatch/CyclicBarrier
- 用虚拟机学linux,虚拟机上学习Linux运维?学linux有什么用
- ReentrantReadWriteLock(读写锁)
- jenkins+docker部署java项目
- Docker创建自己的github(Gitea)
- What is OPcache