JQuery插件之$.fn

栏目: jQuery · 发布时间: 5年前

内容简介:当使用从源码可知,当使用目的:改变a标签的字体颜色

jQuery对象方法

$("a").css("color", "red");

当使用 $ 选择元素的时候,它会返回一个jQuery对象,这个对象中包含了你一直使用的方法(比如:.css(),.click()等)。这个jQuery对象是从 $.fn 对象中得到的这些方法。 $.fn 对象包含了jQuery对象的所有方法,如果想编写我们自己的方法,也要将方法定义在 $.fn 对象里面。使用这种方式编写插件,即 jQuery类的实例 将会拥有此功能。为什么会有这种效果?简单看下源码

jQuery.fn = jQuery.prototype ={ 
   init: function( selector, context ){
      //do something...
};

从源码可知,当使用 $.fn 的方式编写插件时,就是在jQuery的原型中绑定新的方法,斯所以根据原型的特性,新创建的jQuery对象自然会拥有新绑定的方法。

初识插件

目的:改变a标签的字体颜色

做法:创建名为 greenify 的方法,将其加在 $.fn 里面。

如此一来, greenify 方法适用于所有的jQuery对象了

<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="../../js/jQuery-1.8.0.min.js"></script>
    <script type="text/javascript">
        //这里使用$与jQuery都可以
        $.fn.greenify = function () {
        
            /*这里使用this和$(this)都可以*/
            this.css("color", "red");
            
        };
        $(function () {
            //$("a")即jQuery实例化对象
            $("a").greenify();
        });
    </script>
</head>
<body>
    <a href="#">Click Me!!!</a>
    <a href="#">Cover Me!!!</a>
</body>
</html>

$.fn 还有另外一种写法 $.fn.extend({})

jQuery.fn.extend({
    greenify: function () {
        $(this).css("color", "red");
    }
});
$(function () {
    $("a").greenify();
});

链式写法

jQuery.fn.extend({
    greenify: function () {
        $(this).css("color", "red");
        //在结尾处返回this
        return this;
    }
});
$(function () {
    $("a").greenify().addClass("greenified");
});

链式编程的好处就是当调用完一个方法后,可以在后面继续调用该对象的其他方法。

$的别名保护

$ 在JavaScript库中使用是非常广泛的,如果你正在使用的其他JavaScript类库中也使用到了 $ ,并且你也使用了jQuery,那么你不得不使用 jQuery.noConflict() 来解除冲突。显然这会破坏我们的插件,因为它是在假设 $ 是jQuery函数的别名(实际上 $ 本来就是jQuery的别名)如果既想使用其他插件,也要使用jQuery的 $ 别名,我们需要将代码放进 立即执行函数 (文章结尾会对其简单解释)中,然后将jQuery作为实参传递进去, $ 作为形参接收。

(function ( $ ) {
 
    $.fn.greenify = function() {
        this.css( "color", "green" );
        return this;
    };

}( jQuery ));

由于 windowdocument 都是全局作用域的,而将其传入函数内部后,其在内部是作为局部变量存在的,这样做可以提高性能,减少作用域的查找时间,如果在函数内部多次调用 windowdocument ,这是很高效的做法。

(function ( _window, _document ) {
 
    $.fn.greenify = function() {
        this.css( "color", "green" );
        return this;
    };
 
}( window, document));

另外,存储私有变量也是使用立即执行函数的主要目的,假如想要存储一个默认的颜色,就可以使用一个私有变量进行存储。

(function ($) {
     var defaultColor = "pink";
     $.fn.extend({
         setColor:function () {
            $(this).css("color", defaultColor);
            return $(this);
         }
     })
 })(jQuery);
 $(function () {
     //所有div的text都会变成粉色
     $("div").setColor();
 });

;分号的使用

通常在编写插件时,会在在立即执行函数前加入一个分号

;(function($){
   //do something...
})(jQuery);

作用:防止多个文件压缩合并后,前一个文件最后一行语句没加分号,而引起合并后的语法错误。

如果前面已经加了分号,此时就会多出来一个分号,但这样是不会报错的。即不怕多,就怕少。

undefined解决兼容性问题

;(function($, undefined){
  //do something...
})(jQuery)

上面代码的 undefined 参数略显多余,此参数是为了解决 undefined 在老一辈的浏览器(IE5)可以被赋值的问题,全局的undefined有可能会被其他函数覆盖。

var undefined = 99;
 alert(undefined);

以上代码如果在 IE5 运行,可以弹出99, 而不是 undefined ,如果是这样的话,全局的 undefined 就有被其他函数覆盖的危险;但以上代码在 chrome 运行,会弹出 undefined

既然是插件就要考虑兼容性,所以通过在匿名函数中多定义一个 undefined 的形参,由于只传入了一个实参 jQuery ,从而可以保证 undefined 形参未被赋值,从而最终是我们想要的 undefined 的值,什么是我们想要的 undefined ?即, undefined 没有被赋值, undefined 就是 undefined

最大限度的减少插件的空间

当使用 $.fn 创建插件时,尽量减少空间的占用,能使用参数进行区分的,就不要多定义一个方法,这样可以降低插件被覆盖的可能性。

  • 反例
(function( $ ) {
    $.fn.TurnOnLight= function() {
        // Turn on
    };
    $.fn.TurnOffLight = function() {
        // Turn off
    };
}( jQuery ));
  • 正例
(function( $ ) {
    $.fn.light = function( action ) {
        if ( action === "turnOn") {
            // Turn on light code.
        }
        if ( action === "turnOff" ) {
            // Turn off light code.
        }
    };
}( jQuery ));

使用参数选项

当插件越来越复杂时,通过接收参数选项的方式来自定义插件是一种很好的做法。

<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="../../js/jquery-1.8.0.min.js"></script>
<script type="text/javascript">
    (function ($) {
      $.fn.extend({
         changeColor:function (options) {
           var defaultColor = $.extend({
               color: "red",
               backgroundColor:"skyblue"
           }, options);
           return $(this).css({
                color:defaultColor.color,
               backgroundColor:defaultColor.backgroundColor
           });
          }
       });
    })(jQuery);
    $(function () {
        $("div").changeColor();
        /*$("div").changeColor({
            color:"pink",
            backgroundColor:"yellow"
        });*/
    });
</script>
</head>
<body>
<div>JavaScript</div>
<div>Jquery</div>
</body>
</html>

调用 changeColor 不传递任何参数,文本颜色默认红色,背景默认天蓝色;反之按照传入参数渲染颜色。默认的颜色被 $.extned() 覆盖为其他颜色。

$.extend({
    color: "red",
    backgroundColor:"skyblue"
}, options)

以上代码执行结果: options 如果有值,那么它将覆盖第一个参数并返回options;如果为 undefined 则直接返回第一个参数。

简单解释立即执行函数(IIFE)

立即执行函数((Immediately-Invoked Function Expression)也称为自调用函数,函数定义好后会自动执行。 (function(){}) 表示一个匿名函数,后面紧跟一个 () ,表示立即执行函数。

(function(){
   console.log("我会立即执行");
})()
(function(param){
    console.log(param); //我会立刻执行
})("我会立刻执行");

优点:不会产生产生全局变量,不会造成变量污染。

缺点:只能执行一次,没法重复执行。

在编写插件时,使用 IIFE 是最合适不过的了,插件只需要引用一次,即执行一次。


以上所述就是小编给大家介绍的《JQuery插件之$.fn》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

蚁群算法原理及其应用

蚁群算法原理及其应用

段海滨 / 科学出版社 / 2005年2月1日 / 48.0

《蚁群算法原理及其应用(精装)》系统、深入地介绍了蚁群算法的原理及其应用,力图概括国内外在这一学术领域的最新研究进展。全书共包括10章,主要内容包括蚁群算法的思想起源、研究现状及机制原理;蚁群算法的复杂度分析;蚁群算法的收敛性证明;蚁群算法参数对其性能的影响;蚁群算法的参数选择原则;离散域和连续域蚁群算法的若干改进策略;蚁群算法在多个优化领域的典型应用;蚁群算法的硬件实现技术;蚁群算法与其他仿生优......一起来看看 《蚁群算法原理及其应用》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具