jQuery $.fn.extend()和$.extend()详解

尽管现在有大量非常棒的插件可供我们免费下载和使用,但是在实际开发中,我们有时候需要根据项目需求自己来定义一个插件,提供给团队其他人复用。学习使用 jQuery 并不难,因为它非常简单。但是如果你想要使能力上升一个台阶,学会编写一个属于自己的 jQuery 插件是一个不错的办法。

从广义上来说,jQuery 插件可以分为以下 3 种。
  • 方法类插件;
  • 函数类插件;
  • 选择器插件。

其中的选择器插件,很少有人会去开发使用,因为 jQuery 内置的选择器已经足够完善了,所以我们只会介绍方法类插件和函数类插件。

jQuery $.fn.extend()方法类插件

在 jQuery 中,我们可以使用$.fn.extend()方法来定义一个方法类插件。方法类插件就是首先你使用 jQuery 选择器来获取一个 jQuery 对象,然后针对你获取的这个 jQuery 对象添加一个方法。

语法:

(function($){
    $.fn.extend({
        "插件名": function(参数){
            ……
        }
    });
})(jQuery);


(function(){})() 是 JavaScript 立即执行函数,这种语法在实际开发中经常用到。

$.fn.extend({
    "插件名": function(参数){
        ……
    }
});

如果不考虑其他情况,仅仅使用上面这段代码,其实也可以定义 jQuery 插件。但是为什么我们不这样做,而要在外面套一个立即执行函数呢?

之前也说过,这是因为很多其他的 JavaScript 库都会用到$这个符号,所以使用$.fn.extend()来定义插件的时候,就有可能受到其他 JavaScript 库中$变量的影响。我们在外面套一个如下所示的立即执行函数,是为了让$变量只属于这个立即执行函数的作用域,从而避免受到其他 JavaScript 库的影响。

(function($){
    ……
})(jQuery);


举例:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="js/jquery-1.12.4.min.js"></script>
    <script>
        //定义插件
        (function(){
            $.fn.extend({
                //插件名为“changeColor”,有两个参数:fgcolor、bgcolor
                "changeColor":function(fgcolor,bgcolor){
                    //定义鼠标指针移入移出效果
                    $(this).mouseover(function () {
                        $(this).css({"color":fgcolor,"background":bgcolor});
                    }).mouseout(function () {  
                        $(this).css({"color":"black","background":"white"});
                    });
                    //返回jQuery对象,以便链式调用
                    return $(this);
                }
            })
        })(jQuery);
    </script>
    <script>
        $(function () {
            //调用插件
            $("h1").changeColor("red","#F1F1F1")
        })
    </script>
</head>
<body>
    <h1>C语言中文网</h1>
</body>
</html>
默认情况下,预览效果如图 1 所示。、
默认效果
图 1:默认效果

当鼠标指针移到元素上时,预览效果如图 2 所示。
鼠标指针移到元素上时的效果
图 2:鼠标指针移到元素上时的效果

在这个例子中,我们使用$.fn.extend()方法定义了一个名为“changeColor”的插件。该插件接收两个参数:fgcolor、bgcolor。其中,fgcolor 是“字体颜色”,bgcolor 是“背景颜色”。

在插件的内部,我们定义了元素在鼠标指针移入和鼠标指针移出时的颜色变化。在插件的最后,我们还需要使用 return$(this) 返回当前的 jQuery 对象,从而保持链式调用的功能。

所谓“封装 jQuery 插件”,就是把功能封装成一个函数而已,小伙伴们别想得那么复杂。

$.fn.extend({
    "插件名":function(参数){
        ……
    }
})

事实上,jQuery 插件的定义方式有两种,上面这段代码是其中一种,还有一种如下所示。这两种定义方式其实是等价的。

$.fn.插件名 = function(参数){
    ……
}

不过,上面这个例子的传参方式只适用于参数比较少的情况。如果参数比较多,我们应该定义一个参数对象,然后把需要传给插件的参数都放在参数对象中。优化后的代码如下:

举例:优化传参
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="js/jquery-1.12.4.min.js"></script>
    <script>
        //定义插件
        (function(){
            $.fn.extend({
                "color":function(options){
                    $(this).mouseover(function () {
                        $(this).css({"color":options.fgcolor,"background":options.bgcolor});
                    }).mouseout(function () {  
                        $(this).css({"color":"black","background":"white"});
                    });
                    return $(this);
                }
            })
        })(jQuery);
    </script>
    <script>
        $(function () {
            //调用插件
            $("h1").color({ fgcolor: "red",bgcolor: "#F1F1F1" });
        })
    </script>
</head>
<body>
    <h1>C语言中文网</h1>
</body>
</html>
默认情况下,预览效果如图 3 所示。
默认效果
图 3:默认效果

当鼠标指针移到元素上时,预览效果如图 4 所示。
鼠标指针移到元素上时的效果
图 4:鼠标指针移到元素上时的效果

可能有些小伙伴又会问了:“很多插件的参数都有默认值,如果我也想设置默认值,又该怎么办呢?”接下来,我们对上面的代码作进一步优化,请看下面的例子。

举例:设置参数的默认值
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="js/jquery-1.12.4.min.js"></script>
    <script>
        //定义插件
        (function(){
            $.fn.extend({
                "color":function(options){
                    //设置参数的默认值
                    var defaults = {
                        fgcolor: "hotpink",bgcolor: "lightskyblue"
                    };
                    var options = $.extend(defaults,options);

                    $(this).mouseover(function () {
                        $(this).css({"color":options.fgcolor,"background":"white"});
                    });
                    return $(this);
                }
            })
        })(jQuery);
    </script>
    <script>
        $(function () {
            //调用插件
            $("h1").color();
        })
    </script>
