`
zhyi_12
  • 浏览: 99872 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

小试jquery构建UI组件

阅读更多

  最近试用了一下EXT2.0的UI组件,又把jquery的官方UI插件库下来看了下。虽说我个人是更喜欢jquey的风格的,但对于组件化的UI来说,两者目前还有较大的差距。翻翻jquery的插件库,没有找到一个比较顺眼的菜单组件。正好拿这个开刀,仿照EXT写个组件自娱自乐一下。鄙视一下自己直接拿了EXT的图标就用。

  习惯性的使用dom元素的属性进行扩展。 习惯性的喜欢下面的方式构建插件

  1.       构建框架

    js 代码

     

    1. (function($) {   
    2.   
    3.     $.youi = $.youi || {};   
    4.        
    5.     $.youi.menu = {};   
    6.        
    7.     $.youi.menuItem = {};   
    8.    
    9.     $.extend($.youi.menu, {..........});
    10.     
    11.     $.extend($.youi.menuItem, {..........});
    12.                       ....................   
    13. })(jQuery);  
  2.  定义jquery扩展访问方法

    

  1. $.fn.extend({   
  2.     youiMenu:function(options){   
  3.         var menu = this;   
  4.         $.youi.menu.create(this,options);   
  5.         return menu;   
  6.     },   
  7.            
  8.     youiMenuItem:function(options){   
  9.         var menuItem = this;   
  10.         $.youi.menuItem.create(this,options);   
  11.         return menuItem;   
  12.     }   
  13. });  

       3.    写执行代码,代码向来写的很不规范,每次都等着重构。

        扩展 $.youi.menu

js代码
  1. $.extend($.youi.menu, {   
  2.     menuItems:[],   
  3.     /**  
  4.      * 初始化函数  
  5.      */  
  6.     create:function(el,options){   
  7.         $.youi.menu.initMenu(el,options);   
  8.         $("body",document).click(function(){   
  9.             $.youi.menu.closeMenu(el);   
  10.         });   
  11.     },   
  12.        
  13.     initMenu:function(el,options){   
  14.         $("ul>li",el).each(function(){   
  15.             $(this).youiMenuItem({menu:el});   
  16.         });   
  17.     },   
  18.        
  19.     closeMenu:function(menu){   
  20.         $($.youi.menu.menuItems).each(function(){   
  21.             $("ul",this).hide();   
  22.         });   
  23.         menu.attr("activeMenu","false");  //菜单激活属性 
  24.     }   
  25. });  

 

 扩展$.youi.menuItem

向来喜欢用dom的属性进行扩展。习惯了jquery的options。

js 代码
  1. $.extend($.youi.menuItem, {   
  2.     menuItemAttrs:function(el){   
  3.         return {   
  4.             id        :el.attr("id"),   
  5.             text      :el.attr("text"),   
  6.             menuIcon:el.attr("menuIcon"),   
  7.             action  :el.attr("youiAction"),//opera中 action属性会自动加上路径 file://D:...   
  8.             hotKey  :el.attr("hotKey"),   
  9.             type      :el.attr("menuType"),//本想使用type的 可opera不干   
  10.             checked :el.attr("youiChecked"),//opera中checked属性只能显示checked,有时opera,无语了....   
  11.             group     :el.attr("group"),   
  12.             active  :el.attr("active")   
  13.         };   
  14.     },   
  15.        
  16.     create:function(el,options){   
  17.         options = $.extend({},options,$.youi.menuItem.menuItemAttrs(el));   
  18.         if(!options.id){   //处理id属性
  19.             options.id = "menu-"+$.youi.menu.menuItems.length;   
  20.             el.attr("id",options.id);   
  21.         }   
  22.            
  23.         if(options.type=="menuSplit"){   
  24.             $.youi.menuItem.initMenuSplit(el,options);   
  25.             return;   
  26.         }else if(options.type=="menuBar"){   
  27.             $.youi.menuItem.initMenuBar(el,options);   
  28.         }else{   
  29.             $.youi.menuItem.initMenuItem(el,options);   
  30.         }   
  31.            
  32.         $("ul:first",el).hide();   
  33.         $("ul:first",el).addClass("youi-menu-panel");   
  34.         /**  
  35.          * 为菜单节点添加访问方法  
  36.          */  
  37.         $.extend(el,{   
  38.             addMenuItem:function(){   
  39.                 $.youi.menuItem.addMenuItem(this);   
  40.             },   
  41.                
  42.             getParent:function(){   
  43.                 return el.parent("li").youiMenuItem({menu:options.menu});   
  44.             },   
  45.                
  46.             toString:function(){   
  47.                 return this.attr("id");   
  48.             }   
  49.         });   
  50.   
  51.         el.mouseover(function(){   
  52.             el.addClass("youi-menu-active");   
  53.             $.youi.menuItem.hoverOverLI($(this),options);   
  54.             return false;   
  55.         });   
  56.            
  57.         el.mouseout(function(){   
  58.             el.removeClass("youi-menu-active");   
  59.             $.youi.menuItem.hoverOutLI($(this));   
  60.             return false;   
  61.         });   
  62.            
  63.         var action = options.action;   
  64.         if(action){   
  65.             el.click(function(){   
  66.                 if($(this).attr("active")=="false"){return false;};//非活动菜单   
  67.                    
  68.                 if(typeof(action)=="string"){   
  69.                     try{   
  70.                         jQuery.actionFactory[action].apply(el,[]);   
  71.                     }catch(err){   
  72.                         //alert("click:"+err.message);   
  73.                         $("#out").html(err.message);   
  74.                         //alert("not find callback function:"+action);   
  75.                     }   
  76.                 }else if(typeof(action)=="function"){   
  77.                     action.apply(el);   
  78.                 }   
  79.             });   
  80.                
  81.         }   
  82.         el.click(function(){return false;});   
  83.            
  84.         $.youi.menu.menuItems.push(el);   
  85.     },   
  86.        
  87.     initMenuSplit:function(el,options){   
  88.         el.addClass("youi-menu-split");   
  89.         el.append('class="youi-menu-split-span"/>');   
  90.     },   
  91.        
  92.     initMenuBar:function(el,options){   
  93.         el.addClass("youi-menu-horizontal");   
  94.         el.click(function(){   
  95.             var activeMenu = options.menu.attr("activeMenu");   
  96.             if(activeMenu=="true"){   
  97.                 options.menu.attr("activeMenu","false");   
  98.                 $("ul",this).hide();   
  99.             }else{   
  100.                 options.menu.attr("activeMenu","true");   
  101.                 $(this).mouseover();   
  102.             }   
  103.             return false;   
  104.         });   
  105.     },   
  106.        
  107.     initMenuItem:function(el,options){   
  108.         el.addClass("youi-menu-vertical");   
  109.         var menuUl = $("ul:first",el);   
  110.         if(menuUl.size()==0){   
  111.             menuUl = $("
      "
    );   
  112.             el.append(menuUl);   
  113.         }else{}   
  114.            
  115.         if(menuUl.prev().is("a")){   
  116.                
  117.         }else{   
  118.             $(el.get(0).firstChild).wrap('');   
  119.         }   
  120.         var link = $("a:first",el);   
  121.         link.addClass("youi-menu-vertical-a");   
  122.         if(options.active=="false"){   
  123.             link.css("color","#8C8C8C");   
  124.         }   
  125.         if($("li",menuUl).size()>0){   
  126.             link.addClass("youi-menu-vertical-arrow");   
  127.         }   
  128.            
  129.         var menuIconDiv = $("div.youi-menu-icon",link);   
  130.         if(menuIconDiv.size()===0){   
  131.             menuIconDiv = $('"images/youi/s.gif" class="youi-menu-icon"/>');   
  132.             link.prepend(menuIconDiv);   
  133.         }   
  134.         var menuIcon = options.menuIcon;   
  135.            
  136.         if(options.checked=="false"){   
  137.             if(options.group){   
  138.                    
  139.             }else{   
  140.                 menuIconDiv.addClass("youi-menu-unchecked-icon");   
  141.             }   
  142.         }else if(options.checked=="true"){   
  143.             if(options.group){   
  144.                 menuIconDiv.addClass("youi-menu-group-checked-icon");   
  145.             }else{   
  146.                 menuIconDiv.addClass("youi-menu-checked-icon");   
  147.             }   
  148.                
  149.         }else{   
  150.             if(menuIcon){   
  151.                 menuIconDiv.css("backgroundImage","url("+menuIcon+")");   
  152.             }   
  153.         }   
  154.            
  155.         el.mousedown(function(){   
  156.             if($(this).attr("active")=="false"){return false;};   
  157.             var checked = this.getAttribute("youiChecked");   
  158.             var group = this.getAttribute("group");   
  159.             var menuIconDiv = $("img.youi-menu-icon:first",this);   
  160.                
  161.             if(checked == "false"){   
  162.                 if(group){   
  163.                     $(this).parent().find('> li[@group='+group+'] > a > img').not(menuIconDiv).removeClass("youi-menu-group-checked-icon");   
  164.                     $(this).parent().find('> li[@group='+group+']').not(this).attr("youiChecked","false");   
  165.                     menuIconDiv.addClass("youi-menu-group-checked-icon");   
  166.                 }else{   
  167.                     menuIconDiv.removeClass("youi-menu-unchecked-icon").addClass("youi-menu-checked-icon");   
  168.                 }   
  169.                 this.setAttribute("youiChecked","true");   
  170.             }else if(checked == "true"){   
  171.                 if(group){   
  172.                        
  173.                 }else{   
  174.                     menuIconDiv.removeClass("youi-menu-checked-icon").addClass("youi-menu-unchecked-icon");   
  175.                     this.setAttribute("youiChecked","false");   
  176.                 }   
  177.             }else{   
  178.                    
  179.             }   
  180.             //如果有子节点,不收起   
  181.             if($("li",this).size()==0){   
  182.                 $(this).click();   
  183.                 $.youi.menu.closeMenu(options.menu);   
  184.             }   
  185.             return false;   
  186.         });   
  187.            
  188.         var hotKey = options.hotKey;   
  189.         if(hotKey){   
  190.             jQuery.hotkeys.add(hotKey,function(){el.click();});   
  191.             var hotKeyPanel = $('class="youi-menu-hotKey">'+hotKey+'');   
  192.             hotKeyPanel.css("right","15px");   
  193.             link.append(hotKeyPanel);   
  194.         }   
  195.     },   
  196.        
  197.     addMenuItem:function(menuItem){   
  198.            
  199.     },   
  200.        
  201.     /*  
  202.      *  
  203.      */  
  204.     hoverOverLI:function(menuItem,options){   
  205.         if(options.menu.attr("activeMenu")!="true"){return;}   
  206.            
  207.         var menuUl = $("ul:first",menuItem);   
  208.         menuItem.parent().find('> li > ul:visible').not(menuUl).hide();   
  209.            
  210.         if($("li",menuUl).size()>0&&menuItem.attr("active")!="false"){   
  211.             if(menuItem.attr("hasLoad")!="true"){   
  212.                 menuItem.attr("hasLoad","true");   
  213.             }   
  214.             menuUl.css("position","absolute");   
  215.             var menuLeft = 0;   
  216.             var menuTop = 0;   
  217.             if(options.type=="menuBar"){   
  218.                 menuLeft = menuItem.get(0).offsetLeft;   
  219.                 menuTop = menuItem.get(0).offsetTop+menuItem.get(0).offsetHeight;   
  220.             }else{   
  221.                 menuLeft = menuItem.get(0).offsetLeft+menuItem.get(0).offsetWidth-6;   
  222.                 menuTop = menuItem.get(0).offsetTop-2;   
  223.             }   
  224.             menuUl.css("left",menuLeft);   
  225.             menuUl.css("top",menuTop);   
  226.             menuUl.show();   
  227.         }   
  228.     },   
  229.        
  230.     hoverOutLI:function(menuItem){   
  231.         $("ul:visible:gt(0)",menuItem).hide();   
  232.     }   
  233. });  

  菜单动作调用实在是没想到什么好方法管理了,就用注册式的action方式吧

js 代码
  1. /******************************************************************************************************************************/  
  2. (function (jQuery){   
  3.     this.version = '(beta)(0.0.1)';   
  4.     this.register = function(name, options, callback) {   
  5.         if (jQuery.isFunction(options)){   
  6.             callback = options;   
  7.             options = {};   
  8.         }   
  9.            
  10.         jQuery.actionFactory[name]=function(){   
  11.             var checked = this.attr("youiChecked");   
  12.             var value = this.attr("value");   
  13.             callback.apply(this,[checked,value]);   
  14.         };   
  15.            
  16.         return jQuery;   
  17.     };       
  18.     this.remove = function(name) {      
  19.         return jQuery;   
  20.     };   
  21.     jQuery.actionFactory = this;   
  22.     return jQuery;       
  23. })(jQuery);  

 调用注册

js 代码
  1. //注册菜单调用方法   
  2. jQuery.actionFactory.register("openFile",function(){   
  3.     alert("openFile...");   
  4. });   
  5.   
  6. jQuery.actionFactory.register("close",function(){   
  7.     alert("close...");   
  8. });   
  9.   
  10. jQuery.actionFactory.register("showToolBar",function(checked){   
  11.     if(checked=="true"){   
  12.         alert("显示工具栏");   
  13.     }else{   
  14.         alert("隐藏工具栏");   
  15.     }   
  16. });   
  17.   
  18. jQuery.actionFactory.register("setFontSize",function(checked,value){   
  19.     alert(value);   
  20. });  

 大概完成了一半,感觉还是比较有意思,看看初步的成功

 

 

 

 

  • 描述: 预览界面
  • 大小: 976.2 KB
分享到:
评论
2 楼 abin30 2008-09-24  
老大,能不能把完整的代码共享一下啊。。 本人js很臭,实在是没有办法自己写啊。。。
1 楼 qq82600528 2007-11-26  
这么漂亮的代码看了几次也,也没有下文。
踩一脚,期待ing...继续!

相关推荐

    jquery小试牛刀

    jQuery拥有庞大的插件生态,如jQuery UI提供丰富的用户界面组件,Bootstrap与jQuery结合实现了响应式设计,还有许多第三方插件用于图表绘制、表单验证等,极大地扩展了jQuery的功能。 总结,jQuery以其高效、易用的...

    小试JQuery的AutoComplete插件

    《使用JQuery AutoComplete插件实现自动提示功能》 在Web应用开发中,为了提高用户体验,经常需要为输入框提供自动提示(AutoComplete)功能,这可以帮助用户更快地找到他们想要输入的信息。JQuery的AutoComplete...

    JQUERY快速入门文档

    第一课 jquery ajax牛刀小试 1. 准备工作 下载jquery包,我放在和本文档相同的文件夹下了,安装很简单,把下载下来的jquery文件简单命名为jquery.js,然后复制到工程文件下的js目录里,就可以在页面中导入使用了。如...

    flutter小试

    Flutter是Google推出的一种开源UI工具包,用于构建高性能、高保真、可在多个平台上运行的原生应用程序。Flutter以其快速开发、丰富的自定义能力和热重载功能而受到开发者喜爱。在"flutter小试"这个主题中,我们将...

    牛刀小试VC

    通过学习MFC,读者可以快速构建出功能丰富的桌面应用程序。 此外,可能还会讲解一些高级主题,如异常处理、文件操作、动态内存管理、多线程编程等。这些内容有助于提升读者解决实际问题的能力。 在《牛刀小试VC》...

    Android 小试牛刀(一)

    Android 小试牛刀1 博文链接:https://huangpengxiao.iteye.com/blog/199497

    java画图板小试

    1. **Java Swing**:Java Swing是Java的标准GUI工具包,它提供了许多组件(如按钮、文本框等)来构建用户界面。在这个项目中,我们将使用JFrame作为主窗口,JPanel作为画布,以及鼠标监听器来处理用户的绘画操作。 ...

    牛刀小试C语言基础教学及实践

    这些知识点都是构建高效、可靠的C程序所必需的。 实践是检验理论的最好方式,"牛刀小试C语言基础教学及实践"中的实践部分可能包含一系列的编程练习和项目,旨在让学习者通过动手实践来巩固理论知识,提升编程能力。...

    通达信指标公式源码小试牛刀.doc

    6. **CD1, CD2, CD3, CD4, CD5, CD6**:这一系列指标用于构建一个波动率和动量相结合的分析系统,CD4的移动平均值(CD6)与当前值(CD5)的比较有助于判断趋势变化。 7. **空头1**:如果前一日的CD6大于当前的CD5,...

    通达信指标公式源码 小试牛刀精髓.doc

    本文档《通达信指标公式源码 小试牛刀精髓.doc》主要介绍了如何利用公式进行技术分析,帮助用户在股市中寻找潜在的投资机会。以下是其中涉及的一些关键知识点: 1. **移动平均线(MA)**: - 移动平均线是股票分析...

    牛刀小试的汇编教程,很好的入门教材!

    这个“牛刀小试的汇编教程”是为初学者设计的一份入门教材,旨在帮助学习者快速理解和掌握汇编语言的基本概念和操作。 汇编语言与机器语言紧密相关,每一行汇编代码都可以直接转换成相应的机器码,执行效率高,但...

    spring cloud demo 小试牛刀

    【标题】"Spring Cloud Demo 小试牛刀" 在IT行业中,Spring Cloud是一个广泛使用的微服务框架,它为开发者提供了构建分布式系统所需的工具,如服务发现、负载均衡、熔断机制等。本项目名为“Spring Cloud Demo”,...

    ASWING教程

    - **ActionScript 2时代的解决方案**:Macromedia为了解决这个问题,在Flash IDE中引入了一套UI组件——Version 2 Components (V2组件),虽然这些组件简化了UI的构建过程,但仍存在诸多不足之处。 - **开源UI库的...

    AndroidMvp小试

    2. **View(视图)**:视图层是用户界面,包括Activity、Fragment或任何UI组件。它的职责是显示数据和响应用户操作,但不包含任何业务逻辑。在MVP中,View通常会与Presenter建立接口,用于通知Presenter用户的行为。...

    v2ex的vue小试项目

    这些组件是Vue应用的基本构建块,负责视图层的渲染。你需要修改组件中与后端交互的URL,使其指向你的PHP服务器地址,以实现前后端通信。 4. **API调用**:Vue.js组件中的API调用可能使用了Vue的内置`axios`库或者...

    第二周牛刀小试测试题答案1

    【知识点详解】 1. 营销漏斗理论:在描述中提到的“营销漏斗”,是指潜在客户从认知品牌到最终购买的过程,通常分为曝光与发现、考虑与购买意图、采取行动和复购等阶段。对于刚建立的户外用品电商网站,目标是增加...

    HTML5初学小试

    这篇“HTML5初学小试”可能是针对初学者的一篇教程,通过实例来介绍HTML5的基本用法和新特性。 在压缩包文件中,我们有以下四个文件: 1. **ball.html**:这可能是一个展示HTML5 canvas元素的示例,canvas是HTML5...

Global site tag (gtag.js) - Google Analytics