Processing math: 100%

JQ_插件开发

在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式。这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了。

使用相同的设计模式和架构也让修复bug或者二次开发更容易。一套经过验证的架构可以保证我的插件不出大的问题,不论插件简单还是复杂。

我在这里分享10条我总结的经验。



1. 把你的代码全部放在闭包里面

这是我用的最多的一条。但是有时候在闭包外面的方法会不能调用。不过你的插件的代码只为你自己的插件服务,所以不存在这个问题,你可以把所有的代码都放在闭包里面。而方法可能应该放在Prototype方法内部,我们后面会讲到这一点。

(function()//codehere)(jQuery);2.jQueryextendvardefaultSettings=mode:Pencil,lineWidthMin:0,lineWidthMax:10,lineWidth:2;settings=.extend({}, defaultSettings, settings || {});

3. 使用返回一个元素

JavaScript/jQuery有一个很好的特点就是可以进行方法级联,所以我们不应该破坏这个特性,始终在方法中返回一个元素。我在我的每一个jQuery插件中都遵守这一条。

.fn.wPaint=function(settings)returnthis.each(function()varelem=$(this);//runsomecodehere4.prototypevardefaultSettings=mode:Pencil,lineWidthMin:0,lineWidthMax:10,lineWidth:2;.fn.wPaint = function(settings)
{
settings = this”,我们可以向别的闭包传递正确的引用。我们也可能需要向别的方法传入 thisthis 这个名字是可以改的,任意的变量名都可以。

Canvas.prototype =
{
generate: function()
{
//some code

var this)
{
//won’t know what ”this” is.
//use (“#container”).wPaint(“lineWidth”);
.fn.wPaint = function(option, settings)
{
if(typeof option === ’object’)
{
settings = option;
}
else if(typeof option === ’string’)
{
if(
this.data(‘_wPaint_canvas’) &&
defaultSettings[option] !== undefined
){
var canvas = this.data(‘_wPaint_canvas’);

if(settings)
{
canvas.settings[option] = settings;
return true;
}
else
{
return canvas.settings[option];
}
}
else
return false;
}

return this.each(function()
{
//run some code here
}
}

以上十条基本上覆盖了jQuery插件开发的核心,并且可以作为开发的模板。有一套基本的代码可以极大的缩短你的开发时间,并且能够让你设计插件架构的时候更自信。

jQuery插件的开发包括两种:
一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法。jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法。下面就两种函数的开发做详细的说明。

1、类级别的插件开发
类级别的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法。典型的例子就是.AJAX()jQuery1.1jQuery.foo=function()alert(Thisisatest.Thisisonlyatest.keleyi.com);;1.2jQuery.foo=function()alert(Thisisatest.Thisisonlyatest.);;jQuery.bar=function(param)alert(Thisfunctiontakesaparameter,whichis"+param+".);;:jQuery.foo();jQuery.bar();.foo();.bar(bar);1.3使jQuery.extend(object)jQuery.extend(foo:function()alert(Thisisatest.Thisisonlyatest.);,bar:function(param)alert(Thisfunctiontakesaparameter,whichis"+param+".););1.4使jQuery使javaScriptjQueryjQuery.myPlugin=foo:function()alert(Thisisatest.Thisisonlyatest.);,bar:function(param)alert(Thisfunctiontakesaparameter,whichis"+param+".);;.myPlugin.foo(); 
.myPlugin.bar(baz);使21(function(){ 
.fn.extend({  pluginName:function(opt,callback){  // Our plugin implementation code goes here. 柯 乐 义  }  })  })(jQuery);   形式2: (function() { 
.fn.pluginName = function() {  // Our plugin implementation code goes here. keleyi.com };  })(jQuery);   上面定义了一个jQuery函数,形参是,函数定义完成之后,把jQuery这个实参传递进去.立即调用执行。这样的好处是,我们在写jQuery插件时,也可以使用,prototype.2.1JQuery.fn.doSomething() 和 .fn.undoSomething()使highlight.fn.hilight = function() { 
// Our plugin implementation code goes here. keleyi.com
}; 
我们的插件通过这样被调用:
.fn.hilight = function(options) { 
var defaults = { 
foreground: 'red', 
background: 'yellow' 
}; 
// Extend our default options with those provided. 
var opts = .extend(defaults, options);  // Our plugin implementation code goes here.  };  我们的插件可以这样被调用:('#myDiv').hilight({ 
foreground: 'blue' 
}); 




2.3 暴露插件的默认设置
我们应该对上面代码的一种改进是暴露插件的默认设置。这对于让插件的使用者更容易用较少的代码覆盖和修改插件。接下来我们开始利用函数对象。 

// plugin definition 
.fn.hilight=function(options)//Extendourdefaultoptionswiththoseprovided.//Notethatthefirstargtoextendisanemptyobject//thisistokeepfromoverridingour"defaults"object.varopts=$.extend(,$.fn.hilight.defaults,options);//Ourpluginimplementationcodegoeshere.;//plugindefaultsaddedasapropertyonourpluginfunction.fn.hilight.defaults = { 
foreground: 'red', 
background: 'yellow' 
}; 
现在使用者可以包含像这样的一行在他们的脚本里:
//这个只需要调用一次,且不一定要在ready块中调用
.fn.hilight.defaults.foreground=blue;使('#myDiv').hilight(); 


如你所见,我们允许使用者写一行代码在插件的默认前景色。而且使用者仍然在需要的时候可以有选择的覆盖这些新的默认值:
// 覆盖插件缺省的背景颜色 
.fn.hilight.defaults.foreground=blue;//...//使('.hilightDiv').hilight(); 
// ... 
// 通过传递配置参数给插件方法来覆盖缺省设置 
.fn.hilight = function(options) { 
// iterate and reformat each matched element 
return this.each(function() { 
var this=(this); 
// ... 
var markup = this.html();//callourformatfunctionmarkup=.fn.hilight.format(markup); 
this.html(markup);  });  };  // define our format function.fn.hilight.format = function(txt) { 
return '<strong>' + txt + '</strong>'; 
}; 

我们很容易的支持options对象中的其他的属性通过允许一个回调函数来覆盖默认的设置。这是另外一个出色的方法来修改你的插件。这里展示的技巧是进一步有效的暴露format函数进而让他能被重新定义。通过这技巧,是其他人能够传递他们自己设置来覆盖你的插件,换句话说,这样其他人也能够为你的插件写插件。 
考虑到这个篇文章中我们建立的无用的插件,你也许想知道究竟什么时候这些会有用。一个真实的例子是Cycle插件.这个Cycle插件是一个滑动显示插件,他能支持许多内部变换作用到滚动,滑动,渐变消失等。但是实际上,没有办法定义也许会应用到滑动变化上每种类型的效果。那是这种扩展性有用的地方。 Cycle插件对使用者暴露"transitions"对象,使他们添加自己变换定义。插件中定义就像这样:
.fn.cycle.transitions=//...;使Cycle2.5debugdebugfirebug(function() { 
// plugin definition 
.fn.hilight=function(options)debug(this);//...;//privatefunctionfordebuggingfunctiondebug(obj) { 
if (window.console && window.console.log) 
window.console.log('hilight selection count: ' + .fn.hilight = function(options) { 
// ... 
// build main options before element iteration 
var opts = .extend(,.fn.hilight.defaults, options); 
return this.each(function() { 
var this=(this); 
// build element specific options 
var o = .meta?.extend({}, opts, this.data()):opts;//....MetadataoptionsJQuery.extend"markup,markupjQuery.foo();.foo(); 

<!-- markup --> 
<div class="hilight { background: 'red', foreground: 'white' }"> 
Have a nice day! 
</div> 
<div class="hilight { foreground: 'orange' }"> 
Have a nice day! 
</div> 
<div class="hilight { background: 'green' }"> 
Have a nice day! 
</div> 
现在我们能高亮哪些div仅使用一行脚本:
(.hilight).hilight();2.7使//(function() { 
// 插件的定义 
.fn.hilight=function(options)debug(this);//buildmainoptionsbeforeelementiterationvaropts=$.extend(,$.fn.hilight.defaults,options);//iterateandreformateachmatchedelementreturnthis.each(function()$this=$(this);//buildelementspecificoptionsvaro=$.meta?$.extend(,opts,$this.data()):opts;//updateelementstyles$this.css(backgroundColor:o.background,color:o.foreground);varmarkup=$this.html();//callourformatfunctionmarkup=$.fn.hilight.format(markup);$this.html(markup););;//debuggingfunctiondebug(obj) { 
if (window.console && window.console.log) 
window.console.log('hilight selection count: ' + obj.size());  };  // 定义暴露format函数.fn.hilight.format = function(txt) { 
return '<strong>' + txt + '</strong>'; 
}; 
// 插件的defaults 
$.fn.hilight.defaults = { 
foreground: 'red', 
background: 'yellow' 
}; 
// 闭包结束 
})(jQuery); 

这段设计已经让我创建了强大符合规范的插件。我希望它能让你也能做到。


3、总结
jQuery为开发插件提拱了两个方法,分别是:
jQuery.fn.extend(object); 给jQuery对象添加方法。
jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。

3.1 jQuery.fn.extend(object);
fn 是什么东西呢。查看jQuery代码,就不难发现。
jQuery.fn = jQuery.prototype = { 
init: function( selector, context ) {//....  
//...... keleyi.com
}; 
原来 jQuery.fn = jQuery.prototype.对prototype肯定不会陌生啦。虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便。jQuery便是一个封装得非常好的类,比如我们用 语句 .fn.extend({ 
alertWhileClick:function(){ 
(this).click(function(){  alert($(this).val());  });  }  });("#input1").alertWhileClick(); //页面上为:<input id="input1" type="text"/>
.extend({ 
add:function(a,b){return a+b;} 
}); 
便为 jQuery 添加一个为 add 的 “静态方法”,之后便可以在引入 jQuery 的地方,使用这个方法了,$.add(3,4); //return 7

posted @   彪悍的代码不需要注释  阅读(405)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
39
0
点击右上角即可分享
微信分享提示