现在的位置: 首页 > 综合 > 正文

mass Framework menu插件

2012年10月26日 ⁄ 综合 ⁄ 共 4767字 ⁄ 字号 评论关闭

menu插件的结构是基于tabs插件上改进过来的,以后就连tabs插件都会改成这种新的形式。或许过不久,我会将这种结构抽象成一个新的模块,里面提供一个类,让所有UI插件都继承自它。

新插件系统的简述:

  • 插件名即实例方法名,并且此插件只添加一个实例方法,如tabs插件只在$.fn中添加一个tabs方法。
  • 此实例方法同时拥有初始化插件,销毁插件,调用插件的各种方法的能力。
  • 当某一元素被包装成mass的节点链对象$(node)后,第一次调用此插件方法,即是初始化插件。一般地,参数为一个对象。
  • 当这个节点链对象再次调用插件方法,传入的第一个参数为字符串,则会判定此插件对象有没有此方法,有则调用此方法。
  • 想移除当前UI,只需传入"destroy"。
  • 所有插件对象都拥有getUI, invoke, destroy, setOptions方法,都拥有parent, target, ID属性。

下面menu插件的配置参数:

data
必需。一个对象数组,里面的对象要求拥有html或sub属性,sub也是一个类似结构的对象数组。
hover_class
可选。菜单项移上去时发生作用的类名,默认是hover。
direction
可选。可用值为"vertical"或"horizontal", 默认是"vertical"。


      $1.require("ready,20120303_menu",function( ){
               $1("#black").menu({
                    data: [
                        {
                            html:"随笔",
                            sub:[
                                {html:"生活"},
                                {html:"杂文"},
                                {html:"思考"}
                            ]
                        },
                        {
                            html:"编程工具",
                            sub:[
                                {html:"Vim"},
                                {html:"NetBeans"},
                                {html:"Git"}
                            ]
                        },
                        {
                            html:"编程语言",
                            sub:[
                                {html:"Web开发",sub:[
                                        {html:"HTML"},
                                        {html:"javascript"},
                                        {html:"CSS"}
                                    ]},
                                {html:"Python"},
                                {html:"Java语言"},
                                {html:"C/C++"},
                                {html:"Android开发"}
                            ]
                        },
                        {html:"操作系统",sub:[
                                {html:"IOS"},
                                {html:"window"},
                                {html:"ubuntu"}
                            ]}
                    ],
                    direction: "horizontal"
                });
            });

      #black .menu_item{
                width:120px;
                padding-left:10px;
                height:24px;
                line-height:24px;
                border-bottom:1px solid #fff;
                background:#000;
                color:#fff;
            }
            #black .hover {
                background:#636!important;
                color:black;
            }

我们再来一个复杂的垂直菜单,它是显示mass Framework的所有API。

 #bright .main_menu,
            #bright .sub_menu{ 
                width:130px;
                -moz-box-shadow:0 0 10px #06c;
                -webkit-box-shadow:0 0 10px #06c;
                box-shadow:0 0 10px #06c;
            }
            #bright .menu_item{
                width:120px;
                padding-left:10px;
                height:24px;
                line-height:24px;
                border-bottom:1px solid #fff;
                background:#0088aa;
                color:#fff;
            }
            #bright .hover {
                background:#f36100!important;
                color:black;
            }
    $1.require("ready,more/menu,more/api",function( _,_,api ){
    var pathMap = {
                    "模块加载模块":  "core/$",
                    "特征侦探模块":  "support/$",
                    "语言扩展模块":  "lang/$",
                    "类工厂模块":    "class/$",
                    "选择器模块":    "query/$",
                    "数据缓存模块":  "data/$",
                    "节点模块":      "node/$",
                    "属性模块":      "attr/$",
                    "事件模块":      "event/$",
                    "样式模块":      "css/$",
                    "动画模块":      "fx/$",
                    "操作流模块":    "flow/$",
                    "数据交互模块":  "ajax/$"
    }
    var makeData = function( json, path ){
        return  Object.keys( json ).map(function(key){
            var ret = {
                html: key
            }
            var new_path = path + (typeof pathMap[key] == "string" ? pathMap[key] :  key) + "."
            if(typeof json[ key ] === "object"){
                ret.sub = makeData( json[ key ], new_path);
            }else{
                ret.attr = {
                    type: json[ key ],
                    path: new_path + "html"
                }
            }
            return ret;
        },json );
    }
    //上面的代码用于生成menu的数据包
    var menu = $1("#bright").menu({
        data: makeData(api, "")
    }).menu("getUI").target;
    
    $1(document).click(function(e){//点击其他处隐藏二级或二级以上的子菜单
        if(!$1.contains(menu[0], e.target)){
            menu.find(".sub_menu:visible").hide();
        }
    })

有关menu插件更详细的说明请到github中查看。

posted on 2012-03-03 18:25 司徒正美 阅读(...) 评论(...) 编辑 收藏

抱歉!评论已关闭.