龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

非常漂亮网页右键菜单,JQuery实现右键菜单(3)

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
01. //获取菜单的跟 02. var $root = $( "#" + option.alias); 03. var root = null ; 04. if ($root.length == 0) { //如果顶级不存在,这创建顶级菜单哦 05. root = buildGroup.apply(gTemp

01.//获取菜单的跟
02.var $root = $("#" + option.alias);
03.      var root = null;
04.      if ($root.length == 0) { //如果顶级不存在,这创建顶级菜单哦
05.          root = buildGroup.apply(gTemplet.clone()[0], [option]);
06.          root.applyrule = applyRule; //把一个方法注册到dom上
07.          root.showMenu = showMenu; //另外一个方法注册的该dom上
08.          addItems(option.alias, option.items); //添加菜单项
09.      }
10.      else {
11.          root = $root[0]; //否则就用这个了
12.      }

这个代码很玄乎,好像做了些什么好像有什么都没做,其实只有来看下buildGroup方法和addItems才知道到底干了什么

01.var buildGroup = function(obj) { //创建菜单容器
02.        groups[obj.alias] = this; //菜单项注册到临时变量中
03.        this.gidx = obj.alias;
04.        this.id = obj.alias;
05.        if (obj.disable) { //如果是禁用状态
06.            this.disable = obj.disable;
07.            this.className = "b-m-idisable";
08.        }
09.    //设置菜单宽度,设置事件的阻止事件冒泡,并添加到body中
10.        $(this).width(obj.width).click(returnfalse).mousedown(returnfalse).appendTo($("body"));
11.        obj = null;
12.        return this; //返回菜单本身
13.    };

有了容器就可以往里面添加菜单项了,我在代码中加了详细的注释了,应该可以很好的理解了

01.//添加菜单项
02.  var addItems = function(gidx, items) {
03.      var tmp = null;
04.      for (var i = 0; i < items.length; i++) { 
05.          if (items[i].type == "splitLine") { //如果是分割线
06.              //菜单分隔线
07.              tmp = sTemplet.clone()[0]; 
08.          } else {
09.              items[i].gidx = gidx; //把group的标识赋给item上
10.              if (items[i].type == "group") { 
11.                  //菜单组
12.                  buildGroup.apply(gTemplet.clone()[0], [items[i]]); //每个菜单组都是独立的div哦,所以顶级一样调用生产组的方法
13.                  arguments.callee(items[i].alias, items[i].items);//递归生成菜单项
14.                  items[i].type = "arrow"; //如果是group生成箭头
15.                  tmp = buildItem.apply(iTemplet.clone()[0], [items[i]]);//生成菜单项的html
16.              } else {
17.                  //菜单项
18.                  items[i].type = "ibody";
19.                  tmp = buildItem.apply(iTemplet.clone()[0], [items[i]]);//生成菜单项的html
20.                  $(tmp).click(function(e) { //如果菜单项那么注册click事件
21.                      if (!this.disable) {
22.                          if ($.isFunction(actions[this.idx])) {
23.                              actions[this.idx].call(this, target);
24.                          }
25.                          hideMenuPane();
26.                      }
27.                      return false;
28.                  });
29.              } //Endif
30.           //把菜单项的右键事件屏蔽,同时注册hover的效果
31.              $(tmp).bind("contextmenu", returnfalse).hover(overItem, outItem);
32.          } //Endif
33.          groups[gidx].appendChild(tmp); //把菜单项添加到group的中
34.          tmp = items[i] = items[i].items = null;
35.      } //Endfor
36.      gidx = items = null;
37.  };

builditem方法就比较简单,就不详细描述了,接着我们还是继续往下看主流程了哦

01.   
02.var me = $(this).each(function() {
03.       //给元素添加右键事件了哦
04.            return $(this).bind('contextmenu', function(e) {
05.        //如果(option.onContextMenu 存在则调用并判断返回值是否显示菜单,可以利用这个在特定情况下禁用菜单
06.                var bShowContext = (option.onContextMenu && $.isFunction(option.onContextMenu)) ? option.onContextMenu.call(this, e) : true;
07.                if (bShowContext) {
08.            //触发onShow事件,这个事件中可以执行修改rule,禁用某几项菜单项哦
09.                    if (option.onShow && $.isFunction(option.onShow)) {
10.                        option.onShow.call(this, root);
11.                    }
12.                    root.showMenu(e, this);//调用显示菜单
13.                }
14.        //阻止冒泡
15.                return false;
16.            });
17.        });
18.        //设置显示规则,第一次执行时的规则,同时也可以onshow中动态设置rule
19.        if (option.rule) {
20.            applyRule(option.rule);
21.        }

基本就OK了,另外几个方法就比较简单了,还有亮点是边缘的处理,这个前面的datepicker中也有相应的说明逻辑差不多就不在描述了,同样还是来看下demo吧。关于打包下载,大家可以把demo的网页完整的另存为即可

http://jscs.cloudapp.net/ControlsSample/CM

编辑推荐Jquery文章,希望你喜欢:
JS优秀框架:jQuery最新版下载地址及jquery官方
http://www.xueit.com/html/2009-03/33_992_00.html
使用JQUERY仿GOOGLE自动完成插件
http://www.xueit.com/html/2009-03/33_874_00.html
实例JQuery+Ajax实现无刷新数据查询(仿Google/百度搜索框)
http://www.xueit.com/html/2009-05/33_1796_00.html
JQuery选项卡插件推荐:17个引人注目JQuery导航菜单
http://www.xueit.com/html/2009-09/2_4447_00.html
JQuery插件大全下载,共有240个JQuery插件哦
http://www.xueit.com/html/2009-09/33_4506_00.html
jquery仿百度图片幻灯浏览功能
http://www.xueit.com/html/2009-09/33_4573_00.html
jQuery投票插件:jQuery实现投票系统显示结果插件
http://www.xueit.com/html/2009-11-10/33-1250974127921.html
不可不看20个超级酷Jquery实用效果例子
http://www.xueit.com/html/2009-11-25/33-1484914632500.html
非常漂亮网页右键菜单,JQuery实现右键菜单
http://www.xueit.com/html/2009-10-30/33-19177319171.html
推荐10个jquery动画菜单 十分漂亮的Jquery菜单插件
http://www.xueit.com/html/2009-11-20/33-2102769523921.html


精彩图集

赞助商链接