开发者社区> webmirror> 正文

jquery插件的几种写法

简介: 最近Web应用程序中越来越多地用到了JQuery等Web前端技术。这些技术框架有效地改善了用户的操作体验,同时也提高了开发人员构造丰富客户端UI的效率。JQuery本身提供了丰富的操作,但是,有时候我们需要根据我们自己的业务和系统特色(风格)构造一些我们常用的前端UI组件,而 JQuery的插件给了我们一个较好的方式来构造这些UI组件,方便我们日后反复重用这些组件。
+关注继续查看

最近Web应用程序中越来越多地用到了JQuery等Web前端技术。这些技术框架有效地改善了用户的操作体验,同时也提高了开发人员构造丰富客户端UI的效率。JQuery本身提供了丰富的操作,但是,有时候我们需要根据我们自己的业务和系统特色(风格)构造一些我们常用的前端UI组件,而 JQuery的插件给了我们一个较好的方式来构造这些UI组件,方便我们日后反复重用这些组件。下面,我将说明JQuery插件常用的写法,以及这些插件的常用场景

首先,在具体说明编写插件之前,我们先假定一个使用场景:有一个HTML页面,页面上放置了一个5行3列的表格,即:

标记,具体代码如下:
<table id="newTable">
    <tr><td>1</td><td>1</td><td>1</td></tr>
    <tr><td>1</td><td>1</td><td>1</td></tr>
    <tr><td>1</td><td>1</td><td>1</td></tr>
    <tr><td>1</td><td>1</td><td>1</td></tr>
    <tr><td>1</td><td>1</td><td>1</td></tr>
</table>

我要实现的功能是:鼠标移到表格的某一行时,当前行高亮显示,其他行正常

结合这个场景,我们进一步探讨如何利用JQuery插件实现上述功能。常用的JQuery插件有如下几种写法:

对JQuery自身的扩展插件

顾名思义,这种插件是对JQuery自身的方法库进行扩展的。在使用的时候通过$.MethodName()的方式直接使用

插件代码示例:

$.extend({
    handleTableUI : function(table){
        var thisTable = $("#" + table);        
        $(thisTable).find("tr").bind("mouseover", function () {
            $(this).css({ color: "#ff0011", background: "blue" });
        });
        $(thisTable).find("tr").bind("mouseout", function () {
            $(this).css({ color: "#000000", background: "white" });
        });
    }
});

说明:当要对JQuery自身进行扩展的时候,需要采用$.extend();的形式进行开发,JQuery的extend()方法为我们提供了扩展 JQuery自身的方式,在extend()方法中,我们采用{...}的形式编写具体的方法体。其中,最重要的是要定义我们自己的扩展方法,如示例中的 handleTableUI。定义的方式是:方法名 : function(参数){ 方法体 }。通过此种方式我们就可以定义JQuery自己的扩展方法,而且这个方法可以在web页面通过智能提示显示出来。页面中调用的代码如下:

<script type="text/javascript">
    $(document).ready(function () {
        $.handleTableUI("newTable");
    });
</script>

对HTML标记或页面元素进行扩展

使用这种插件的扩展方式,在使用此插件时,需要首先引用经过JQuery包装的页面元素,如:$("#tableId").Method()

插件代码示例:

(function ($) {
    $.fn.setTableUI = function(options){
        var defaults = {
            evenRowClass:"evenRow",
            oddRowClass:"oddRow",
            activeRowClass:"activeRow"
        }
        var options = $.extend(defaults, options);
        this.each(function(){
            var thisTable=$(this);
            $(thisTable).find("tr").bind("mouseover", function () {
                $(this).css({ color: "#ff0011", background: "blue" });
            });
            $(thisTable).find("tr").bind("mouseout", function () {
                $(this).css({ color: "#000000", background: "white" });
            });
        });
    };
})(jQuery);

说明:当要对页面元素进行JQuery扩展时,需要采用(function($){...})(JQuery);的方式进行开发。在“...”处,定义我们自己的方法,定义方式是:$.fn.自定义方法名 = function(参数){...};的形式定义扩展方法的具体内容。在页面调用的时候不同于对JQuery自身的扩展。具体调用代码如下:

