5月1日 呆在实验室 接着学习的脚步 记录学习的脚步 还有2个月 学生生涯即将结束 十分珍惜此时的宁静 看书、听歌、打球、喝酒 时间只受自己支配 真想爆一句粗口 太XX爽了 呵呵
好吧 还是回到记录的脚步上来
按照jquery官方所说
jquery插件机制是一种用于扩展jquery原型对象方法的简单方式,通过扩展原型对象,可以让jquery的所有对象都继承你自定义的方法。
在自定义插件之前 有几个知识点 我们是必须要搞清楚的
1.iife--立即执行函数表达式
看看官网解释
简单地说 就是定义一个表达式 不过这个表达式中包含一个函数
我们知道在script的范围里 只要不是定义在函数中的表达式 在script第一次加载的时候都会从上至下的执行
所以这个IIFE的表达式也会立即执行
看个例子
<!DOCTYPE html> <html><head> <script src="http://code.jquery.com/jquery-latest.js"></script> </head><body> <div id="log"></div> <script> (function(a){ $("#log").text("使用立即调用函数表达式"+a); })(5); </script> </body></html>
界面输出
通过输出可以看到 IIFE执行了 上面的例子中 看到IIFE的写法如下
(function(形参){需要处理的代码})(实参);
2.$.与$.fn,的区别
$.相当于jquery的Object类的静态部分,此部分中的方法与属性都无需jquery对象即可直接使用 例如 $.extend()
$.fn.相当于jquery的Object类的实例部分,此类中的方法 都需要先有jquery对象之后 才能使用$.fn.的方法 例如 $("a").attr()
还有一点需要注意 jquery的所有对象都继承了 Object类
所以 前面所说的 通过扩展愿意模型 可以让jquery的所有对象都继承你自定义的方法 即是往Object的静态部分和实例部分添加方法和属性即可
有了上面的知识 自定义插件就比较简单了
不过 有些准则可能需要注意一下
a:在你自定义的插件中,最好只留一个对外的方法接口 这样可以避免过多的方法名与其他插件的方法重复 通过传递的参数 决定执行自定义插件中的哪一块代码
b:在自定义的插件方法中 最好把jquery对象返回 这样能够保持jquery的链式操作
c:在自定义的插件中 提供一些默认属性 同时也可让用户自定义属性的值 让你的插件更具扩展性
好吧 啰嗦了那么多 看看实例吧
在此插件中 封装一个遍历多层json对象的方法 将json对象转换为特定的文本格式显示
1.新建一个iteratorJson.js文件 封装的代码如下
//建立一个立即调用函数表达式 封装自定义的方法 //这样可以使封装的方法内部的变量、表达式与外部的变量、表达式互补干扰 //下面的jQuery为实参 $为形参 这样做的目的是保持代码的一致性 与 (function($){ //往jquery的Object的实例部分添加方法 $.fn.iteratorJson=function(choice,data){ //choice用于判断是否深层迭代json对象 if(choice===true){ //进行深层迭代 即将json对象中的json对象都转换为文本 return iteratorDeep(data); }else{ return iteratorNonDeep(data); } }; //下面定义的函数不对外调用 //深度迭代 function iteratorDeep(data){ //定义数组 var content=[]; $.each(data,function(key,val){ var next=key+":"; next+=$.isPlainObject(val)?iteratorDeep(val):val; //向数组中添加内容 content.push("["+next+"]"); }); //转换数组为文本 return "{"+content.join(",")+"}"; } //不进行深度迭代 function iteratorNonDeep(data){ var content=[]; $.each(data,function(key,val){ var next=key+":"+val; content.push("["+next+"]"); }); return "{"+content.join(",")+"}"; } //默认设置 var defaults={ "background-color":"red", "font-size":"20" }; $.fn.chainCss = function(options){ //将default和options的设置值合并到settings里面 var settings=$.extend({},defaults,options); //this指的是jquery对象 因为新添加的方法chainCss也属于jquery对象的方法 return this.css(settings); }; })(jQuery);
2.测试界面 iteratorJsonTest.html
<html> <head> <script type="text/javascript" src="jquery-1.9.1.js"></script> <!-- 引入自定义的插件 --> <script type="text/javascript" src="iteratorJson.js"></script> <script type="text/javascript"> $(function(){ //创建数组 var testJson={name:"刘德华",age:54,loveFemale:{name:"朱丽倩",age:50}}; //测试添加的方法 $("#disJson").text($(document).iteratorJson(true,testJson)); $("#disJson2").text($(document).iteratorJson(false,testJson)); //测试新添加的方法 console.log($("#disJson").chainCss({"background-color":"purple"}).width()); }); </script> </head> <body> <div id="disJson"></div> <div id="disJson2"></div> </body> </html>
3.效果如下