`

【YUI组件】开发风格&微调控件

    博客分类:
  • YUI
阅读更多

 

    前段时间的学习,试着分析了一下Calendar组件,却发现比较大,大致了解到组件的一般开发风格。我们在使用Calendar组件,两步,init();然后render();

 

    init()所做事情有以下:

  •     初始化组件所需参数;
  •     将一般对组件的配置信息进行解析,一般设有默认配置信息,对于需要生成的id可以通过Dom.generateId()来得  到;
  •     initStyles() 日期组件的css 样式有专门的存放地方,initStyles就是初始化所需的className。
  •     initEvents() 初始化事件,有组件内部传递的事件,也有提供接口给调用者来订阅处理该事件;YAHOO提供了自定义事件对象的类CustomEvent通过这个初始化事件,并且指定方法订阅。
    initEvents : function() {
     
    
    
    
    //将全局变量的长变量名 引用到 局部变量的短变量名。且将this赋值给局部变量,防止方法中的this的变换。
    
    
    
    
            var defEvents = Calendar._EVENT_TYPES,
                CE = YAHOO.util.CustomEvent,
                cal = this; // To help with minification
            cal.beforeSelectEvent = new CE(defEvents.BEFORE_SELECT); 
            cal.selectEvent = new CE(defEvents.SELECT);
            cal.beforeDeselectEvent = new CE(defEvents.BEFORE_DESELECT);
            cal.deselectEvent = new CE(defEvents.DESELECT);
            cal.changePageEvent = new CE(defEvents.CHANGE_PAGE);
        
           
            cal.beforeRenderEvent = new CE(defEvents.BEFORE_RENDER);
        
           
            cal.renderEvent = new CE(defEvents.RENDER);
    
            
            cal.beforeDestroyEvent = new CE(defEvents.BEFORE_DESTROY);
    
            cal.destroyEvent = new CE(defEvents.DESTROY);
    
           。。。。//其他事件如上,下面就是订阅。
    
     
            cal.renderNavEvent = new CE(defEvents.RENDER_NAV);
    
            cal.beforeSelectEvent.subscribe(cal.onBeforeSelect, this, true);
            cal.selectEvent.subscribe(cal.onSelect, this, true);
            cal.beforeDeselectEvent.subscribe(cal.onBeforeDeselect, this, true);
         。。。//需要注意的是订阅的时候,传递this参数,指定本组件为事件的context
        },
     
  •     setupConfig()将默认配置信息初始化,如同initStyles()将样式class名转换为组件的变量。
  •     applyConfig()如果创建calendar的时候,有配置,则将配置信息覆盖在以前的默认配置上。

    render()所作的事情很简单,就是创建日期组件所需的Element,在创建的时候,也许调用者想特殊处理一些信息,则将Event.fire(),调用者对事件subscribe来处理特殊;比如在日期创建之前想将页面做些其他改变。效果类似AOP面向切面。

 

    render : function() {
    //render之前的事件接口
        this.beforeRenderEvent.fire();
        var workingDate = DateMath.findMonthStart(this.cfg.getProperty(DEF_CFG.PAGEDATE.key));

        this.resetRenderers();
        this.cellDates.length = 0;

        Event.purgeElement(this.oDomContainer, true);

        var html = [];

        html[html.length] = '<table cellSpacing="0" class="' + this.Style.CSS_CALENDAR + ' y' + (workingDate.getFullYear() + this.Locale.YEAR_OFFSET) +'" id="' + this.id + '">';
   //这里就是浏览器会读取到的HTML代码。

        html = this.renderHeader(html);
        html = this.renderBody(workingDate, html);
        html = this.renderFooter(html);

        html[html.length] = '</table>';

        this.oDomContainer.innerHTML = html.join("\n");
  //内部事件的监听处理,比如日期组件的《》按钮的click事件
        this.applyListeners();
        this.cells = Dom.getElementsByClassName(this.Style.CSS_CELL, "td", this.id);
    
        this.cfg.refireEvent(DEF_CFG.TITLE.key);
        this.cfg.refireEvent(DEF_CFG.CLOSE.key);
        this.cfg.refireEvent(DEF_CFG.IFRAME.key);

        this.renderEvent.fire();
    },
 

  组件开发后还要添加上一句话:

  YAHOO.register("calendar", YAHOO.widget.Calendar, {version: "2.8.0r4", build: "2449"});

  用来方便YUI在YUILoader的时候的版本冲突控制。

 

  仿造以上的开发风格,将网上的一个微调控件进行改装,符合YUI 组件的开发模式。效果如下:

 

  升级为时间组件

 

  进一步扩展日期组件:

 

 

  开发中学到的小技巧:

  setInterval的时候,需要将组件的this传递进去,可是因为setInterval是全局的函数,this为指到浏览器Dom。

  var me=this;

  this._interval = setInterval(function(){me.Run();},150);

  使用这样的方法可以将调用函数的this变换,比较简单。

 

  以上个人浅见,错误的地方欢迎大家指正。

分享到:
评论

相关推荐

    【YUI组件】基于YUI的表单验证器

    NULL 博文链接:https://every-best.iteye.com/blog/750967

    淘宝旅行YUI通用日期日历控件

    淘宝旅行YUI通用日期日历控件 淘宝旅行YUI通用日期日历控件 淘宝旅行YUI通用日期日历控件 淘宝旅行YUI通用日期日历控件

    YUI3 dialog组件

    基于YUI3的dialog组件该组件是基于YUI3开发的,功能强大,详细见http://www.qiqicartoon.com

    淘宝旅行YUI通用日期日历控件.zip

    淘宝旅行YUI通用日期日历控件是一款由淘宝前端开发人员昂天开发,基于雅虎YUI3实现,界面简洁清晰,功能非常强大,不仅可以显示单日历,双日历,三日历,甚至四日历,还可以显示节日信息以及指定日期显示范围,非常...

    雅虎 用户接口库YUI

    Yui组件分成2类:工具包和控件库 Yui 工具包 Yui 工具包利用DOM脚本来简化浏览器内的开发(in-browser devolvement),使用DHTML和AJAX的特性开发所有的Web程序。 动画(Animation):在你的页面中通过指定位置,...

    YUI-ajax框架开发文档

    yui框架集,内含多个demo,yui框架将ajax完美的包装,以及包含基于ajax的各种js组件,让开发人员可以缩短开发时间。

    Yahoo YUI 插件库

    非常有用的YUI插件,包括所有的Yahoo YUI插件库。

    yahoo yui控件

    yahoo yui控件,可以在离线的状态下使用。

    雅虎YUI组建

    雅虎YUI组件,内附详细实例

    高效WEB前端开发之路:YUI3.15

    因此,一些具有开拓创新精神的开发者们便开发出了各种丰富的第三方框架,通过第三方的支持代码实现浏览器兼容性的统一、代码的简化以及功能的增强。  本书作者便是在此背景下,以国外最优秀的JavaScript框架之一...

    YUI3.6文档及示例

    yui官网下载的。内容很全,示例+doc说明

    YUI 入门教程YUI 入门教程YUI 入门教程

    YUI教程YUI 入门教程YUI 入门教程YUI 入门教程

    yui_2.9.0前端UI

    是一组工具和控件,用JavaScript写成, 为的是用DOM 脚本,DHTML和AJAX等技术创建丰富的网页交互式应用程序。 YUI 基于BSD协议,对所有的使用方式都是免费的。YUI 项目包括YUI 库和两个创建时工具: YUI Compressor ...

    基于java的开发源码-JSCSS压缩工具 YUI Compressor.zip

    基于java的开发源码-JSCSS压缩工具 YUI Compressor.zip 基于java的开发源码-JSCSS压缩工具 YUI Compressor.zip 基于java的开发源码-JSCSS压缩工具 YUI Compressor.zip 基于java的开发源码-JSCSS压缩工具 YUI ...

    yahoo ui library(简称yui)搞WEB开发的朋友值得看一看,充分发挥出了javascript的功能

    User Interface Library(简称yui) 是一个使用Javascrīpt编写的工具和控件库。它利用DOM脚本,DHTML和AJAX来构造具有丰富交互功能的Web程序。yui也包含几个核心的CSS文件。yui中的所有组件已经以开源的形式发布,...

    yuicompressor-yui compressor

    yuicompressor-2.4.2.jar yuicompressor-2.4.7.jar jsZip.exe yuicompressor yui compressor js压缩工具 javascript压缩工具 css压缩工具 ------------------------------------ //压缩JS java -jar yui...

    针对YUI框架API

    本API说明文档是针对YUI框架开发的比较经典的帮助文档,对你进行YUI前台开发能提供非常大的帮助,希望对你的开发起到事半功倍的作用

    yui3-master.zip

    yui3-master.zip

    一些关于YUI的资源

    这个是YUI的稳定版本,新版本还在测试中。YUI在开发Ajax时能带来极大的方便。

Global site tag (gtag.js) - Google Analytics