写JQuery插件的基本知识


Posted in Javascript onNovember 25, 2013

普及JQuery知识

知识1:用JQuery写插件时,最核心的方法有如下两个:

$.extend(object) 可以理解为JQuery 添加一个静态方法。

$.fn.extend(object) 可以理解为JQuery实例添加一个方法。

基本的定义与调用:

/* $.extend 定义与调用
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$.extend({ fun1: function () { alert("执行方法一"); } });
$.fun1();
/*  $.fn.extend 定义与调用
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$.fn.extend({ fun2: function () { alert("执行方法2"); } });
$(this).fun2();
//等同于
$.fn.fun3 = function () { alert("执行方法三"); }
$(this).fun3();

知识2:jQuery(function () { }); 与  (function ($) { })(jQuery);的区别:

jQuery(function () { });
//相当于
$(document).ready(function () { });
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
(function ($) { })(jQuery);
//相当于
var fn = function ($) { };
fn(jQuery);

jQuery(function () { });是某个DOM元素加载完毕后执行方法里的代码。
(function ($) { })(jQuery); 定义了一个匿名函数,其中jQuery代表这个匿名函数的实参。通常用在JQuery插件开发中,起到了定义插件的私有域的作用。

三:开发JQuery插件标准结构

1,定义作用域:定义一个JQuery插件,首先要把这个插件的代码放在一个不受外界干扰的地方。如果用专业些的话来说就是要为这个插件定义私有作用域。外部的代码不能直接访问插件内部的代码。插件内部的代码不污染全局变量。在一定的作用上解耦了插件与运行环境的依赖。说了这么多,那要怎样定义一个插件的私有作用域?

(function ($) {
})(jQuery);

到现在为止,其实一个最简单的JQuery插件就已经完成了。调用的时候可以$("#domName").easySlider({}),或者$(".domName").easySlider({})或者更多的方式来调用这个插件。

3,设置默认值:定义一个JQuery插件,就像定义一个.net控件。一个完美的插件,应该是有比较灵活的属性。我们来看这段代码:<asp:TextBox ID="TextBox1" Width="20" Height="100" runat="server"></asp:TextBox>。  TextBox控件有Width和Height属性,用户在用TextBox时,可以自由的设置控件的Height和Width,也可以不设置值,因为控件自身有默认值。那准备开发一个JQuery插件时,在用户未指定属性时,应该有默认值,在JQuery可以分两步实现这样的定义,看如下代码step03-a,step03-b。

//step01 定义JQuery的作用域
(function ($) {
    //step03-a 插件的默认值属性
    var defaults = {
        prevId: 'prevBtn',
        prevText: 'Previous',
        nextId: 'nextBtn',
        nextText: 'Next'
        //……
    };
    //step02 插件的扩展方法名称
    $.fn.easySlider = function (options) {
        //step03-b 合并用户自定义属性,默认属性
        var options = $.extend(defaults, options);
    }
})(jQuery);

做程序的人都喜欢创新,改改变量名呀,换一个行呀这些。当看到用var defaults = {}来表示一个默认属性时,在自己写JQuery插件时就想着与众不同,所以用var default01 ={} ,var default02 ={}来表示默认属性了。然后默认属性名五花八门,越来越糟。所以建议在写JQuery插件时,定义默认属性时,都用defaults变量来代表默认属性,这样的代码更具有可读性。

有人看到这行代码:var options = $.extend(defaults, options),皱起眉头,表示不解。那我们先来看如下代码:

var obj01 = { name: "英文名:Sam Xiao", age: 29, girlfriend: { name: "Yang", age: 29} }
var obj02 = { name: "中文名:XiaoJian", girlfriend: { name: "YY"} };
var a = $.extend(obj01, obj02);
var b = $.extend(true, obj01, obj02);
var c = $.extend({}, obj01, obj02);
var d = $.extend(true,{}, obj01, obj02);

把代码拷贝到开发环境中,分别看一下a,b,c,d的值,就明白了var options = $.extend(defaults, options)的含义了。表示 options 去覆盖了defaults的值,并把值赋给了options。
在插件环境中,就表示用户设置的值,覆盖了插件的默认值;如果用户没有设置默认值的属性,还是保留插件的默认值。

4,支持JQuery选择器:JQuery选择器,是JQuery的一个优秀特性,如果我们的插件写来不支持JQuery选择器,确实是一个不小的遗憾。如了使自己的JQuery插件能支持多个选择器,我们的代码应该这样定义:

//step01 定义JQuery的作用域
(function ($) {
    //step03-a 插件的默认值属性
    var defaults = {
        prevId: 'prevBtn',
        prevText: 'Previous',
        nextId: 'nextBtn',
        nextText: 'Next'
        //……
    };
    //step02 插件的扩展方法名称
    $.fn.easySlider = function (options) {
        //step03-b 合并用户自定义属性,默认属性
        var options = $.extend(defaults, options);
        //step4 支持JQuery选择器
        this.each(function () {
        });
    }
})(jQuery);

5,支持JQuery的链接调用:上边的代码看似完美了,其实也不那么完美。到目前为止还不支持链接调用。为了能达到链接调用的效果必须要把循环的每个元素return

//step01 定义JQuery的作用域
(function ($) {
    //step03-a 插件的默认值属性
    var defaults = {
        prevId: 'prevBtn',
        prevText: 'Previous',
        nextId: 'nextBtn',
        nextText: 'Next'
        //……
    };
    //step02 插件的扩展方法名称
    $.fn.easySlider = function (options) {
        //step03-b 合并用户自定义属性,默认属性
        var options = $.extend(defaults, options);
        //step4 支持JQuery选择器
        //step5 支持链式调用
        return this.each(function () {
        });
    }
})(jQuery);

这样的定义才能支持链接调用。比如支持这样的调用:$(".div").easySlider({prevId:"",prevText:""}).css({ "border-width": "1", "border-color": "red", "border-bottom-style": "dotted" });

6,插件里的方法:往往实现一个插件的功能需要大量的代码,有可能上百行,上千行,甚至上万行。我们把这代码结构化,还得借助function。在第一点已经说了,在插件里定义的方法,外界不能直接调用,我在插件里定义的方法也没有污染外界环境。现在就尝试着怎么样在插件里定义一些方法:

//step01 定义JQuery的作用域
(function ($) {
    //step03-a 插件的默认值属性
    var defaults = {
        prevId: 'prevBtn',
        prevText: 'Previous',
        nextId: 'nextBtn',
        nextText: 'Next'
        //……
    };
    //step06-a 在插件里定义方法
    var showLink = function (obj) {
        $(obj).append(function () { return "(" + $(obj).attr("href") + ")" });
    }
    //step02 插件的扩展方法名称
    $.fn.easySlider = function (options) {
        //step03-b 合并用户自定义属性,默认属性
        var options = $.extend(defaults, options);
        //step4 支持JQuery选择器
        //step5 支持链式调用
        return this.each(function () {
            //step06-b 在插件里定义方法
            showLink(this);
        });
    }
})(jQuery);

步骤step06-a:在插件里定义了一个方法叫showLink(); 这个方法在插件外是不能直接调用的,有点像C#类里的一个私有方法,只能满足插件内部的使用。步骤step06-b演示了怎样调用插件内部的方法。

Javascript 相关文章推荐
判断JavaScript对象是否可用的最正确方法分析
Oct 03 Javascript
js 动态选中下拉框
Nov 26 Javascript
JQuery打造省市下拉框联动效果
May 18 Javascript
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
Jul 17 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
Jul 27 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
Aug 23 Javascript
javascript实现简单计算器效果【推荐】
Apr 19 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
Oct 27 Javascript
设置cookie指定时间失效(实例代码)
May 28 Javascript
vue router 配置路由的方法
Jul 26 Javascript
在Vue methods中调用filters里的过滤器实例
Aug 30 Javascript
vue router动态路由设置参数可选问题
Aug 21 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
Nov 25 #Javascript
用javascript删除当前行,添加行(示例代码)
Nov 25 #Javascript
如何通过javascript操作web控件的自定义属性
Nov 25 #Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
Nov 25 #Javascript
js导入导出excel(实例代码)
Nov 25 #Javascript
用javascript添加控件自定义属性解析
Nov 25 #Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
Nov 25 #Javascript
You might like
聊天室php&amp;mysql(一)
2006/10/09 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
多个jQuery版本共存的处理方案
2015/03/17 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
深入分析node.js的异步API和其局限性
2016/09/05 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
NodeJs使用Mysql模块实现事务处理实例
2017/05/31 NodeJs
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
微信小程序wepy框架学习和使用心得详解
2019/05/24 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
浅谈Python基础之I/O模型
2017/05/11 Python
python爬虫基本知识
2018/03/05 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
python各种excel写入方式的速度对比
2020/11/10 Python
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
如何做好总经理助理
2013/11/12 职场文书
阿甘正传观后感
2015/06/01 职场文书
会议主持词结束语
2015/07/03 职场文书
办公室规章制度范本
2015/08/04 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
vue-cil之axios的二次封装与proxy反向代理使用说明
2022/04/07 Vue.js