$.fn.extend()和$.extend()的区别以及JQ插件开发

来源:互联网 发布:全平台主播数据榜单 编辑:程序博客网 时间:2024/06/05 09:40
目录:
  1.  $.fn.extend()和$.extend()的区别
  2. 插件开发的实例
  3.插件开发一步一步完美
        3.1 满足链式调用
        3.2 防止$污染
        3.3 $.fn.extend()定义插件的使用

  1.  $.fn.extend()和$.extend()的区别

        描述:我们可以把jQuery看成一个对象来理解,其实 $.extend()就是让我们可以为JQuery类本身添加静态方法,而$.fn.extend() 其中$.fn=  jQuery.fn = jQuery.prototype  (prototype 属性使我们有能力向对象添加属性和方法) 其实是让我们可以为 JQuery的类实例添加方法 ,比如:var obj=$("#btn")  表示一个jQuery获取的实际对象实例,这个时候obj就可以调用$.fn.extend()实现的方法

        ps:用Java类的思想来理解就是,$.fn.extend()实现的非静态方法,必须要有对象实例才能调用;而$.extend()实现的是静态方法,在类初始化的时候就以及调用了。

        so: $.fn.extend()实用于定义插件,$.extend()实用于扩展全局通用的JQuery函数,应用于全局。