</head>
<body>
    <h1>C语言中文网</h1>
</body>
</html>
默认情况下,预览效果如图 5 所示。
默认效果
图 5:默认效果

当鼠标指针移到元素上时,预览效果如图 6 所示。
鼠标指针移到元素上时的效果
图 6:鼠标指针移到元素上时的效果

想要设置参数的默认值,我们需要在插件内部另外定义一个选项对象,然后使用$.extend()方法将参数对象 options 和选项对象 defaults 合并成一个对象。$.extend()方法允许你使用一个或多个对象来扩展一个基准对象,扩展的方式是依序将右边的对象合并到基准对象(也就是左边第一个对象)。

最后,如果想要同时封装多个 jQuery 插件,我们可以采用以下的语法。

(function($){
    $.fn.extend({
        "插件1": function(参数){
            ……
        },
        "插件2": function(参数){
            ……
        },
        "插件3": function(参数){
            ……
        }
    });
})(jQuery);

jQuery $.extend()函数类插件

在 jQuery 中,我们可以使用$.extend()方法来定义一个函数类插件。此时小伙伴们就会问了:“之前不是说$.extend()方法是用来定义工具函数的吗?怎么它还可以用来定义插件呢?”实际上,“工具函数”和“函数类插件”就是同一个东西。

语法:

(function($){
    $.extend({
        "插件名": function(){
            ……
        }
    });
})(jQuery)

函数类插件的语法与方法类插件的语法差不多,仅仅是把$.fn.extend()换成了$.extend()

举例:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="js/jquery-1.12.4.min.js"></script>
    <script>
        (function($){
            $.extend({
                "maxNum": function(m,n){
                    return (m>n)?m:n;
                }
            });
        })(jQuery)
        $(function () {
            var result=$.maxNum(10,5)
            console.log("最大值是:"+result);
        })
    </script>
</head>
<body>
</body>
</html>
控制台输出结果如图 7 所示。
函数类插件
图 7:函数类插件

从这个例子可以看出,函数类插件与方法类插件在定义和调用方式上都是差不多的,不过函数类插件使用的是$.extend()方法,而方法类插件使用的是$.fn.extend()方法。此外,两者最大的不同在于:函数类插件是在全局对象下定义一个方法,而方法类插件是在所获取的 jQuery 对象下定义一个方法。

方法类插件可以使用 jQuery 中功能强大的选择器,调用方式一般是$(选择器).插件名()。而函数类插件不可以使用 jQuery 选择器,其调用方式一般是$.函数名()。在实际开发中,我们所说的 jQuery 插件一般指的是方法类插件,小伙伴们一定要记住这一点。

最后,我们来总结一下 jQuery 插件,以下几点是比较重要的。
  • 插件的文件命名必须严格按照 jquery.[插件名].js jquery.[插件名].min.js的格式。
  • 在插件的最后必须使用 return$(this) 来返回当前的 jQuery 对象,以便保持链式调用的功能。
  • 无论是哪一种插件,定义的结尾都必须以分号结束,否则文件被压缩后,可能会出现错误。
  • 方法类插件使用的是$.fn.extend()方法,而函数类插件使用的是$.extend()方法。我们常说的 jQuery 插件,指的都是方法类插件。
  • $.extend()方法是在 jQuery 全局对象上扩展一个方法,而$.fn.extend()方法是在选择器上扩展一个方法。因此定义工具函数应该用$.extend()方法,而定义 jQuery 插件应该用$.fn.extend()方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


问题背景 最近小伙伴提了一个希望提高后台下拉列表可操作性的需求,原因是下拉列表选项过多,每次下拉选择比较费时费力且容易出错,硬着头皮啃了啃前端知识,网上搜寻了一些下拉列表实现的资料,这里总结一下。 P
// n位随机数生成 function randomNum(n) { let sString = &quot;&quot;; let strings = &quot;abcdefghijklmnopq
HTML是HyperText Markup Language的简称,中文名称:超文本标记语言,它是一种用于创建网页的 标准标记语言
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
JavaScript 是脚本语言,是一种解释性脚本语言(代码不进行预编译)
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 一名开发者或设计师通常可以在一秒内指出优秀的设计,但对于糟糕的设计只需最多半
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 Excel是我们办公中常用的工具 ,它几乎能为我们处理大部分数据,友好的交互
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/8-tips-for-an-awesome-sign
本文由葡萄城技术团队于博客园翻译并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 如果我们自己编写从URL中分析和提取元素的代码,那么有可能会比较痛苦
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/what-is-deno-and-will-it-r
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/4-reasons-to-use-sass-in-y
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/vuejs-3-0-0-beta-features-
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/sessionstorage-and-localst
一直以来,JavaScript使用数组和对象来定义和存放结构化数据, 在这篇文章中,我们将一起深挖另一种对象Map的一切,我们将会去了解它是什么、如何遍历、都包括什么属性和方法以及优缺点是什么。
由于CSS的出现,现在的网站风格已经与它们很早之前的样子有了很大的不同。CSS的出现为原本平平无奇的网页注入了活力。这也是网站的用户体验得到进一步进化的原因。这可能就是当今几乎所有的网站或多或少都在使
自苹果推出了iPhone应用商店以来,App成为了我们生活中不可或缺的一部分,而对于实体业务也是如此,现在各行业都在推出自己的App,但有没有人想过这样一种场景,如果自己的潜在客户还没有安装你的App
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/10-top-chrome-extensions-f
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/do-your-buttons-lead-or-mi
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前段时间在开发【葡萄城社区】公众号时有一个功能是需要用网页授权认证地址生成二
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 HTML5的发展改变了互联网技术趋势,前端热度依旧不减,所以对于应用开发人员