jQuery 学习第七课 扩展jQuery的功能 插件开发


Posted in Javascript onMay 17, 2010

jQuery的主体如下:

(function(){ ……})();

对于Javascript基础不太好好的人来说比较奇怪。实际上,这个表达式声明了一个匿名函数(第一个括号),然后再执行它(第二个括号)。在这个函数中,完成了jQuery一系列方法和对象的定义。第24行很关键,

jQuery = window.jQuery = window.$ = function( selector, context ) { 
// The jQuery object is actually just the init constructor 'enhanced' 
return new jQuery.fn.init( selector, context ); 
}

在这里,定义了十分强大的$函数。$其实是jQuery的一个别名。jQuery才是“正宗”的jQuery函数,$的定义只是为了减少程序员的打字量。$很容易和其他库冲突,例如著名的prototype库也使用了这个名字。不过jQuery和其他库冲突的机会就少多了,因此使用jQuery 要比$安全的多。下面再说冲突的问题。再看return的对象fn的定义,第35行
jQuery.fn = jQuery.prototype = { 
init: function( selector, context ) { …… }, …… 
};

很显然fn只是一个jQuery的原型的简写而已。其中定义了一个init函数。实际上,init充当的是jQuery的构造函数的角色。当我们使用var i=$(‘selector')这样的代码的时候,可以发现变量i被jQuery包裹起来了,也就是i带上了jQuery.fn的方法。很明显,i的prototype被指向了jQuery.fn。再Javascript的世界里,可以说,i是jQuery的一个实例,你尝试下 i instanceof jQuery,返回的是true。然而,这里并没有用 i=new $(selector); 我估计,$是如此常用的一个函数,如果每次都要使用new来构造一个对象的话,那也太麻烦了,这就是init存在的理由,$本身被定义为一个很简单的函数,它内部仅有一行代码,返回一个init对象。我们每调用一次$(selector)方法,都返回一个jQuery对象。有点工厂模式的味道。当然,如果你对Javascript比较熟悉,就会知道这样是不够的,我们需要把init的prototype设为jQuery.fn,代码541行:

jQuery.fn.init.prototype = jQuery.fn;

到540行为止,都是定义的jQuery的原型对象,用OO语言的话说,相当于实例方法,从540行开始,定义了一系列jQuery的方法,相当于静态方法。至此,抛开方法的具体实现不谈(有些实在是太困难了),jQuery的结构基本上是明了的了。下面开始介绍扩展。

扩展jQuery首先要注意的就是避免命名冲突,尤其是抢手的$。考虑周到的jQuery设计了一个jQuery.noConflict()方法,使得jQuery可以拱手让出$符号,避免和其他库冲突,而程序员可以使用完整的符号jQuery来调用jQuery提供的方法。noConflict()的实现简单而巧妙,顺便看一下,首先在第21行,

// Map over the $ in case of overwrite
_$ = window.$,jQuery首先记录下windows.$,注意这行代码的运行时间非常早,在jQuery任何函数执行之前就会被执行。当然,这里的_$也有冲突的可能,不过概率是在是太小了,谁会用这么诡异的名字作为关键的变量呢。此时如果$已经被其他库占用,它的值会保留在_$中,在任何时候,只要调用jQuery.noConflict方法,619行,其代码如下:

noConflict: function( deep ) { 
window.$ = _$; 
if ( deep ) 
window.jQuery = _jQuery; 
return jQuery; 
},

这样,$就又还回去了。

作为插件开发者,我们无法保证$是否被拱手相让,最保险的是调用jQuery方法,然而有一个技巧可以保留简单的$而不影响其他部分,那就是:

(function($){ // plugin code goes here, you can use $ safely. 
})(jQuery);

关于插件的js文件的命名,一般是jquery.pluginname.js。

要扩展jQuery工具函数(静态函数)是很容易的,下面一个例子实现一个将数字扩展成固定位数的字符串的函数。

(function($) { 
$.toFixedWidth = function(value, length, fill) { 
var res = value.toString(); 
if (!fill) fill = 0; 
var padding = length - res.length; 
if (padding < 0) { 
res = res.substr(-padding); 
} else { 
for (var n = 0; n < padding; n++) 
res = fill + res; 
} 
return res; 
} 
})(jQuery);

要编写包装集的方法也同样容易,下面实现一个使表单元素只读的方法:
$.fn.setReadOnly = function(readonly) { 
return this.find('input:text').attr('readonly', readonly).css('opacity', readonly ? 0.5 : 1.0); 
}

下面编写一个小页面测试下,这个页面模拟的是订单提交页面,如果用户需要发票,需要填写发票信息,否则不能填写发票信息。
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>jQuery Extension</title> 
<script src="jquery-1.3.2.js" type="text/javascript"></script> 
<script src="jquery.yinzixin.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$(function() { 
$('#OrderID').val($.toFixedWidth('123', 8)); 
$('#InvoiceRequired').click(function() { 
$('.InvoiceInfo').setReadOnly(!this.checked); 
}); 
$('.InvoiceInfo').setReadOnly(false); 
} 
); 
</script> 
</head> 
<body> 
<form> 
Order ID:<input type="text" id="OrderID" /> <br /> 
<input type="checkbox" id="InvoiceRequired" />Invoice Required<br /> 
<div class="InvoiceInfo"> 
Inovice Tilte:<input type="text" id="Text1" /> 
Invoice Content:<input type="text" id="Text2" /> 
</div> 
<input type="button" value="Submit" /> 
</form> 
</body> 
</html>

jQuery 学习第七课 扩展jQuery的功能 插件开发
Javascript 相关文章推荐
JavaScript 编程引入命名空间的方法
Jun 29 Javascript
javascript Object与Function使用
Jan 11 Javascript
jquery随意添加移除html的实现代码
Jun 21 Javascript
jquery中ajax学习笔记一
Oct 16 Javascript
页面定时刷新(1秒刷新一次)
Nov 22 Javascript
理解JavaScript表单的基础知识
Jan 25 Javascript
easyui validatebox验证
Apr 29 Javascript
Node.js开启Https的实践详解
Oct 25 Javascript
微信小程序之拖拽排序(代码分享)
Jan 21 Javascript
JS中setTimeout和setInterval的最大延时值详解
Feb 13 Javascript
Angularjs实现控制器之间通信方式实例总结
Mar 27 Javascript
jQuery Migrate 插件用法实例详解
May 22 jQuery
jQuery 学习第六课 实现一个Ajax的TreeView
May 17 #Javascript
jQuery 学习第五课 Ajax 使用说明
May 17 #Javascript
jQuery实现的立体文字渐变效果
May 17 #Javascript
jQuery实现的类flash菜单效果代码
May 17 #Javascript
Jquery Select操作方法集合脚本之家特别版
May 17 #Javascript
JQuery select标签操作代码段
May 16 #Javascript
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
May 15 #Javascript
You might like
PHP+DBM的同学录程序(5)
2006/10/09 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
微信小程序 video详解及简单实例
2017/01/16 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
2019/01/24 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
2016/01/20 Python
Python爬虫之网页图片抓取的方法
2018/07/16 Python
python实现两张图片的像素融合
2019/02/23 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
如何利用python发送邮件
2020/09/26 Python
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
ColourPop美国官网:卡拉泡泡,洛杉矶彩妆品牌
2019/04/28 全球购物
商务英语求职信范文
2015/03/19 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
公司仓库管理制度
2015/08/04 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
导游词之白茶谷九龙峡
2019/10/23 职场文书
python标准库ElementTree处理xml
2022/05/20 Python