jQuery插件开发

目录

1.什么是插件?

2.jQuery的插件主要分为3种类型

1)封装对象方法的插件(原型扩展)主要的开发方式

2)封装全局函数的插件(静态扩展)

3)选择器插件

3.命名规范

1)jquery.插件名.js

2)jquery.插件名.min.js

4.插件中的冲突

1)JQ让渡方法,让JQ让出对$的占用

2)深度让渡

5.在插件中使用闭包

6.jQuery的插件机制

1)对jQuery函数prototype函数的别名(jQuery.fn)进行(原型)扩展。

2)采用jQuery.extend()方法进行(静态)扩展。

7.插件的固定格式:

8.配置参数

1)如果传的参数是两个以上,最好将参数设置成对象

2)设置默认值

9.命名空间

1.什么是插件?

jQuery插件是对jQuery框架利用原型的扩展。

插件通常是一个完备功能的封装,它是JQ功能的一个补充或扩展。

注意:开发JQ插件,该插件是依赖jQuery的必须先引入jQuery,再引入插件。

2.jQuery的插件主要分为3种类型

1)封装对象方法的插件(原型扩展)主要的开发方式

这种是大多数采用的方法。操作原型,对jQuery框架入侵性较小,例如:parent()方法,append()方法和addClass()方法等DOM操作方法。

2)封装全局函数的插件(静态扩展)

将方法或插件直接挂到对象/类上。

常见如:$.trim()方法和$.now()方法,都是jQuery内部作为全局函数的插件附加到内核上去的。

3)选择器插件

对jQuery选择DOM的补充或扩展。

虽然jQuery的选择器功能十分强大,但有时用户的特殊需求,还是会扩展一些自己喜欢的选择器,例如用:color(“red”)来把选择匹配的元素的文字样式一次性设置为红色。

3.命名规范

1)jquery.插件名.js

开发模式

2)jquery.插件名.min.js

压缩格式 

4.插件中的冲突

1)JQ让渡方法,让JQ让出对$的占用

jQuery.noConflict() 解绑jQuery对$的引用

其后使用jQuery中的$时用jQuery代替$:jQuery("#box").css("color","red")

2)深度让渡

jQuery.noConflict(true) ($和jQuery都不能使用)

其后使用jQuery中的$时:

    var jq = jQuery.noConflict(true)  //深度让渡  ($和jQuery都不能使用)
    console.log($.getEl("box"));
    jq("#box").css("color","red")

5.在插件中使用闭包

在封装插件时使用闭包。

闭包:闭包是指一个函数能够访问并操作其外部作用域中的变量,即使在函数被调用之后,仍然可以访问这些变量。

目的:为了避免变量的全局污染,对内部信息进行了保护(在IIFE外部不能调用闭包内的变量)。

IIFE是实现闭包的一种方式。

实现方式:

   ;(function(){
        function _插件名(){
            实现插件名的代码
        }
        jQuery.prototype.插件名 = _插件名
    })()
或:

    ;(function($){
        function _插件名(){
            //实现插件功能的代码
        }
        $.fn.插件名 = _插件名         //jQuery.prototype === $.fn
    })(jQuery)

6.jQuery的插件机制

1)对jQuery函数prototype函数的别名(jQuery.fn)进行(原型)扩展。
;(function ($) {
  // 在原型上绑定单个方法
   $.fn.chSize = function chSize(w, h) {
    $(this).width(w);
    $(this).height(h);
  };
  // 批量绑定方法
  $.fn.extend({
    // 扩展方法1
    setHtml: function (htmlText) {
      $(this).html(htmlText);  
      //this:原生写法  $(this):jQuery写法 两者都可以获取到当前节点
    },
    // 扩展方法2
    getHtml: function () {
      return this.html();
    },
    // 扩展方法3......
  });
})(jQuery);
2)采用jQuery.extend()方法进行(静态)扩展。
;(function($){
    $.extend({
        方法名:function(参数){
            //实现方法的代码
        }
    });
})(jQuery)

7.插件的固定格式:

;(function($){
    var that ;
    $.fn.插件名称 = function(){
        that = this;
        //实现插件功能的代码
        return that;
    }
})(jQuery);
或
;(function($){
    var that ;
    $.fn.extend ={
        插件名1:function(){
            that = this;
            //实现插件功能的代码
            return that;
        },
        插件名2:function(){
            that = this;
            //实现插件功能的代码
            return that;
        },
        插件名3:function(){
            that = this;
            //实现插件功能的代码
            return that;
        },
        ........
    }
})(jQuery);

8.配置参数

1)如果传的参数是两个以上,最好将参数设置成对象

问题:如果传参过多,在调用时可能将其参数位置写错。 ​ 解决上面问题办法是: ​ 把参数写成与顺序无关的对象形式

 $("p").setAttr({
      width: "400px",
      fontSize: "35px",
      color: "pink",
      background: "#0ff",
      height: "200px",
    });
;(function ($) {
  $.fn.setAttr = function (config) {//用config接收传递的对象
    var that = this;
    that.css("width", config.width);
    that.css("height", config.height);
    that.css("font-size", config.fontSize);
    that.css("color", config.color);
    that.css("background-color", config.background);
    // 返回一个对象便于链式调用
    return that;
  };
})(jQuery);
2)设置默认值

问题:如果用户在使用这个插件时,不传参或少传参,这时怎么办?

①设置默认值

    var 默认值对象 = {值内容}

②将默认值对象和用户传过来的对象合并成一个新的对象

var setting = $.zxtend({},默认值对象,传过来的对象) //对象合并操作
eg:

// $("p").setAttr() //全为默认值
    $("p").setAttr({background:"aqua",fontSize:"30px"})
(function ($) {
  $.fn.setAttr = function (config) {
    var that = this;
    // 默认值设置
    var def = {
      width: "200px",
      height: "100px",
      fontSize: "16px",
      color: "#fff",
      background: "red",
    };
    // 将def和config合并成一个对象。注意:用户传值的对象要写在最后
    var settings = $.extend({}, def, config);
    that.css("width", settings.width);
    that.css("height", settings.height);
    that.css("font-size", settings.fontSize);
    that.css("color", settings.color);
    that.css("background-color", settings.background);
    // 返回一个对象便于链式调用
    return that;
  };
})(jQuery);

9.命名空间

问题:插件的命名经常会有冲突的情况。

解决:把所有方法以私有方法定义在命名空间下,然后再结合闭包把方法查询表对外暴露出去。

(function ($) {
  var that;
  // 把方法私有化
  var methods = {
    init: function (content) {
      // console.log(content);
      console.log("init");
      // this.html("这是init初始化后的内容")
      this.html(content);
    },
    setData: function () {
      console.log("setData");
    },
    getData: function () {
      console.log("getData");
    },
  };
  $.fn.namespace = function (option) {
    that = this;
    // methods[option.fn]() // 这种方法中的this指向会出问题
    methods[option.fn].call(that, option.txt); //将methods[option.fn]中的this指向that
    return that;
  };
})(jQuery);
​
<script>
    $(".box").namespace({fn:"init",txt:"我是前端大咖"})
</script>
  • 50
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值