jQuery的主体如下:(function(){ 0.}) ();对于Javascript基础不好的人来说很奇怪。事实上,这个表达式声明了一个匿名函数(第一个括号),然后执行它(第二个括号)。在这个函数中,定义了jQuery的一系列方法和对象。第24行很关键,复制代码如下: jquery=window . jquery=window。$=function (selector,context){//jQuery对象实际上只是init构造函数‘增强’返回新的jQuery.fn.init(selector,context);}这里定义了一个非常强大的$函数。$实际上是jQuery的别名。jQuery是“正宗”的JQuery函数,$的定义只是为了减少程序员的打字量。$很容易与其他库冲突,例如,著名的原型库也使用这个名称。但是,jQuery与其他库发生冲突的几率要小得多,所以使用jQuery比使用$)安全得多。我们来谈谈冲突。查看返回对象fn的定义,第35行复制的代码如下: jquery . fn=jquery . prototype={ init 3360 function(选择器,上下文)}.},};显然fn只是jQuery原型的简写。其中定义了一个初始化函数。实际上,init充当jQuery的构造函数。当我们使用var I=$ ('selector ')这样的代码时,可以发现变量I是被jQuery包装的,也就是我带来了jQuery.fn的方法显然,I的原型是指向jQuery.fn的在Javascript的世界里,可以说我是jQuery的一个实例。如果您尝试jQuery的i instanceof,它将返回true。但是,这里不使用i=new $(选择器)。我估计$是一个如此常用的函数,以至于每次都用new来构造一个对象会太麻烦。这就是init存在的原因。$本身被定义为一个非常简单的函数,里面只有一行代码,返回一个init对象。每次我们调用$(选择器)方法,都会返回一个jQuery对象。有点像工厂。当然,如果你熟悉Javascript,你就会知道这还不够。我们需要将init的原型设置为jQuery.fn,代码行541为jquery . fn . init . prototype=jquery . fn;直到第540行,它们都是jQuery的已定义原型对象,相当于OO语言中的实例方法。从第540行开始,定义了一系列jQuery方法,相当于静态方法。至此,不管方法的具体实现如何(有些太难了),jQuery的结构基本清晰。让我们从扩展开始。扩展jQuery时首先要注意的是避免命名冲突,尤其是流行的$。周到的jQuery设计了一个jQuery.noConflict()方法,这样jQuery就可以放弃$符号来避免与其他库冲突,程序员可以使用完整的符号jQuery来调用jQuery提供的方法。noConflict()的实现简单巧妙。顺便说一下,首先,在第21行,//映射$以防overwrite _ $=window。$,jQuery首先记录窗口。$.请注意,这一行代码运行得非常早,将在jQuery的任何函数执行之前执行。当然这里的_ $可能会冲突,但是概率太小了。谁会用这么奇怪的名字作为关键变量呢?此时,如果$已经被其他库占用,它的值将保持在_ $。任何时候只要调用jQuery.noConflict方法,619行,代码如下:复制代码如下: noconflict 3360函数(deep) {window。$=_ $;if(deep)window . jQuery=_ jQuery;返回jQuery},这样,$又被返回了。作为一个插件开发者,我们不能保证$是否会被送人。最安全的是调用jQuery方法。但是有一个技巧可以保持简单的$不影响其他部分,那就是:复制代码如下: (function ($) {//plugin code走到这里,就可以安全使用$了。})(jQuery);插件的js文件名称一般为jquery.pluginname.js.扩展jQuery工具函数(静态函数)很容易。下面的示例实现了一个函数,该函数将数字扩展为具有固定数字的字符串。
复制代码代码如下:(函数($) { $)。toFixedWidth=函数(值、长度、填充){ var RES=值。tostring();if(!fill)fill=0;可变填充=长度-资源长度;如果(填充0){ RES=RES . substr(-padding);} else { for(var n=0;填料;n ) res=填充RES}返回RES } })(jQuery);要编写包装集的方法也同样容易,下面实现一个使表单元素只读的方法:复制代码代码如下: $ .fn。setreadonly=function(readonly){ return this。查找('输入:文本').attr('readonly ',readonly).css(“”不透明度,只读?0.5 : 1.0);} 下面编写一个小页面测试下,这个页面模拟的是订单提交页面,如果用户需要发票,需要填写发票信息,否则不能填写发票信息。复制代码代码如下: html xmlns=' http://www。w3。org/1999/XHTML ' head title jquery Extension/title script src=' http : jquery-1。3 .2 .js ' type=' text/JavaScript '/script script src=' http : jquery。银子欣。js ' type=' text/JavaScript '/script type=' text/JavaScript ' $(function(){ $(val($ .tofixddth(' 123 ',8));$('#InvoiceRequired ').单击(函数(){ $(').发票信息').setReadOnly(!这个。选中);});$('.发票信息').setReadOnly(false);} );/脚本/头体表单订单id :输入类型=' text ' id=' Order id '/br/输入类型=' checkbox ' id=' Invoice required '/Invoice info/div class=' Invoice info '在胜利牌:输入类型=' text ' id=' text ' id=' text ' 2 '/div输入类型=' button '值=' Submit '/表单/正文/html