2. 插件开发的实例
   2.1)插件代码:
  1. /**
  2. * Created by Andy Lau on 2017/8/7.
  3. */
  4. (function($) {
  5. $.fn.btnStyle = function (options) {
  6. var defOption = {
  7. "backgroundColor": "#000",
  8. "fontSize": 14,
  9. "color": "#fff",
  10. "border": "none",
  11. "borderRadius": "5px",
  12. "width": "120px",
  13. "height": "48px",
  14. "textAlign": "center",
  15. "lineHeight": "48px"
  16. };
  17. //如果用户输入参数为空,我们添加默认值
  18. $.each(defOption, function (k, v) {
  19. if (options[k] == null) {
  20. options[k] = v;
  21. }
  22. });
  23. //设置按钮颜色
  24. this.css("background-color", options.backgroundColor).css("fontSize", options.fontSize + "px").css("color", options.color).css("border", options.border).css("border-radius", options.borderRadius).css("width", options.width).css("height", options.height).css("text-align", options.textAlign).css("line-height", options.lineHeight);
  25. return this;
  26. };
  27. })(jQuery);
    2.2)插件的使用
  1. <!DOCTYPE html>
  2. <meta charset="utf-8">
  3. <html>
  4. <head>
  5. <script type="application/javascript" src="jquery-3.2.1.js"></script>
  6. <script type="application/javascript" src="plugin.js"></script>
  7. </head>
  8. <body>
  9. <div style="width: 100%;margin: 60px auto 0;padding-left: 60px">
  10. <div class="custom-btn">按钮</div>
  11. </div>
  12. </body>
  13. </html>
  14. <script>
  15. $(".custom-btn").btnStyle(
  16. {
  17. "backgroundColor":"#6f00d2",
  18. "color":"yellow"
  19. });
  20. </script>
    2.3)实现效果

  3.插件开发一步一步完美

        3.1 满足链式调用
              什么是链式调用呢,比如我们前面实例实例中的代码 
  1. this.css("background-color", options.backgroundColor).css("fontSize", options.fontSize + "px")
            因为有时候我们在定义插件以后,开发者可能需要添加其他的jq方法,如何能实现开发者链式添加就很方便了,比如代码如下:
      
  1. <script>
  2. $(".custom-btn").btnStyle(
  3. {
  4. "backgroundColor":"#6f00d2",
  5. "color":"yellow"
  6. }).addClass("className");
  7. </script>
        我们还想添加一个class类或者其他操作,开发者就可以x像上面那样使用
       
        3.2 防止$符号污染
             $符号污染的关键点在于作用域的问题,其实一开始那个插件我们可以这么些:
  1. $.fn.btnStyle = function (options) {
  2. var defOption = {
  3. "backgroundColor": "#000",
  4. "fontSize": 14,
  5. "color": "#fff",
  6. "border": "none",
  7. "borderRadius": "5px",
  8. "width": "120px",
  9. "height": "48px",
  10. "textAlign": "center",
  11. "lineHeight": "48px"
  12. };
  13. //如果用户输入参数为空,我们添加默认值
  14. $.each(defOption, function (k, v) {
  15. if (options[k] == null) {
  16. options[k] = v;
  17. }
  18. });
  19. //设置按钮颜色
  20. this.css("background-color", options.backgroundColor).css("fontSize", options.fontSize + "px").css("color", options.color).css("border", options.border).css("border-radius", options.borderRadius).css("width", options.width).css("height", options.height).css("text-align", options.textAlign).css("line-height", options.lineHeight);
  21. return this;
  22. };
    上面这样写插件的问题在于$符号没有局限于本插件中,可能你的工程下还引用了其他的jq插件,这个时候就有可能影响该插件中的$符号的使用,如果不是很理解"作用域",可以单独去学习了解一下。

         3.3 $.fn.extend()定义插件的使用

       前面我们使用的是 $.fn.方法名=function(params) 来定义插件,他的局限在于只能定义一个方法,但是我们一开始是说用$.fn.extend()来定义插件方法的,下面就是用这种形式来定义的,你可以看见他的优势在于你可以在内部定义多个方法(注意:方法用","分割)。
        
  1. (function ($) {
  2. $.fn.extend({
  3. //方法一
  4. btnStyle:function (options) {
  5. var defOption = {
  6. "backgroundColor": "#000",
  7. "fontSize": 14,
  8. "color": "#fff",
  9. "border": "none",
  10. "borderRadius": "5px",
  11. "width": "120px",
  12. "height": "48px",
  13. "textAlign": "center",
  14. "lineHeight": "48px"
  15. };
  16. //如果用户输入参数为空,我们添加默认值
  17. $.each(defOption, function (k, v) {
  18. if (options[k] == null) {
  19. options[k] = v;
  20. }
  21. });
  22. //设置按钮颜色
  23. this.css("background-color", options.backgroundColor).css("fontSize", options.fontSize + "px").css("color", options.color).css("border", options.border).css("border-radius", options.borderRadius).css("width", options.width).css("height", options.height).css("text-align", options.textAlign).css("line-height", options.lineHeight);
  24. return this;
  25. },
  26. //方法二
  27. newMethod:function () {
  28. }
  29. })
  30. })(jQuery);

    其实你还可以用对象的概念来设计你的插件比如像下面这样:
  1. (function ($) {
  2. $.fn.extend({
  3. initBtn:function(opt) {
  4. //判断传入参数类型是否为object类型
  5. if (typeof opt != "object") {
  6. alert('参数错误!');
  7. return;
  8. }
  9. //判断是否和button设置了id
  10. var id = $(this).attr("id");
  11. if(id==null||id==""){
  12. alert("要设定一个id!");
  13. }
  14. //将默认参数和传入参数合并,没有设定的参数以默认值为标准
  15. $.each(btnTool.getDefaultData(id), function (key, value) {
  16. if (opt[key] == null) {
  17. opt[key] = value;
  18. }
  19. });
  20. //设置button的样式
  21. btnTool.btnStyle(opt)
  22. }
  23. });
  24. })(jQuery);
  25. /*
  26. * 定义一个btnTool的类
  27. * 其中定义getDefaultData(id)和btnStyle(options)两个方法
  28. * */
  29. var btnTool={
  30. "getDefaultData":function (id) {
  31. var defOption = {
  32. "obj":id,
  33. "backgroundColor": "#000",
  34. "fontSize": 14,
  35. "color": "#fff",
  36. "border": "none",
  37. "borderRadius": "5px",
  38. "width": "120px",
  39. "height": "48px",
  40. "textAlign": "center",
  41. "lineHeight": "48px"
  42. };
  43. return defOption;
  44. },
  45. "btnStyle":function (options) {
  46. //设置按钮颜色
  47. $("#"+options.obj).css("background-color", options.backgroundColor).css("fontSize", options.fontSize + "px").css("color", options.color).css("border", options.border).css("border-radius", options.borderRadius).css("width", options.width).css("height", options.height).css("text-align", options.textAlign).css("line-height", options.lineHeight);
  48. return this;
  49. }
  50. };

    调用方式类似,代码如下:
  1. <script>
  2. $("#customBtn").initBtn(
  3. {
  4. "backgroundColor":"#6f00d2",
  5. "color":"yellow"
  6. });
  7. </script>

阅读全文
0 0