- 浏览: 99008 次
- 性别:
- 来自: 武汉
最新评论
-
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 1932引言 时隔多年,前端发展实在迅猛,各 ... -
YOUI组件库之filed组件构建思路
2010-01-01 00:57 1224一、YOUI组件库通用约定 1、遵循jQuery官方UI组件 ... -
web UI 组件化的一些经历
2009-12-14 21:47 3049当年,统计局中的牛 ... -
jbpm4设计器 Application化的雏形
2009-05-11 23:09 2598对jbpm4的web设计器做了进一步的整合验证,主要是为了寻找 ... -
JBPM4 web设计器实践--命令模式的使用
2009-05-08 21:39 2176目的:在web设计器中使用command模式实现动作的撤销 ... -
jbpm4 web设计器的初步方案
2009-05-02 20:59 6031上次由于jbpm4的出现打乱了我jbpm3的学习计划和j ... -
树使用css选择器优化代码(IE7+,firefox3,opera9,chrom下可用)
2009-03-27 12:33 1603在IE6 下,不支持 .parent > .ch ... -
功能简单的基于jquery UI的grid组件
2008-07-03 18:31 3635这两天看了下UI1.5的代码,重新把grid组件组件写了下。实 ... -
jQuery UI v1.5 Released,代码重构到不认识
2008-06-18 10:34 1040官方博客:jQuery UI v1.5 Released, F ... -
jquery组件创建模式(转载)
2007-11-27 10:23 1340转自 http://www.learningjquery.c ... -
使用jquery做树组件
2007-11-26 21:29 6940最近整理了一下树,使用jquery插件的方式重写。感觉比以 ... -
使用jquery做报表组件
2007-11-16 11:15 5948以前做统计项目的时候写过基于jquery的报表展示组件,现 ...
相关推荐
在项目制作中,有时候需要向用户提供一定的帮助信息来提示用户的操作,当然,suggest功能是必不可少的,但是自己开发的话,是比较费时费事的,这里就直接拿JQuery的autocomplete来用吧, 实验证明,效果很好
NULL 博文链接:https://liwenshui322.iteye.com/blog/479782
第一课 jquery ajax牛刀小试 1. 准备工作 下载jquery包,我放在和本文档相同的文件夹下了,安装很简单,把下载下来的jquery文件简单命名为jquery.js,然后复制到工程文件下的js目录里,就可以在页面中导入使用了。如...
通达信指标公式源码 小试牛刀精髓.doc
Android 小试牛刀1 博文链接:https://huangpengxiao.iteye.com/blog/199497
通达信指标公式源码小试牛刀.doc
牛刀小试 VC++教程高清PDF版.pdf
第5季-小试牛刀-项目开发
牛刀小试C语言基础教学及实践,适合初学者学习。
1. 想象今天你是户外用品的电商,主要销售到美国,你刚建好网站并希望可以增 2. 为什么谷歌分析工具(Google Analytics)跟谷歌广告平台(Goog
echarts小试-龙虎榜数据显示。 整理龙虎榜数据,使用 eCharts显示,并可以下载导入通达信自选股文件
暴雪作业(修改,小试牛刀,大家给点意见[配有音乐)
小试牛刀.exe
学汇编最好的入门教程!更浅显,更易懂!从实践出发!
ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)
各位同学,此篇文档有助于刚接触Docker学员,请根据文档进行实战一下,有助于加深对Docker的理解
刘易斯小试牛刀.nrp
大名鼎鼎得0ginr牛刀小试 教你VC 珍藏资料 大名鼎鼎得0ginr牛刀小试 教你VC 珍藏资料
PLSQL练习(小试牛刀)