- 浏览: 99872 次
- 性别:
- 来自: 武汉
最新评论
-
Freeman19211105:
楼主,下次 尽可能分享的时候把包贴出来,要不很容易倒错包的
spring中动态加载bean的简单实现 -
zy463395598:
您好,请问可以给个动态加载定时任务的例子吗?我这边按照您的方法 ...
spring中动态加载bean的简单实现 -
zhyi_12:
xuelang1234 写道博主你这个项目采用什么开源协议?D ...
web流程设计器再整理 -
xuelang1234:
博主你这个项目采用什么开源协议?
web流程设计器再整理 -
xuelang1234:
Do a good job!
web流程设计器再整理
最近试用了一下EXT2.0的UI组件,又把jquery的官方UI插件库下来看了下。虽说我个人是更喜欢jquey的风格的,但对于组件化的UI来说,两者目前还有较大的差距。翻翻jquery的插件库,没有找到一个比较顺眼的菜单组件。正好拿这个开刀,仿照EXT写个组件自娱自乐一下。鄙视一下自己直接拿了EXT的图标就用。
习惯性的使用dom元素的属性进行扩展。 习惯性的喜欢下面的方式构建插件
- 构建框架
js 代码
- (function($) {
- $.youi = $.youi || {};
- $.youi.menu = {};
- $.youi.menuItem = {};
- $.extend($.youi.menu, {..........});
- $.extend($.youi.menuItem, {..........});
- ....................
- })(jQuery);
- 定义jquery扩展访问方法
- $.fn.extend({
- youiMenu:function(options){
- var menu = this;
- $.youi.menu.create(this,options);
- return menu;
- },
- youiMenuItem:function(options){
- var menuItem = this;
- $.youi.menuItem.create(this,options);
- return menuItem;
- }
- });
3. 写执行代码,代码向来写的很不规范,每次都等着重构。
扩展 $.youi.menu
js代码
- $.extend($.youi.menu, {
- menuItems:[],
- /**
- * 初始化函数
- */
- create:function(el,options){
- $.youi.menu.initMenu(el,options);
- $("body",document).click(function(){
- $.youi.menu.closeMenu(el);
- });
- },
- initMenu:function(el,options){
- $("ul>li",el).each(function(){
- $(this).youiMenuItem({menu:el});
- });
- },
- closeMenu:function(menu){
- $($.youi.menu.menuItems).each(function(){
- $("ul",this).hide();
- });
- menu.attr("activeMenu","false"); //菜单激活属性
- }
- });
扩展$.youi.menuItem
向来喜欢用dom的属性进行扩展。习惯了jquery的options。
js 代码
- $.extend($.youi.menuItem, {
- menuItemAttrs:function(el){
- return {
- id :el.attr("id"),
- text :el.attr("text"),
- menuIcon:el.attr("menuIcon"),
- action :el.attr("youiAction"),//opera中 action属性会自动加上路径 file://D:...
- hotKey :el.attr("hotKey"),
- type :el.attr("menuType"),//本想使用type的 可opera不干
- checked :el.attr("youiChecked"),//opera中checked属性只能显示checked,有时opera,无语了....
- group :el.attr("group"),
- active :el.attr("active")
- };
- },
- create:function(el,options){
- options = $.extend({},options,$.youi.menuItem.menuItemAttrs(el));
- if(!options.id){ //处理id属性
- options.id = "menu-"+$.youi.menu.menuItems.length;
- el.attr("id",options.id);
- }
- if(options.type=="menuSplit"){
- $.youi.menuItem.initMenuSplit(el,options);
- return;
- }else if(options.type=="menuBar"){
- $.youi.menuItem.initMenuBar(el,options);
- }else{
- $.youi.menuItem.initMenuItem(el,options);
- }
- $("ul:first",el).hide();
- $("ul:first",el).addClass("youi-menu-panel");
- /**
- * 为菜单节点添加访问方法
- */
- $.extend(el,{
- addMenuItem:function(){
- $.youi.menuItem.addMenuItem(this);
- },
- getParent:function(){
- return el.parent("li").youiMenuItem({menu:options.menu});
- },
- toString:function(){
- return this.attr("id");
- }
- });
- el.mouseover(function(){
- el.addClass("youi-menu-active");
- $.youi.menuItem.hoverOverLI($(this),options);
- return false;
- });
- el.mouseout(function(){
- el.removeClass("youi-menu-active");
- $.youi.menuItem.hoverOutLI($(this));
- return false;
- });
- var action = options.action;
- if(action){
- el.click(function(){
- if($(this).attr("active")=="false"){return false;};//非活动菜单
- if(typeof(action)=="string"){
- try{
- jQuery.actionFactory[action].apply(el,[]);
- }catch(err){
- //alert("click:"+err.message);
- $("#out").html(err.message);
- //alert("not find callback function:"+action);
- }
- }else if(typeof(action)=="function"){
- action.apply(el);
- }
- });
- }
- el.click(function(){return false;});
- $.youi.menu.menuItems.push(el);
- },
- initMenuSplit:function(el,options){
- el.addClass("youi-menu-split");
- el.append('class="youi-menu-split-span"/>');
- },
- initMenuBar:function(el,options){
- el.addClass("youi-menu-horizontal");
- el.click(function(){
- var activeMenu = options.menu.attr("activeMenu");
- if(activeMenu=="true"){
- options.menu.attr("activeMenu","false");
- $("ul",this).hide();
- }else{
- options.menu.attr("activeMenu","true");
- $(this).mouseover();
- }
- return false;
- });
- },
- initMenuItem:function(el,options){
- el.addClass("youi-menu-vertical");
- var menuUl = $("ul:first",el);
- if(menuUl.size()==0){
- menuUl = $("
- "
- el.append(menuUl);
- }else{}
- if(menuUl.prev().is("a")){
- }else{
- $(el.get(0).firstChild).wrap('');
- }
- var link = $("a:first",el);
- link.addClass("youi-menu-vertical-a");
- if(options.active=="false"){
- link.css("color","#8C8C8C");
- }
- if($("li",menuUl).size()>0){
- link.addClass("youi-menu-vertical-arrow");
- }
- var menuIconDiv = $("div.youi-menu-icon",link);
- if(menuIconDiv.size()===0){
- menuIconDiv = $('"images/youi/s.gif" class="youi-menu-icon"/>');
- link.prepend(menuIconDiv);
- }
- var menuIcon = options.menuIcon;
- if(options.checked=="false"){
- if(options.group){
- }else{
- menuIconDiv.addClass("youi-menu-unchecked-icon");
- }
- }else if(options.checked=="true"){
- if(options.group){
- menuIconDiv.addClass("youi-menu-group-checked-icon");
- }else{
- menuIconDiv.addClass("youi-menu-checked-icon");
- }
- }else{
- if(menuIcon){
- menuIconDiv.css("backgroundImage","url("+menuIcon+")");
- }
- }
- el.mousedown(function(){
- if($(this).attr("active")=="false"){return false;};
- var checked = this.getAttribute("youiChecked");
- var group = this.getAttribute("group");
- var menuIconDiv = $("img.youi-menu-icon:first",this);
- if(checked == "false"){
- if(group){
- $(this).parent().find('> li[@group='+group+'] > a > img').not(menuIconDiv).removeClass("youi-menu-group-checked-icon");
- $(this).parent().find('> li[@group='+group+']').not(this).attr("youiChecked","false");
- menuIconDiv.addClass("youi-menu-group-checked-icon");
- }else{
- menuIconDiv.removeClass("youi-menu-unchecked-icon").addClass("youi-menu-checked-icon");
- }
- this.setAttribute("youiChecked","true");
- }else if(checked == "true"){
- if(group){
- }else{
- menuIconDiv.removeClass("youi-menu-checked-icon").addClass("youi-menu-unchecked-icon");
- this.setAttribute("youiChecked","false");
- }
- }else{
- }
- //如果有子节点,不收起
- if($("li",this).size()==0){
- $(this).click();
- $.youi.menu.closeMenu(options.menu);
- }
- return false;
- });
- var hotKey = options.hotKey;
- if(hotKey){
- jQuery.hotkeys.add(hotKey,function(){el.click();});
- var hotKeyPanel = $('class="youi-menu-hotKey">'+hotKey+'');
- hotKeyPanel.css("right","15px");
- link.append(hotKeyPanel);
- }
- },
- addMenuItem:function(menuItem){
- },
- /*
- *
- */
- hoverOverLI:function(menuItem,options){
- if(options.menu.attr("activeMenu")!="true"){return;}
- var menuUl = $("ul:first",menuItem);
- menuItem.parent().find('> li > ul:visible').not(menuUl).hide();
- if($("li",menuUl).size()>0&&menuItem.attr("active")!="false"){
- if(menuItem.attr("hasLoad")!="true"){
- menuItem.attr("hasLoad","true");
- }
- menuUl.css("position","absolute");
- var menuLeft = 0;
- var menuTop = 0;
- if(options.type=="menuBar"){
- menuLeft = menuItem.get(0).offsetLeft;
- menuTop = menuItem.get(0).offsetTop+menuItem.get(0).offsetHeight;
- }else{
- menuLeft = menuItem.get(0).offsetLeft+menuItem.get(0).offsetWidth-6;
- menuTop = menuItem.get(0).offsetTop-2;
- }
- menuUl.css("left",menuLeft);
- menuUl.css("top",menuTop);
- menuUl.show();
- }
- },
- hoverOutLI:function(menuItem){
- $("ul:visible:gt(0)",menuItem).hide();
- }
- });
菜单动作调用实在是没想到什么好方法管理了,就用注册式的action方式吧
js 代码
- /******************************************************************************************************************************/
- (function (jQuery){
- this.version = '(beta)(0.0.1)';
- this.register = function(name, options, callback) {
- if (jQuery.isFunction(options)){
- callback = options;
- options = {};
- }
- jQuery.actionFactory[name]=function(){
- var checked = this.attr("youiChecked");
- var value = this.attr("value");
- callback.apply(this,[checked,value]);
- };
- return jQuery;
- };
- this.remove = function(name) {
- return jQuery;
- };
- jQuery.actionFactory = this;
- return jQuery;
- })(jQuery);
调用注册
js 代码
- //注册菜单调用方法
- jQuery.actionFactory.register("openFile",function(){
- alert("openFile...");
- });
- jQuery.actionFactory.register("close",function(){
- alert("close...");
- });
- jQuery.actionFactory.register("showToolBar",function(checked){
- if(checked=="true"){
- alert("显示工具栏");
- }else{
- alert("隐藏工具栏");
- }
- });
- jQuery.actionFactory.register("setFontSize",function(checked,value){
- alert(value);
- });
大概完成了一半,感觉还是比较有意思,看看初步的成功
评论
2 楼
abin30
2008-09-24
老大,能不能把完整的代码共享一下啊。。 本人js很臭,实在是没有办法自己写啊。。。
1 楼
qq82600528
2007-11-26
这么漂亮的代码看了几次也,也没有下文。
踩一脚,期待ing...继续!
踩一脚,期待ing...继续!
发表评论
-
web流程设计器再整理
2015-08-20 11:47 1978引言 时隔多年,前端发展实在迅猛,各 ... -
YOUI组件库之filed组件构建思路
2010-01-01 00:57 1261一、YOUI组件库通用约定 1、遵循jQuery官方UI组件 ... -
web UI 组件化的一些经历
2009-12-14 21:47 3089当年,统计局中的牛 ... -
jbpm4设计器 Application化的雏形
2009-05-11 23:09 2633对jbpm4的web设计器做了进一步的整合验证,主要是为了寻找 ... -
JBPM4 web设计器实践--命令模式的使用
2009-05-08 21:39 2210目的:在web设计器中使用command模式实现动作的撤销 ... -
jbpm4 web设计器的初步方案
2009-05-02 20:59 6080上次由于jbpm4的出现打乱了我jbpm3的学习计划和j ... -
树使用css选择器优化代码(IE7+,firefox3,opera9,chrom下可用)
2009-03-27 12:33 1633在IE6 下,不支持 .parent > .ch ... -
功能简单的基于jquery UI的grid组件
2008-07-03 18:31 3669这两天看了下UI1.5的代码,重新把grid组件组件写了下。实 ... -
jQuery UI v1.5 Released,代码重构到不认识
2008-06-18 10:34 1068官方博客:jQuery UI v1.5 Released, F ... -
jquery组件创建模式(转载)
2007-11-27 10:23 1364转自 http://www.learningjquery.c ... -
使用jquery做树组件
2007-11-26 21:29 6974最近整理了一下树,使用jquery插件的方式重写。感觉比以 ... -
使用jquery做报表组件
2007-11-16 11:15 5986以前做统计项目的时候写过基于jquery的报表展示组件,现 ...
相关推荐
jQuery拥有庞大的插件生态,如jQuery UI提供丰富的用户界面组件,Bootstrap与jQuery结合实现了响应式设计,还有许多第三方插件用于图表绘制、表单验证等,极大地扩展了jQuery的功能。 总结,jQuery以其高效、易用的...
《使用JQuery AutoComplete插件实现自动提示功能》 在Web应用开发中,为了提高用户体验,经常需要为输入框提供自动提示(AutoComplete)功能,这可以帮助用户更快地找到他们想要输入的信息。JQuery的AutoComplete...
第一课 jquery ajax牛刀小试 1. 准备工作 下载jquery包,我放在和本文档相同的文件夹下了,安装很简单,把下载下来的jquery文件简单命名为jquery.js,然后复制到工程文件下的js目录里,就可以在页面中导入使用了。如...
Flutter是Google推出的一种开源UI工具包,用于构建高性能、高保真、可在多个平台上运行的原生应用程序。Flutter以其快速开发、丰富的自定义能力和热重载功能而受到开发者喜爱。在"flutter小试"这个主题中,我们将...
通过学习MFC,读者可以快速构建出功能丰富的桌面应用程序。 此外,可能还会讲解一些高级主题,如异常处理、文件操作、动态内存管理、多线程编程等。这些内容有助于提升读者解决实际问题的能力。 在《牛刀小试VC》...
Android 小试牛刀1 博文链接:https://huangpengxiao.iteye.com/blog/199497
1. **Java Swing**:Java Swing是Java的标准GUI工具包,它提供了许多组件(如按钮、文本框等)来构建用户界面。在这个项目中,我们将使用JFrame作为主窗口,JPanel作为画布,以及鼠标监听器来处理用户的绘画操作。 ...
这些知识点都是构建高效、可靠的C程序所必需的。 实践是检验理论的最好方式,"牛刀小试C语言基础教学及实践"中的实践部分可能包含一系列的编程练习和项目,旨在让学习者通过动手实践来巩固理论知识,提升编程能力。...
6. **CD1, CD2, CD3, CD4, CD5, CD6**:这一系列指标用于构建一个波动率和动量相结合的分析系统,CD4的移动平均值(CD6)与当前值(CD5)的比较有助于判断趋势变化。 7. **空头1**:如果前一日的CD6大于当前的CD5,...
本文档《通达信指标公式源码 小试牛刀精髓.doc》主要介绍了如何利用公式进行技术分析,帮助用户在股市中寻找潜在的投资机会。以下是其中涉及的一些关键知识点: 1. **移动平均线(MA)**: - 移动平均线是股票分析...
这个“牛刀小试的汇编教程”是为初学者设计的一份入门教材,旨在帮助学习者快速理解和掌握汇编语言的基本概念和操作。 汇编语言与机器语言紧密相关,每一行汇编代码都可以直接转换成相应的机器码,执行效率高,但...
【标题】"Spring Cloud Demo 小试牛刀" 在IT行业中,Spring Cloud是一个广泛使用的微服务框架,它为开发者提供了构建分布式系统所需的工具,如服务发现、负载均衡、熔断机制等。本项目名为“Spring Cloud Demo”,...
- **ActionScript 2时代的解决方案**:Macromedia为了解决这个问题,在Flash IDE中引入了一套UI组件——Version 2 Components (V2组件),虽然这些组件简化了UI的构建过程,但仍存在诸多不足之处。 - **开源UI库的...
2. **View(视图)**:视图层是用户界面,包括Activity、Fragment或任何UI组件。它的职责是显示数据和响应用户操作,但不包含任何业务逻辑。在MVP中,View通常会与Presenter建立接口,用于通知Presenter用户的行为。...
这些组件是Vue应用的基本构建块,负责视图层的渲染。你需要修改组件中与后端交互的URL,使其指向你的PHP服务器地址,以实现前后端通信。 4. **API调用**:Vue.js组件中的API调用可能使用了Vue的内置`axios`库或者...
【知识点详解】 1. 营销漏斗理论:在描述中提到的“营销漏斗”,是指潜在客户从认知品牌到最终购买的过程,通常分为曝光与发现、考虑与购买意图、采取行动和复购等阶段。对于刚建立的户外用品电商网站,目标是增加...
这篇“HTML5初学小试”可能是针对初学者的一篇教程,通过实例来介绍HTML5的基本用法和新特性。 在压缩包文件中,我们有以下四个文件: 1. **ball.html**:这可能是一个展示HTML5 canvas元素的示例,canvas是HTML5...