示例插件:打算选用一个动态生成的无序列表,让列表的前10项可见,剩下的项处于隐藏状态,使用一个简单的显示/隐藏导航控制隐藏项是否可见。
1,插件的结构
插件的基本结构,所有的Jquery插件都声明为jQuery.fn对象的方法:
jQuery.fn.showhidePlugin = function(){
//插件相关代码
}
我们使用如下代码使用这个插件:
$('.selector').showhidePlugin();
为了和已有插件保持一致,我建议在保存插件时采用jQuery.pluginname.js这种命名格式。
注意:我没有使用$别名,而是实用jQuery以避免任何可能的命名冲突。如果更喜欢实用$而不是Jquery ,可以像下面这样把插件代码封装在一个自执行的匿名函数中,就能够安全地在插件内使用$别名,不会引起任何问题。
(function($){
jQuery.fn.showhidePlugin = function(){
//插件相关代码
}
})(jQuery);
2,设定插件选项
通过传递给插件方法一个options参数,我们就可以让插件支持设置选项。我们使用一个JSon对象作为插件的默认选项。
我们使用一个JSON对象作为插件的默认选项,这个插件有3个默认选项----numShown、showText和hideText。默认设置在插件内部初始化,运行时传递进来的用户选项会覆盖掉默认设置。
(function($){
jQuery.fn.showhidePlugin = function(options){
//设定默认值,用逗号分隔选项
var defaults = {
numShown:10,
showText:'Show More Links',
hideText:'Hide Links'
}
};
})(jQuery);
接下来,使用$.extend方法合并默认选项和用户选项。如果调用时提供了用户选项,它们将覆盖掉插件内部声明的默认选项。
.extend()允许你使用一个或多个对象扩展基准对象,扩展的方式是依序将右边的对象合并到基准对象
(function($){
jQuery.fn.showhidePlugin = function(options){
//设定默认值,用逗号分隔选项
var defaults = {
numShown:10,
showText:'Show More Links',
hideText:'Hide Links'
}
var options = $.extend(defaults,options);
};
})(jQuery);
3,创建插件
接下来将混合使用jQuery脚本和Javascript原生脚本实现插件的主体功能。这个插件将适用于任何无序列表。我们使用numShown变量的值截断这个列表,然后添加隐藏和显示链接来切换隐藏项的显示状态。
(1)添加一个.each()方法迭代选择器匹配的元素,并返回this对象。这一步非常重要,所有的插件都要有这一步才能正常工作,在一个无序列表上应用该插件时,.each方法就会遍历那个无序列表的所有项
(2)创建两个变量--o和obj. o引用options,obj引用$(this),有了这两个变量,后面引用起它们来就省很多事,变量obj中保存的是包裹着当前无序列表的jQuery对象
插件jquery.showhidePlugin.js完整代码:
1 /** 2 * Created by Administrator on 2017/7/14 0014. 3 */ 4 /*调用方式 5 $('.big-list').showhidePlugin({ 6 numShown:10, 7 showText:'显示更多的链接', 8 hideText:'隐藏部分链接' 9 }); 10 11 * */ 12 (function($){ 13 jQuery.fn.showhidePlugin = function(options){ 14 15 //设置默认值,用逗号分隔选项 16 var defaults = { 17 numShown:10, 18 showText:'show more links', 19 hideText:'Hide Links' 20 }; 21 22 var options = $.extend(defaults,options); 23 return this.each(function(){ 24 var o = options; 25 var obj = $(this); 26 //确定项数并计算被隐藏项的数目 27 var pLength = obj.children().length; //所有的链接个数 28 var numHidden = pLength-o.numShown; //需要隐藏的链接个数 29 var pList = obj.children(); 30 31 //设置显示/隐藏链接 32 var shLink = "<a href='#' class='view'>"+o.showText+"</a>"; 33 if(pLength>o.numShown){ //如果链接总数大于用户要设置显示的个数,---就把showText文字显示在列表上面 34 jQuery(shLink).insertBefore(obj); 35 } 36 37 //循环ul下的所有li 38 pList.each(function(index){ 39 if(index < o.numShown){ 40 jQuery(pList[index]).show(); 41 }else{ 42 //给所有隐藏的元素加上class--hidden 43 jQuery(pList[index]).hide(); 44 jQuery(pList[index]).addClass('hidden'); 45 } 46 }); 47 48 //切换文本 49 jQuery("a.view").live('click',function(e){ 50 if (jQuery(this).text()==o.showText){ 51 jQuery(this).text(o.hideText); 52 }else{ 53 jQuery(this).text(o.showText); 54 } 55 jQuery('.hidden').toggle(); //切换(隐藏/显示状态) 56 return false; //使用return false 避免触发click事件的默认行为(重定向) 57 }); 58 }); 59 } 60 })(jQuery);
插件调用示例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jquery插件的编写</title> </head> <body> <ul class="big-list"> <li>Test1.</li> <li>Test2.</li> <li>Test3.</li> <li>Test4.</li> <li>Test5.</li> <li>Test6.</li> <li>Test7.</li> <li>Test8.</li> <li>Test9.</li> <li>Test10.</li> <li>Test11.</li> <li>Test12.</li> <li>Test13.</li> <li>Test14.</li> <li>Test15.</li> <li>Test16.</li> <li>Test17.</li> <li>Test18.</li> <li>Test19.</li> <li>Test20.</li> <li>Test21.</li> <li>Test22.</li> <li>Test23.</li> <li>Test24.</li> <li>Test25.</li> </ul> </body> <script src="jQuery/1.7.2/jquery.min.js"></script> <script src="js/jquery.showhidePlugin.js"></script> <script> $(function(){ $('.big-list').showhidePlugin({ numShown:10, showText:'显示更多的链接', hideText:'隐藏链接' }); }); </script> </html>