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

目录:
  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. charset="utf-8">
  2. type="application/javascript" src="jquery-3.2.1.js">
  3. type="application/javascript" src="plugin.js">
  4. style="width: 100%;margin: 60px auto 0;padding-left: 60px">
  5. class="custom-btn">按钮
  •     2.3)实现效果
    $.fn.extend()和$.extend()的区别以及JQ插件开发_第1张图片
      3.插件开发一步一步完美

            3.1 满足链式调用
                  什么是链式调用呢,比如我们前面实例实例中的代码 
    
    
    1. this.css("background-color", options.backgroundColor).css("fontSize", options.fontSize + "px")
                因为有时候我们在定义插件以后,开发者可能需要添加其他的jq方法,如何能实现开发者链式添加就很方便了,比如代码如下:
          
    
    
            我们还想添加一个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>

    你可能感兴趣的:(front-end(js))