jQuery扩展_动力节点Java学院整理
当我们使用jQuery对象的方法时,由于jQuery对象可以操作一组DOM,而且支持链式操作,所以用起来非常方便。
但是jQuery内置的方法永远不可能满足所有的需求。比如,我们想要高亮显示某些DOM元素,用jQuery可以这么实现:
$('span.hl').css('backgroundColor','#fffceb').css('color','#d85030'); $('pa.hl').css('backgroundColor','#fffceb').css('color','#d85030');
总是写重复代码可不好,万一以后还要修改字体就更麻烦了,能不能统一起来,写个highlight()方法?
$('span.hl').highlight(); $('pa.hl').highlight();
答案是肯定的。我们可以扩展jQuery来实现自定义方法。将来如果要修改高亮的逻辑,只需修改一处扩展代码。这种方式也称为编写jQuery插件。
编写jQuery插件
给jQuery对象绑定一个新方法是通过扩展$.fn对象实现的。让我们来编写第一个扩展——highlight1():
$.fn.highlight1=function(){ //this已绑定为当前jQuery对象: this.css('backgroundColor','#fffceb').css('color','#d85030'); returnthis; }
注意到函数内部的this在调用时被绑定为jQuery对象,所以函数内部代码可以正常调用所有jQuery对象的方法。
对于如下的HTML结构:
什么是jQuery
jQuery是目前最流行的JavaScript库。
来测试一下highlight1()的效果:
'usestrict'; $('#test-highlight1span').highlight1();
什么是jQuery
jQuery是目前最流行的JavaScript库。
细心的童鞋可能发现了,为什么最后要returnthis;?因为jQuery对象支持链式操作,我们自己写的扩展方法也要能继续链式下去:
$('span.hl').highlight1().slideDown();
不然,用户调用的时候,就不得不把上面的代码拆成两行。
但是这个版本并不完美。有的用户希望高亮的颜色能自己来指定,怎么办?
我们可以给方法加个参数,让用户自己把参数用对象传进去。于是我们有了第二个版本的highlight2():
$.fn.highlight2=function(options){ //要考虑到各种情况: //options为undefined //options只有部分key varbgcolor=options&&options.backgroundColor||'#fffceb'; varcolor=options&&options.color||'#d85030'; this.css('backgroundColor',bgcolor).css('color',color); returnthis; }
对于如下HTML结构:
什么是jQueryPlugin
编写jQueryPlugin可以用来扩展jQuery的功能。
来实测一下带参数的highlight2():
'usestrict'; $('#test-highlight2span').highlight2({ backgroundColor:'#00a8e6', color:'#ffffff' });
什么是jQueryPlugin
编写jQueryPlugin可以用来扩展jQuery的功能。
对于默认值的处理,我们用了一个简单的&&和||短路操作符,总能得到一个有效的值。
另一种方法是使用jQuery提供的辅助方法$.extend(target,obj1,obj2,...),它把多个object对象的属性合并到第一个target对象中,遇到同名属性,总是使用靠后的对象的值,也就是越往后优先级越高:
//把默认值和用户传入的options合并到对象{}中并返回: varopts=$.extend({},{ backgroundColor:'#00a8e6', color:'#ffffff' },options);
紧接着用户对highlight2()提出了意见:每次调用都需要传入自定义的设置,能不能让我自己设定一个缺省值,以后的调用统一使用无参数的highlight2()?
也就是说,我们设定的默认值应该能允许用户修改。
那默认值放哪比较合适?放全局变量肯定不合适,最佳地点是$.fn.highlight2这个函数对象本身。
于是最终版的highlight()终于诞生了:
$.fn.highlight=function(options){ //合并默认值和用户设定值: varopts=$.extend({},$.fn.highlight.defaults,options); this.css('backgroundColor',opts.backgroundColor).css('color',opts.color); returnthis; } //设定默认值: $.fn.highlight.defaults={ color:'#d85030', backgroundColor:'#fff8de' }
这次用户终于满意了。用户使用时,只需一次性设定默认值:
$.fn.highlight.defaults.color='#fff'; $.fn.highlight.defaults.backgroundColor='#000';
然后就可以非常简单地调用highlight()了。
对如下的HTML结构:
如何编写jQueryPlugin
编写jQueryPlugin,要设置默认值,并允许用户修改默认值,或者运行时传入其他值。