`

jQuery Widget 开发 Tutorial [翻译版]

    博客分类:
  • html
 
阅读更多

原文:http://bililite.com/blog/understanding-jquery-ui-widgets-a-tutorial/

由于翻译后不能使用HTML和SCRIPT所以演示部分就不能看到了,请参照原文。

写这篇文章的目的是为了让我理解并开发出我自己的Widgets,同时我也希望这篇文章能对其他人也有帮助。Widget让我说就是一种用户界面元素,类似于按钮或者像复杂的DatePicker(日期选择控件)。但这一概念对于jQuery,更确切的说是一个类。这个类的成员与一些HTML元素相关,比如Draggable和Sortable。当然不是所有Widget都使用$.widget,例如datePicker就没有使用。

 

插件:修改元素

让我们用一个带CSS类的P元素作为目标举个例子。

This is a paragraph

我们把它变绿:

$(".target").css({"background":'green'});
然后我们需要将这一功能更通用化:
$.fn.green = function() {return this.css({background: 'green'})}

上面的代码是我们可以在任意的选中元素上产生效果,但他没有让我们保持和某个元素的关联。例如如果我们需要制作一个恢复背景的功能,哪么我们必须确定他的初始颜色。如果要设计一个Darker(),我们就必须知道元素现在是什么颜色。

保持插件状态

我们可以创建一个与某元素管理单的对象:

element.myobject = new Myobject({'target': element})

$.fn.green2 = function() {
    return this.each(function(){
            if (!this.green) this.green = new Green(this); // associate our state-keeping object with the element
            this.green.setLevel(15);
    });
};
$.fn.off = function() {
    return this.each(function(){
        if (this.green) this.green.setLevel(16);
        delete this.green; // recover the memory
    });
};
$.fn.darker = function() {
    return this.each(function(){
        if (this.green) this.green.setLevel(this.green.getLevel()-1);
    });
};
$.fn.lighter = function() {
    return this.each(function(){
        if (this.green) this.green.setLevel(this.green.getLevel()+1);
    });
};

function Green(target){
    greenlevels = ['#000','#010','#020','#030','#040','#050','#060','#070','#080','#090','#0a0','#0b0','#0c0','#0d0','#0e0','#0f0','#fff'];
    this.target = target; // associate the element with the object
    this.level = 0;
    this.getLevel = function() { return this.level; }
    this.setLevel = function(x) {
        this.level = Math.floor(Math.min(greenlevels.length-1, Math.max(0,x)));
        this.target.css({background: greenlevels[this.level]});
    }
};

但是上面这种方式使得$.fn命名空间中出现了很多函数。我们也可以在该命名空间内再创建一个命名空间,但一般的设计思路使用一个字符串来调用相应的函数,即我们可以使用类似element.green2("darker")来调用darker()方法:

$.fn.green2 = function(which){
    return this.each(function(){
        if (which === undefined){ // initial call
            if (!this.green) this.green = new Green($(this)); // associate our state-keeping object with the element
            this.green.setLevel(15);
        }else if (which == 'off'){
            if (this.green) this.green.setLevel(16);
            delete this.green
        }else if (which == 'darker'){
            if (this.green) this.green.setLevel(this.green.getLevel()-1);
        }else if (which == 'lighter'){
            if (this.green) this.green.setLevel(this.green.getLevel()+1);
        }
    });
};

function Green(target){
    greenlevels = ['#000','#010','#020','#030','#040','#050','#060','#070','#080','#090','#0a0','#0b0','#0c0','#0d0','#0e0','#0f0', '#fff'];
    this.target = target; // associate the element with the object
    this.level = 0;
    this.getLevel = function() { return this.level; }
    this.setLevel = function(x) {
        this.level = Math.floor(Math.min(greenlevels.length-1, Math.max(0,x)));
        this.target.css({background: greenlevels[this.level]});
    }
};
插件与对象关联所带来的问题
上面的方式能够方便的写出程序,但是也带来了循环引用和可能的内存漏洞。浏览器对于Javascript和Dom元素是使用不同的垃圾回收方式,上面的引用方式可能就会带来问题,使得回收不能正常进行。
我们同时也要注意,在我们开发插件是也要注意内存的回收。
jQuery用$.fn.data解决了这一问题:
$(element).data('myobject', new Myobject({'target': element}))
但是,这样做的同时又带来了其他的问题,我们需要做很多“额外”的工作,这些工作与程序逻辑毫无关系,重复而无用。所以重复实现这一功能,需要抽象出来减少工作。
解决问题:$.widget
这就是$.widget出现的原因。它使得插件中的Javascript类的单个实例与每个元素相关联,这样我们在与对象进行交互操作元素的时候就不会带来内存绣楼的问题。
同上面一样,你还是需要创建类的构造函数。与之不同的是,我们需要一个包含了相关方法的“原型”。同时也有一些变化,如:_init()函数在构造是调用,destroy()方法在析构是调用。这两个函数都是预先定义的,不过你可以覆盖。element和上面我们的target是与类相关的jQuery对象。
Widget中所有已“_”开头的方法都属预定义似有形函数,外部不能调用。
var Green3  = {
    _init: function() { this.setLevel(15); },
    greenlevels: ['#000','#010','#020','#030','#040','#050','#060','#070','#080','#090','#0a0','#0b0','#0c0','#0d0','#0e0','#0f0', '#fff'],
    level: 0,
    getLevel: function() { return this.level; },
    setLevel: function(x) {
        this.level = Math.floor(Math.min(this.greenlevels.length-1, Math.max(0,x)));
        this.element.css({background: this.greenlevels[this.level]});
    },
    darker: function() { this.setLevel(this.getLevel()-1); },
    lighter: function() { this.setLevel(this.getLevel()+1); },
    off: function() {
        this.element.css({background: 'none'});
        this.destroy(); // use the predefined function
    }
}; 

上述代码即就是整个程序逻辑,使用下面代码生成插件:

$.widget("ui.green3", Green3); // create the widget 
分享到:
评论

相关推荐

    J2EE Tutorial中文版

    Sun权威教程--《J2EE Tutorial中文版》 作者:Stephanie Bodoff,Dale Green,Kim Haase,Eric Jendrock,Monica Pawlan,Beth Stearns 翻译参与人员:sharetop,worldheart,zhaoy,bruce等 出版商:铁道出版社...

    Java 8 简明教程 (Java 8 Tutorial中文版)文字pdf版

    Java 8 简明教程 Java 8 Tutorial中文版 “Java并没有没落,人们很快就会发现这一点” 欢迎阅读我编写的Java 8介绍。本教程将带领你一步一步地认识这门语言的新特 性。通过简单明了的代码示例,你将会学习到如何使用...

    <zt>Jquery Tutorial

    《jQuery教程》是一个系列的学习资源,旨在帮助初学者掌握这一流行的JavaScript库。...通过这些篇章的学习,你将能够熟练地运用jQuery进行网页开发,提升工作效率,创造出更富动态和互动性的网页应用。

    Ruby on Rails 4 Tutorial 中文版

    总之,《Ruby on Rails 4 Tutorial 中文版》是一本全面而实用的指南,涵盖了从基础到高级的Rails开发知识。通过学习,你不仅能够掌握Rails 4的基本用法,还能了解到Web开发的最佳实践,从而提升自己的开发技能。记得...

    The Java Tutorial 英文版

    通过《Java Tutorial》的英文版,你可以系统地学习Java编程,从基本语法到高级特性,包括GUI编程、多线程、输入/输出、网络编程以及数据库连接等。这不仅有助于你成为一名合格的Java开发者,还能够为学习其他编程...

    JQuery Tutorial

    JQuery Tutorialspoint AJAX is an acronym standing for Asynchronous JavaScript and XML and this technology helps us to load data from the server without a browser page refresh. recommend you go through...

    jQuery_EasyUI中文帮助手册(带目录)

    EasyUI是一种基于jQuery的前端框架,它为开发人员提供了一套丰富的UI组件,以帮助快速构建现代化、交互式的Web应用。jQuery EasyUI中文帮助手册是一个全面的指导文档,它详细介绍了EasyUI框架的各种组件以及如何使用...

    NS3 中文教程(tutorial 翻译)

    - **NS-3 教程 (Tutorial)**:本教程旨在以一种结构化的方式引导新用户逐步了解**NS-3**的基本概念和功能。 - **NS-3 参考手册 (Reference Manual)**:包含了所有API的详细信息和技术规格。 - **NS-3 维基百科**:...

    Python 2.7 Tutorial 中文版-135页

    Python 2.7 Tutorial 中文版 Python 是一种高级的、解释型的编程语言,它提供了大量的库和工具,可以应用于各种领域,包括网络开发、数据分析、科学计算、人工智能等。Python 2.7 是 Python 的一个稳定版本,提供了...

    jQuery Instant Shoutbox System Tutorial.zip

    《jQuery即时聊天框系统教程》 在这个教程中,我们将深入探讨如何使用jQuery构建一个实时的、无需刷新页面的“即时聊天框”系统,这通常被称为Shoutbox或Guestbook。这个系统利用Ajax技术实现用户之间的实时交流,...

    javaSE Tutorial中文版

    "JavaSE Tutorial中文版" Java技术是指一种程序语言和平台。Java程序语言是一种高级语言,具有简单、结构中立、面向对象、轻便、分布式、高性能、多线程、强健、动态和安全等特点。 Java程序设计语言的特点包括: ...

    Scroll Menu with jQuery Tutorial

    **jQuery Scroll Menu 教程详解** 在Web开发中,创建一个滚动菜单是常见的需求,它可以使用户在页面滚动时方便地访问导航链接。本教程将深入讲解如何利用jQuery实现一个高效的滚动菜单。首先,我们需要了解jQuery的...

    hadoop tutorial 英文版

    This brief tutorial provides a quick introduction to Big Data, MapReduce algorithm, and Hadoop Distributed File System.

    J2EE+Tutorial中文版,《J2EE指南》中文版

    通过"J2EE+Tutorial中文版.chm"这个文档,学习者可以了解到J2EE的完整体系,理解各种组件的作用,掌握如何设计和部署J2EE应用,以及如何解决开发过程中遇到的问题。这个教程还可能包括实际的示例代码和练习,帮助...

    ns-3_中文教程(tutorial 翻译).zip_NS3中文教程_NS3使用教程_ns-3_ns3-tutorial中文_n

    ns3网络仿真中文帮助文档,适合初学者学习使用

    Wavelet Tutorial_Robi_Polikar原版+翻译

    **小波分析基础** 小波分析(Wavelet Analysis)是一种...文档的中文翻译使得非英语背景的读者也能轻松掌握这一重要技术。通过阅读和理解这份教程,读者将能够运用小波分析解决实际问题,提升数据分析和处理的能力。

    J2EE Tutorial中文版.chm

    &lt;br&gt;《The J2EETM Tutorial 中文版》的作者是Sun Microsystem公司Java开发小组资深的开发人员,与另一部取得空前成功的《The JavaTM Tutorial》一样,建立了与读者之间最为有效的交互途径。同时,在本书的...

Global site tag (gtag.js) - Google Analytics