jQuery 的流行在很大程度上归功于其对插件的支持。插件也就是功能扩展的意思,jQuery 允许任何开发人员超越最初的库函数创建并扩展 jQuery 函数。这种开放性框架设计思路催生了无数实用型的插件,jQuery 几乎能够提供 Web 应用程序内所需的任何一种函数。
jQuery 的易扩展性吸引了越来越多的开发者和业余爱好者去研究、设计和使用 jQuery 插件。目前,全球有超过上千种不同应用需要的插件。使用这些插件能够帮助开发人员提升开发速度,节约劳动成本。最权威的插件可以访问 jQuery 官方网站 (http://plugins.jquery.com) 获取。本章将重点讲解如何创建自己的 jQuery 插件,并就网络上比较经典的几个插件设计原理和使用进行介绍。
8.1 创建 jQuery 插件网络上流传着成百上千的第三方插件,这些插件虽然能够增强我们的编程体验,但是很难满足所有设计需要,特别是个性化开发需求。如果自己编写的代码可以重用,或者供其他用户参考,很自然任何人都希望把这些代码进行封装,打包为一个新插件。这个实现过程并不困难,只要读者认真阅读本节内容即可轻松实现。
8.1.1 jQuery 插件的类型jQuery 插件主要分为三种类型,说明如下。
1. jQuery 方法
这种类型的插件是把一些常用或者重复使用的功能定义为函数,然后绑定到 jQuery 对象上,从而成为 jQuery 对象的一个扩展方法。
目前,大部分jQuery插件都是这种类型的插件,由于这种插件是将对象方法封装起来,在 jQuery 选择器获取 jQuery 对象的过程中进行操作,从而发挥 jQuery 强大的选择器优势。有很多 jQuery 内部方法,也是在 jQuery 脚本内部通过这种形式插入到 jQuery 框架中的,如 parent() 、appendTo() 和 addClass() 等方法。
2.全局函数
也可以把自定义的功能函数独立附加到 jQuery 命名空间下,从而作为 jQuery 作用域下的一个公共函数使用。例如,jQuery 的 ajax() 方法就是利用这种途径内部定义的全局函数。
==由于全局函数没有被绑定到 jQuery 对象上,故不能够在选择器获取的 jQuery 对象上调用。需要通过 jQuery.fn() 或者 $.fn() 方式进行引用。==
3.选择器
jQuery 提供了强大的选择器,当然在个性化开发中,读者也可能会感觉到这些选择器不够用,或者使用不是很方便。这个时候,我们就可以考虑自定义选择器,以满足特定环境下的选择元素需要。
8.1.2 解析 jQuery 插件机制为了方便用户创建插件,jQuery 自定义了 jQuery.extend() 和 jQuery.fn.extend() 方法。其中 jQuery.extend() 方法能够创建全局函数或者选择器,而 jQuery.fn.extend() 方法能够创建 jQuery 对象方法。
例如,下面的示例将在 jQuery 命名空间上创建两个公共函数。
- <scripttype="text/javascript">
- jQuery.extend({//扩展jQuery的公共函数
- minValue:function(a,b){//比较两个参数值,返回最小值
- returna<b?a:b;
- },
- maxValue:function(a,b){//比较两个参数值,返回最大值
- returna<b?b:a;
- }
- });
- $("input").click(function(){
- vara=prompt("请输入一个数值?");
- varb=prompt("请再输入一个数值?");
- varc=jQuery.minValue(a,b);
- vard=jQuery.maxValue(a,b);
- alert("你输入的最大值是:"+d+"\n你输入的最小值是:"+c);
- });
- });
- for(varnameinc){//遍历对象c,显示合并后的对象c的具体属性和值
- $("div").html($("div").html()+"<br/>"+name+":"+c[name]);
- }
- });
- varoptions=jQuery.extend({//默认参数选项列表
- name1:value1,
- name2:value2,
- name3:value3,
- },options);//使用函数的参数覆盖或合并到默认参数选项列表中
- //函数体
- }
- fn({name1:value2,name2:value3,name3:value1});//覆盖新值
- fn({name4:value4,name5:value5});//添加新选项
- fn();//保持默认参数值
- returna<b?a:b;
- };
- jQuery.maxValue=function(a,b){
- returna<b?b:a;
- };
- minValue:function(a,b){
- returna<b?a:b;
- },
- maxValue:function(a,b){
- returna<b?b:b;
- }
- };
- alert('这是jQuery对象方法!');
- };
- alert('这是jQuery对象方法!');
- };
- $(function(){
- $("input").click(function(){//绑定click事件
- $(this).test();//在当前的jQuery对象上调用test()方法
- });
- });
- alert(this[0].nodeName);//提示当前jQuery对象的DOM节点名称
- };
- $(function(){
- $("input").click(function(){//绑定click事件
- $(this).test();//在当前的jQuery对象上调用test()方法
- });
- });
- this.each(function(){//遍历所有匹配的元素,此处的this表示对象集合,即jQuery对象
- alert(this.nodeName);//显示当前元素的节点名称,此处的this表示元素对象
- });
- };
- <scripttype="text/javascript">
- jQuery.fn.test=function(){
- this.each(function(){//遍历所有匹配的元素,此处的this表示对象集合,即jQuery对象
- alert(this.nodeName);//显示当前元素的节点名称,此处的this表示元素对象
- });
- };
- $(function(){
- $("body*").click(function(){//选择body元素下所有元素
- $(this).test();//为当前元素调用test()方法,提示当前DOM元素对象的节点名称
- });
- });
- returnthis.each(function(){//返回迭代的jQuery对象
- alert(this.nodeName);
- });
- };
- <scripttype="text/javascript">
- jQuery.fn.test=function(){
- returnthis.each(function(){//返回迭代的jQuery对象
- alert(this.nodeName);
- });
- };
- $(function(){
- $("body*").click(function(){//选择body元素下所有元素
- $(this).test().html(this.nodeName).hide(4000);//行为连写
- });
- });
- test:function(){
- returnthis.each(function(){
- alert(this.nodeName);
- });
- }
- });
针对上面定义的 test() 方法,同样可以在 jQuery 选择器中直接调用。
- <scripttype="text/javascript">
- jQuery.fn.extend({
- test:function(){
- returnthis.each(function(){
- alert(this.nodeName);
- });
- }
- });
- $(function(){
- $("body*").click(function(){//选择body元素下所有元素
- $(this).test().html(this.nodeName).hide(4000);//行为连写
- });
- });
-
关注打赏


微信扫码登录