<script type="text/javascript">
    $(document).ready(function () {
        $("#newTable").setTableUI();
    });
</script>

通过直接添加JQuery插件脚本引用实现对该插件的调用

一 般,如果需要用到一些全局的JQuery插件,即:插件的方法不需要显式调用,而是引用脚本即可;同时,这种插件一般对整个Web页面起到全局配置或设置的作用,如:对<body></body>内部的内容进行整体布局,此时可以采用脚本引用的方式实现

插件代码示例:

(function ($) {
    $.tableUI = { set: function () {
        var thisTable = $("table");
        $(thisTable).find("tr").bind("mouseover", function () {
            $(this).css({ color: "#ff0011", background: "blue" });
        });
        $(thisTable).find("tr").bind("mouseout", function () {
            $(this).css({ color: "#000000", background: "white" });
        });
    }
    };
    //此处需要进行自调用
    $(function () {
        $.tableUI.set();
    });
})(jQuery);

说明:如果上面这段代码在js文件中,我们只要在页面上添加对此脚本文件的引用即可,当然,在所有要用到JQuery的地方,需要首先添加对JQuery库脚本的引用。在引用型插件的代码中,最主要的就是在插件中要主动调用自己所写的插件方法。否则,插件代码将不会起作用

插件的基本要点

在编写插件的时候,我们需要记住这些要点,虽然不这么做不会影响使用,但是要是你的插件是不规范的代码,那何必花苦心思去写插件

jQuery插件的文件名推荐命名为jquery.[插件名].js,以免和其他JavaScript库插件混淆。例如命名为jquery.color.js

所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身上

在插件内部,this指向的是当前通过选择器获取的jQuery对象,而不像一般的方法那样,例如click()方法,内部的this指向的是DOM元素。可以通过this.each来遍历所有元素。

所有的方法或函数插件,都应当以分号结尾,否则压缩的时候可能出现问题。为了更稳妥些,甚至可以在插件头部先加上一个分号,以免他人的不规范代码给插件带来影响。插件应该返回一个jQuery对象,以保证插件的可链式操作。除非插件需要返回的是一些需要获取的量,例如字符串或者数组等。

避免在插件内部使用$作为jQuery对象的别名,而应使用完整的jQuery来表示。这样可以避免冲突。当然,也可以利用闭包这种技巧来回避这个问题,使插件内部继续使用$作为jQuery的别名

一个插件的实例:

详细的功能需求如下:

输出的信息中自动包含时间

输出的信息按照类型显示不同的样式

输出的信息类型包括:普通信息、调试信息、警告、错误

可选按照时间升序输出信息(稍作修改可以时间降序排列)

原理与实现

首先,来个简单的原理。写一个空的 plugin:

$.fn.message = function () {
    return this;
}

这个 plugin 的用法就是:

var msg = $("#divMessage").message();

这里面的关键就是拿到了 this 这个对象,后面的所有代码、功能的实现都依赖于这个对象

接下来,实现 show 函数来做测试。show 函数将接受消息内容作为参数,然后显示出来:

$.fn.message = function () {
    this.show = function (msg) {
        this.html(msg);
    }
return this;
}

然后,可以这样用:

