zoukankan      html  css  js  c++  java
  • jquery扩展

    编写jquery扩展插件

    第一步:创建一个js文件

    image

    第二步:编写有关代码

    jQuery.fn.extend({
        ///这个函数是全部选择所有的元素
        check: function() {
            return this.each(function() { this.checked = true; }); //必须return回一个jquery对象
        },
        uncheck: function() {
            return this.each(function() { this.checked = false; });
        }
    });

    第三步:在页面中使用该扩展方法

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication3.WebForm1" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title></title>
        <script type="text/javascript" src="jquery-1.3.2-vsdoc.js"></script>
        <script type="text/javascript" src="Myjqueryplunin.js"></script>
        <script language="javascript" type="text/javascript">

            function CheckAll() {
                $("input:checkbox").check();
            }

            function UnCheckAll() {
                $("input:checkbox").uncheck();
            }

        </script>
    </head>
    <body>

        <div>
        <button onclick="CheckAll();">选择全部</button> 
        <button onclick="UnCheckAll();">清除全部</button>
        <hr />
        <input type="checkbox"  id="c1" /><label for="c1">测试</label><br />
        <input type="checkbox"  id="Checkbox1" /><label for="c1">测试</label><br />
        <input type="checkbox"  id="Checkbox2" /><label for="c1">测试</label><br />
        <input type="checkbox"  id="Checkbox3" /><label for="c1">测试</label><br />
        <input type="checkbox"  id="Checkbox4" /><label for="c1">测试</label><br />
        <input type="checkbox"  id="Checkbox5" /><label for="c1">测试</label><br />
        <input type="checkbox"  id="Checkbox6" /><label for="c1">测试</label><br />
        </div>
    </body>
    </html>

    这里有一个细节:div是不可以放在runat=server的form里面的

    第四步:在浏览器中查看效果

    image 

    下面这个博客也提供了另外一些介绍 http://ioryioryzhan.javaeye.com/blog/232971

    jQuery为开发插件提拱了两个方法,分别是:

    jQuery.fn.extend(object);

    jQuery.extend(object);

    jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。

    jQuery.fn.extend(object);给jQuery对象添加方法。

    fn 是什么东西呢。查看jQuery代码,就不难发现。

    jQuery.fn = jQuery.prototype = {

       init: function( selector, context ) {//.... 

       //......

    };

    原来 jQuery.fn = jQuery.prototype.对prototype肯定不会陌生啦。

    虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便。

    jQuery便是一个封装得非常好的类,比如我们用 语句 $("#btn1") 会生成一个 jQuery类的实例。

    jQuery.extend(object); 为jQuery类添加添加类方法,可以理解为添加静态方法。如:

    $.extend({

      add:function(a,b){return a+b;}

    });

    便为 jQuery 添加一个为 add 的 “静态方法”,之后便可以在引入 jQuery 的地方,使用这个方法了,

    $.add(3,4);  //return 7

    jQuery.fn.extend(object); 对jQuery.prototype进得扩展,就是为jQuery类添加“成员函数”。jQuery类的实例可以使用这个“成员函数”。

    比如我们要开发一个插件,做一个特殊的编辑框,当它被点击时,便alert 当前编辑框里的内容。可以这么做:

    Java代码

    1. $.fn.extend({    
    2.    alertWhileClick:function(){    
    3.        $(this).click(function(){    
    4.             alert($(this).val());    
    5.         });    
    6.     }    
    7. });    
    8. $("#input1").alertWhileClick(); //页面上为:<input id="input1" type="text"/>

    $("#input1") 为一个jQuery实例,当它调用成员方法 alertWhileClick后,便实现了扩展,每次被点击时它会先弹出目前编辑里的内容。

    真实的开发过程中,当然不会做这么小白的插件,事实上jQuery提拱了丰富的操作文档,事件,CSS ,Ajax、效果的方法,结合这些方法,便可以开发出更加 Niubility 的插件。

     
     
    两种方式的比较:
    1
    2
    3
    jQuery.extend = jQuery.fn.extend = function() {
         ...
    };

    我们可以用$.extend去扩展自定义的对象,如

    1
    2
    3
    var myself = {name:jack};
    $.extend(myself, {setName: function(n){this.name=n;} });
    myself.setName("tom");

    通过$.extend为对象myself添加了setName方法。但这里主要讨论$.extend如何构建jQuery库的。不知注意到上面代码中jQuery.extend和jQuery.fn.extend是同一个函数。我们浏览下jQuery库,发现有些方法是通过调用jQuery.extend扩展的,有些则是通过调用jQuery.fn.extend扩展的。


    下面分别讨论:

    1,通过jQuery.extend扩展 

    我们知道jQuery.extend中的jQuery类型是function,即typeof jQuery值为字符串“function”。如果把jQuery当成一个类,jQuery.extend相当于为该类添加了静态方法extend。静态方法是不需要new一个实例再去调用的,通过“类名+方法名”直接调用。即jQuery.extend(...),jQuery又被赋值给$。因此我们更习惯$.extend(...)。
    源码中直接调用jQuery.extend方法,只传一个参数。如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    jQuery.extend({
        noConflict: function( deep ) {
            window.$ = _$;
            if ( deep )
                window.jQuery = _jQuery;
            return jQuery;
        },
            ...
    });


    我们知道extend中如果只传一个参数,那么将执行该句

    1
    2
    3
    4
    if ( length === i ) {
        target = this;
        --i;
    }

    即扩展自己,而这里的this则是function jQuery。也就是说给function jQuery添加了许多静态方法,这些方法都可以直接通过jQuery.xx(或$.xx)方式来调用,而不是先执行(调用)jQuery方法再去调用xx,如$("#id").xx。也许下面这个例子更容易理解 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function fun(){}//定义一个类(函数)
     
    //为该类(函数)添加一个静态方法extend
    fun.extend=function(obj){
        for(var a in obj)
            this[a] = obj[a];//注意:这里的tihs即fun
    }
     
    //调用extend为该类添加了静态属性name,静态方法method1
    fun.extend({name:"fun",method1:function(){}});
     
    //输出name,prototype,extend,method1
    console.dir(fun)

    因此,jQuery中的isFunction, isArray, isWindow等都是静态方法,只能通过$.isFunction, $.isArray, $.Window引用。而不能通过$("...").isFuction, $("...").isArray, $("...").isWindow方式引用。


    2,通过jQuery.fn.extend扩展 

    jQuery.fn等于jQuery.prototype,也就是说给function jQuery的原型(prototype)上挂了个extend方法。通过调用jQuery.fn.extend(object)来扩展时(注意只传一个参数object),extend函数中仍然会执行

    1
    2
    3
    4
    if ( length === i ) {
        target = this;
        --i;
    }

    而这时的this则是jQuery.prototype(第一条提到的则是jQuery函数自身)。即给jQuery.prototype上添加了许多属性,方法。当jQuery函数执行时,如$()或jQuery(),更多时候是$()。该函数会new一个jQuery(见上一篇jQuery对象的组成)。这时则把扩展的属性,方法都附加到new生成的对象上了。也许下面这个示例更容易理解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function fun(){}//定义一个类(函数)
     
    //给该类原型上添加一个方法extned
    fun.prototype.extend = function(obj){
        for(var a in obj)
            this[a] = obj[a];//注意:这里的this即是fun.prototype
    }          
     
    //调用extend方法给fun.prototype上添加属性,方法
    fun.prototype.extend({name:"fun2",method1:function(){}})
     
    //输出name,extend,method1
    console.dir(new fun())

    因此扩展的属性或方法都添加到jQuery对象上了。如bind, one, unbind等可以通过$("...").bind, $("...").one, $("...").unbind方式调用。却不能通过 $.bind, $.one, $.unbind方式调用。



    jQuery与Prototype一样都是通过extend方法扩展出整个库的。相对来说jQuery的扩展方式更难理解一些。

    总结如下:
    1,jQuery.extend({...})是给function jQuery添加静态属性或方法。
    2,jQuery().extend({...})是给jQuery对象添加属性或方法。

  • 相关阅读:
    如何:为 Silverlight 客户端生成双工服务
    Microsoft Sync Framework 2.1 软件开发包 (SDK)
    Windows 下的安装phpMoAdmin
    asp.net安全检测工具 Padding Oracle 检测
    HTTP Basic Authentication for RESTFul Service
    Windows系统性能分析
    Windows Server AppFabric Management Pack for Operations Manager 2007
    Mongo Database 性能优化
    服务器未能识别 HTTP 标头 SOAPAction 的值
    TCP WAIT状态及其对繁忙的服务器的影响
  • 原文地址:https://www.cnblogs.com/xingmeng/p/2750999.html
Copyright © 2011-2022 走看看