编写第一个jQuery插件

时间:2021-03-02 14:39:38

  示例插件:打算选用一个动态生成的无序列表,让列表的前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>