<div id="divMessage">Messaeg</div>
<script>
    $(document).ready(function () {
        var msg = $("#divMessage").message();
        msg.show("hello");
    );
</script>    //hello

于是,内容就出来了:hello

接下来,的代码就很简单了(jquery.message.js):

/* 时间格式化函数 */
jQuery.utility = {
    leading:function (char, width, value) {
        var ret = value.toString();
        while (width > 1) {
            if (value >= (Math.pow(10,width - 1))) {
                break;
            } else {
                ret = char + ret;
            }
            width--;
        }
        return ret;
    },
    now : function () {
        var date = new Date();
        var ret = {};
        ret.hours = $.utility.leading('0', 2, date.getHours());
        ret.minutes = $.utility.leading('0', 2, date.getMinutes());
        ret.seconds = $.utility.leading('0', 2, date.getSeconds());
        return ret;
    }
};
/* 消息插件函数 */
$.fn.message = function () {
    this.show = function (msg) {
        this.html(msg);
    }
    this.clear = function () {
        this.html('');
    }
    this.append = function (tag, msg) {
        var date = $.utility.now();
        var tagContent = "<span class='msg-" + tag + "'>" + tag + "</span><span class='msg-datetime'>" + date.hours + ":" + date.minutes + ":" + date.seconds + "</span>";
        this.html(this.html() + "<br/>" + tagContent + "<span class='msg-message'>" + msg + "</span>");
    }
    this.warning = function (msg) {
        this.append("warning", msg);
    }
    this.error = function (msg) {
        this.append("error", msg);
    }
    this.succeed= function (msg) {
        this.append("succeed", msg);
    }
    this.debug = function (msg) {
        this.append("debug", msg);
    }
    this.info = function (msg) {
        this.append("info", msg);
    }
    return this;
}

下面把这个插件应用上看看效果:

<div id="divMessage"></div>
<script>
    $(document).ready(function () {
        var msg = $("#divMessage").message();
        msg.succeed("Host web context ready.");
        msg.debug("List title is 'Data List'.");
        msg.error("List doesn't exist.")
    });
</script>

结果显示出来:
succeed11:07:52Host web context ready.
debug11:07:52List title is 'Data List'.
error11:07:52List doesn't exist.

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
提升你网站水平的 jQuery 插件推荐
jQuery是一个优秀JavaScript库,它简化了HTML文档遍历,事件处理,动画和Ajax交互。 jQuery的确改变了很多人写JavaScript的方式。如今,有很多现成的jQuery插件可供选择,帮助你在网站中加入惊人的功能和效果。
917 0
10款新鲜出炉的 jQuery 插件
 这篇文章与大家分享的是10款新鲜出炉的基于 jQuery 开发的 Ajax 插件,有幻灯片、图片画廊、菜单等很多有用的插件。这些作者的想法特别新颖,希望你能从中找到自己需要的插件。 1. Chrome Style jQuery Image Gallery 一款用于实现漂亮的Chrome风格图片画廊的 jQuery 插件,在线演示 2.
812 0
jquery插件整理篇(二)消息提示类jquery插件
(1)Facebox Facebox 是一个基于jQuery,Facebook-style的lightbox。能够展示示images,divs或者整个远程页面。Facebox (2)SimpleModal SimpleModal是一个轻量级jQuery插件提供了一个简单的接口来创建模式对话框。
1163 0
jquery插件整理篇(七)表格插件
(1)Flexigrid Flexigrid是一个类似于Ext Gird,但基于jQuery开发的Grid。它具有的功能包括:可以调整列宽,合并列标题,分页,排序,显示/隐藏表格等。Flexigrid显示的数据能够通过Ajax获取或者从一个普通的表格转换。
871 0
jquery插件整理篇(五)分页插件
(1)jQuery Pagination jQuery分页插件jQuery Pagination 热点图书:www.hotbook.cn (2)pager jQuery plug-in jQuery分页插件。
588 0
jquery插件制作 -- 5.提示框插件
  今天我们介绍的是提示框插件tooltip的制作,其中还会介绍到自定义选择器插件的开发。   我们首先来介绍自定义选择器的开发,他的代码结构如下: (function ($) { $.expr[':'].customselector = function (object,index,properties,list) { //code }; })(jQuery); 调用时候的写法: $(a:customselector)   现在我们先解释下函数中所使用到的各个参数。
754 0
jquery插件整理篇(一)导航类jq插件,菜单jq插件
(1)Horizontal accordion: jQuery 基于jQuery开发,非常简单的水平方向折叠控件。 (2)jQuery-Horizontal Accordion 具有XBOX360 blade界面风格的水平方向Accordion。
1500 0
+关注
webmirror
Good good study, day day up
122
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载