前言

使用$.fn.menu.defaults重写默认值对象。下载该插件翻译源码

菜单组件通常用于快捷菜单。他是构建其他菜单组件的必备基础组件。比如:menubutton和splitbutton。它还可以用于导航和执行命令。

源码

/**
* jQuery EasyUI 1.3.2
*
* 翻译:qq 1364386878
*
*g=this p=g.options
*/
(function ($) {
//初始化
function _init(target) {
$(target).appendTo("body");
$(target).addClass("menu-top");
$(document).unbind(".menu").bind("mousedown.menu", function (e) {
var visible = $("body>div.menu:visible");
var m = $(e.target).closest("div.menu", visible);
if (m.length) {
return;
}
$("body>div.menu-top:visible").menu("hide");
});
var menus = adjust($(target));
for (var i = 0; i < menus.length; i++) {
wrapMenu(menus[i]);
}
//递归获取菜单项
function adjust(menu) {
var menus = [];
menu.addClass("menu");
if (!menu[0].style.width) {
menu[0].autowidth = true;
}
menus.push(menu);
if (!menu.hasClass("menu-content")) {
menu.children("div").each(function () {
var divchild = $(this).children("div");
if (divchild.length) {
divchild.insertAfter(target);
this.submenu = divchild;
var mm = adjust(divchild);
menus = menus.concat(mm);
}
});
}
return menus;
}; function wrapMenu(menu) {
if (!menu.hasClass("menu-content")) {
menu.children("div").each(function () {
var item = $(this);
if (item.hasClass("menu-sep")) {
} else {
var options = $.extend({}, $.parser.parseOptions(this, ["name", "iconCls", "href"]),
{ disabled: (item.attr("disabled") ? true : undefined) });
item.attr("name", options.name || "").attr("href", options.href || ""); var text = item.addClass("menu-item").html();
item.empty().append($("<div class=\"menu-text\"></div>").html(text));
if (options.iconCls) {
$("<div class=\"menu-icon\"></div>").addClass(options.iconCls).appendTo(item);
}
if (options.disabled) {
_enableItem(target, item[0], true);
}
if (item[0].submenu) {
$("<div class=\"menu-rightarrow\"></div>").appendTo(item);
}
item._outerHeight(22);
_f(target, item);
}
});
$("<div class=\"menu-line\"></div>").prependTo(menu);
}
_10(target, menu);
menu.hide();
menuEvent(target, menu);
};
}; function _10(target, parm) {
var options = $.data(target, "menu").options;
var d = parm.css("display");
parm.css({ display: "block", left: -10000 });
var width = parm._outerWidth();
var menuwidth = 0;
parm.find("div.menu-text").each(function () {
if (menuwidth < $(this)._outerWidth()) {
menuwidth = $(this)._outerWidth();
}
});
menuwidth += 65;
parm._outerWidth(Math.max(width, menuwidth, options.minWidth));
parm.css("display", d);
};
//菜单事件
function menuEvent(target, menu2) {
var menu = $.data(target, "menu");
menu2.unbind(".menu").bind("mouseenter.menu", function () {
if (menu.timer) {
clearTimeout(menu.timer);
menu.timer = null;
}
}).bind("mouseleave.menu", function () {
menu.timer = setTimeout(function () {
_hide(target);//隐藏菜单
}, 100);
});
};
//菜单项事件
function _f(target, item) {
item.unbind(".menu");
item.bind("click.menu", function () {
if ($(this).hasClass("menu-item-disabled")) {
return;
}
if (!this.submenu) {
_hide(target);
var _1d = $(this).attr("href");
if (_1d) {
location.href = _1d;
}
}
var _1e = $(target).menu("getItem", this);
$.data(target, "menu").options.onClick.call(target, _1e);
}).bind("mouseenter.menu", function (e) {
item.siblings().each(function () {
if (this.submenu) {
hideMenu(this.submenu);
}
$(this).removeClass("menu-active");
});
item.addClass("menu-active");
if ($(this).hasClass("menu-item-disabled")) {
item.addClass("menu-active-disabled");
return;
}
var _1f = item[0].submenu;
if (_1f) {
$(target).menu("show", { menu: _1f, parent: item });
}
}).bind("mouseleave.menu", function (e) {
item.removeClass("menu-active menu-active-disabled");
var menu = item[0].submenu;
if (menu) {
if (e.pageX >= parseInt(menu.css("left"))) {
item.addClass("menu-active");
} else {
hideMenu(menu);
}
} else {
item.removeClass("menu-active");
}
});
};
//隐藏菜单
function _hide(target) {
var menu = $.data(target, "menu");
if (menu) {
if ($(target).is(":visible")) {
hideMenu($(target));
menu.options.onHide.call(target);
}
}
return false;
};
// //显示菜单到指定的位置pos(left/right)
function _showmenu(target, pos) {
var left, top;
var menu = $(pos.menu || target);
if (menu.hasClass("menu-top")) {
var options = $.data(target, "menu").options;
left = options.left;
top = options.top;
if (pos.alignTo) {
var at = $(pos.alignTo);
left = at.offset().left;
top = at.offset().top + at._outerHeight();
}
if (pos.left != undefined) {
left = pos.left;
}
if (pos.top != undefined) {
top = pos.top;
}
if (left + menu.outerWidth() > $(window)._outerWidth() + $(document)._scrollLeft()) {
left = $(window)._outerWidth() + $(document).scrollLeft() - menu.outerWidth() - 5;
}
if (top + menu.outerHeight() > $(window)._outerHeight() + $(document).scrollTop()) {
top -= menu.outerHeight();
}
} else {
var parent = pos.parent;
left = parent.offset().left + parent.outerWidth() - 2;
if (left + menu.outerWidth() + 5 > $(window)._outerWidth() + $(document).scrollLeft()) {
left = parent.offset().left - menu.outerWidth() + 2;
}
var top = parent.offset().top - 3;
if (top + menu.outerHeight() > $(window)._outerHeight() + $(document).scrollTop()) {
top = $(window)._outerHeight() + $(document).scrollTop() - menu.outerHeight() - 5;
}
}
menu.css({ left: left, top: top });
menu.show(0, function () {
if (!menu[0].shadow) {
menu[0].shadow = $("<div class=\"menu-shadow\"></div>").insertAfter(menu);
}
menu[0].shadow.css({
display: "block",
zIndex: $.fn.menu.defaults.zIndex++,
left: menu.css("left"),
top: menu.css("top"),
width: menu.outerWidth(),
height: menu.outerHeight()
});
menu.css("z-index", $.fn.menu.defaults.zIndex++);
if (menu.hasClass("menu-top")) {
$.data(menu[0], "menu").options.onShow.call(menu[0]);
}
});
};
//隐藏菜单项
function hideMenu(menu) {
if (!menu) {
return;
}
_hideshadow(menu);
menu.find("div.menu-item").each(function () {
if (this.submenu) {
hideMenu(this.submenu);
}
$(this).removeClass("menu-active");
});
function _hideshadow(m) {
m.stop(true, true);
if (m[0].shadow) {
m[0].shadow.hide();
}
m.hide();
};
};
//查找的指定菜单项
function _findItem(target, text) {
var item = null;
var tmp = $("<div></div>");
function find(parentMenu) {
parentMenu.children("div.menu-item").each(function () {
var item = $(target).menu("getItem", this);
var s = tmp.empty().html(item.text).text();
if (text == $.trim(s)) {
item = item;
} else {
if (this.submenu && !item) {
find(this.submenu);
}
}
});
};
find($(target));
tmp.remove();
return item;
};
//启用禁用菜单项
function _enableItem(target, itemEl, disabled) {
var t = $(itemEl);
if (disabled) {
t.addClass("menu-item-disabled");
if (itemEl.onclick) {
itemEl.onclick1 = itemEl.onclick;
itemEl.onclick = null;
}
} else {
t.removeClass("menu-item-disabled");
if (itemEl.onclick1) {
itemEl.onclick = itemEl.onclick1;
itemEl.onclick1 = null;
}
}
};
//追加新的菜单项
function menuppendItem(target, options) {
var parm = $(target);
if (options.parent) {
if (!options.parent.submenu) {
var menu = $("<div class=\"menu\"><div class=\"menu-line\"></div></div>").appendTo("body");
menu[0].autowidth = true;
menu.hide();
options.parent.submenu = menu;
$("<div class=\"menu-rightarrow\"></div>").appendTo(options.parent);
}
parm = options.parent.submenu;
}
var item = $("<div class=\"menu-item\"></div>").appendTo(parm);
$("<div class=\"menu-text\"></div>").html(options.text).appendTo(item);
if (options.iconCls) {
$("<div class=\"menu-icon\"></div>").addClass(options.iconCls).appendTo(item);
}
if (options.id) {
item.attr("id", options.id);
}
if (options.href) {
item.attr("href", options.href);
}
if (options.name) {
item.attr("name", options.name);
}
if (options.onclick) {
if (typeof options.onclick == "string") {
item.attr("onclick", options.onclick);
} else {
item[0].onclick = eval(options.onclick);
}
}
if (options.handler) {
item[0].onclick = eval(options.handler);
}
_f(target, item);
if (options.disabled) {
_enableItem(target, item[0], true);
}
menuEvent(target, parm);
_10(target, parm);
};
//移除指定的菜单项
function _removeItem(target, itemEl) {
function remove(el) {
if (el.submenu) {
el.submenu.children("div.menu-item").each(function () {
remove(this);
});
var shadow = el.submenu[0].shadow;
if (shadow) {
shadow.remove();
}
el.submenu.remove();
}
$(el).remove();
};
remove(itemEl);
};
//销毁菜单
function textestroy(target) {
$(target).children("div.menu-item").each(function () {
_removeItem(target, this);
});
if (target.shadow) {
target.shadow.remove();
}
$(target).remove();
};
//实例化菜单
$.fn.menu = function (target, parm) {
if (typeof target == "string") {
return $.fn.menu.methods[target](this, parm);
}
target = target || {};
return this.each(function () {
var menu = $.data(this, "menu");
if (menu) {
$.extend(menu.options, target);
} else {
menu = $.data(this, "menu", {
options: $.extend({},
$.fn.menu.defaults,
$.fn.menu.parseOptions(this),
target)
});
_init(this);
}
$(this).css({ left: menu.options.left, top: menu.options.top });
});
};
//默认的方法
$.fn.menu.methods = {
//返回属性对象
options: function (jq) {
return $.data(jq[0], "menu").options;
},
//显示菜单到指定的位置pos(left/right)
show: function (jq, pos) {
return jq.each(function () {
_showmenu(this, pos);
});
},
//隐藏菜单
hide: function (jq) {
return jq.each(function () {
_hide(this);
});
},
//销毁菜单
destroy: function (jq) {
return jq.each(function () {
textestroy(this);
});
},
//设置指定菜单项的文本 'param'参数包含2个属性:target:DOM对象,要设置值的菜单项。 text: 字符串,要设置的新文本值。
setText: function (jq, param) {
return jq.each(function () {
$(param.target).children("div.menu-text").html(param.text);
});
},
//设置指定菜单项图标。'param'参数包含2个属性: target:DOM对象,要设置的菜单项。 iconCls:新的图标CSS类ID。
setIcon: function (jq, param) {
return jq.each(function () {
var item = $(this).menu("getItem", param.target);
if (item.iconCls) {
$(item.target).children("div.menu-icon").removeClass(item.iconCls).addClass(param.iconCls);
} else {
$("<div class=\"menu-icon\"></div>").addClass(param.iconCls).appendTo(param.target);
}
});
},
//获取指定的菜单项。得到的是一个菜单项的DOM元素。下面的例子展示了如何根据ID获取指定的项:
getItem: function (jq, itemEl) {
var t = $(itemEl);
var item = {
target: itemEl,
id: t.attr("id"),
text: $.trim(t.children("div.menu-text").html()),
disabled: t.hasClass("menu-item-disabled"),
href: t.attr("href"),
name: t.attr("name"),
onclick: itemEl.onclick
};
var submenu = t.children("div.menu-icon");
if (submenu.length) {
var cc = [];
var aa = submenu.attr("class").split(" ");
for (var i = 0; i < aa.length; i++) {
if (aa[i] != "menu-icon") {
cc.push(aa[i]);
}
}
item.iconCls = cc.join(" ");
}
return item;
},
//查找的指定菜单项,返回的对象和getItem方法是一样的。
findItem: function (jq, text) {
return _findItem(jq[0], text);
},
//追加新的菜单项,'options'参数代表新菜单项属性。默认情况下添加的项在菜单项的顶部。追加一个子菜单项,
//'parent'属性应该设置指定的父项元素,并且该父项元素必须是已经定义在页面上的。
appendItem: function (jq, options) {
return jq.each(function () {
menuppendItem(this, options);
});
},
//移除指定的菜单项。
removeItem: function (jq, itemEl) {
return jq.each(function () {
_removeItem(this, itemEl);
});
},
//启用菜单项
enableItem: function (jq, itemEl) {
return jq.each(function () {
_enableItem(this, itemEl, false);
});
},
//禁用菜单项
disableItem: function (jq, itemEl) {
return jq.each(function () {
_enableItem(this, itemEl, true);
});
}
};
$.fn.menu.parseOptions = function (target) {
return $.extend({}, $.parser.parseOptions(target, ["left", "top", { minWidth: "number" }]));
};
//菜单默认属性+事件
$.fn.menu.defaults = {
zIndex: 110000,//菜单z-index样式,增加它的值
left: 0,//菜单的左边距位置
top: 0,//菜单的上边距位置
minWidth: 120,//菜单的最小宽度
//在菜单显示之后触发
onShow: function () {
},
//在菜单隐藏之后触发
onHide: function () {
},
//在菜单项被点击的时候触发。下面的例子显示了如何处理所有菜单项的点击
onClick: function (item) {
}
};
})(jQuery);

示例代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Basic Menu - jQuery EasyUI Demo</title>
<link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="../../themes/icon.css">
<link rel="stylesheet" type="text/css" href="../demo.css">
<script type="text/javascript" src="../../jquery-1.8.0.min.js"></script>
<script src="../../plugins2/jquery.parser.js"></script>
<script src="../../plugins2/jquery.menu.js"></script>
</head>
<body>
<h2>Basic Menu</h2>
<div class="demo-info">
<div class="demo-tip icon-tip"></div>
<div>Right click on page to display menu.</div>
</div>
<div style="margin:10px 0;"></div> <div id="mm" class="easyui-menu" style="width:120px;">
<div onclick="javascript:alert('new')">New</div>
<div>
<span>Open</span>
<div style="width:150px;">
<div><b>Word</b></div>
<div>Excel</div>
<div>PowerPoint</div>
<div>
<span>M1</span>
<div style="width:120px;">
<div>sub1</div>
<div>sub2</div>
<div>
<span>Sub</span>
<div style="width:80px;">
<div onclick="javascript:alert('sub21')">sub21</div>
<div>sub22</div>
<div>sub23</div>
</div>
</div>
<div>sub3</div>
</div>
</div>
<div>
<span>Window Demos</span>
<div style="width:120px;">
<div data-options="href:'window.html'">Window</div>
<div data-options="href:'dialog.html'">Dialog</div>
<div><a href="http://www.jeasyui.com" target="_blank">EasyUI</a></div>
</div>
</div>
</div>
</div>
<div data-options="iconCls:'icon-save'">Save</div>
<div data-options="iconCls:'icon-print',disabled:true">Print</div>
<div class="menu-sep"></div>
<div>Exit</div>
</div>
<script>
$(function(){
$(document).bind('contextmenu',function(e){
e.preventDefault();
$('#mm').menu('show', {
left: e.pageX,
top: e.pageY
});
});
});
</script>
</body>
</html>

插件效果

easyui源码翻译1.32--Menu(菜单)的更多相关文章

  1. easyui源码翻译1.32--MenuButton(菜单按钮)

    前言 扩展自$.fn.linkbutton.defaults.使用$.fn.menubutton.defaults重写默认值对象..下载该插件翻译源码 菜单按钮是下拉菜单的一部分.它伴随着linkbu ...

  2. easyui源码翻译1.32+API翻译全篇导航 (提供下载源码)

    前言 EasyUI每个组件都会有 属性.方法.事件 属性 所有的属性都定义在jQuery.fn.{plugin}.defaults里面.例如,对话框属性定义在jQuery.fn.dialog.defa ...

  3. easyui源码翻译1.32--datagrid(数据表格)

    前言 此前网上有easyui1.25的源码  应该算是比较老的版本  之后又经历了1.26 . 1.3. 1.31. 1.32 .1.33.1.34  1.33开始支持css3 算是又一个转折  但是 ...

  4. easyui源码翻译1.32--SearchBox(搜索框)

    前言 使用$.fn.searchbox.defaults重写默认值对象.下载该插件翻译源码 搜索框提示用户需要输入搜索的值.它可以结合一个菜单,允许用户选择不同的搜索类别.在用户按下回车键或点击组件右 ...

  5. easyui源码翻译1.32--SplitButton(分割按钮)

    前言 扩展自$.fn.linkbutton.defaults.用于$.fn.splitbutton.defaults重写默认值对象.下载该插件翻译源码 类似菜单按钮,分割按钮也与linkbutton和 ...

  6. easyui源码翻译1.32--Calendar(日历)

    前言 前几天加班比较忙 未能及时更新翻译的 今天多发布几篇..下载该插件翻译源码 日历控件显示一个月的日历,允许用户选择日期和移动到下一个或上一个月.默认情况下,一周的第一天是周日.它可以通过设置'f ...

  7. easyui源码翻译1.32--EasyLoader(简单加载)

    前言 扩展自$.fn.datebox.defaults,使用$.fn.datetimebox.defaults重写默认值对象.下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3. ...

  8. easyui源码翻译1.32--panel(面板)

    前言 昨天发布了表格datagrid的翻译源码 ,easyui的许多插件有依赖关系  比如datagrid 的渲染需要panel.resizable.linkbutton.pagination   今 ...

  9. easyui源码翻译1.32--Tabs(选项卡)

    前言 使用$.fn.tabs.defaults重写默认值对象.下载该插件翻译源码 选项卡显示一批面板.但在同一个时间只会显示一个面板.每个选项卡面板都有头标题和一些小的按钮工具菜单,包括关闭按钮和其他 ...

随机推荐

  1. 支持状态对象复用的RPC框架——SnakeRPC

    SnakeRPC是我2年前(春节期间!)做的一个RPC框架,现与大家分享. 设计SnakeRPC的主要动机是,Hessian返回的状态对象(如:数据库连接对象.文件对象等)无法复用,而且它对Strea ...

  2. [LaTex]Visio文件转EPS文件[转]

    在LaTeX系统中,由于DVI 文件经常被转为PostScript 文件,所以LATEX 支持最好的是EPS 格式(Encapsulated Post-Script ,是PostScript 语言的子 ...

  3. Java_字符类(Character、String、StringBuffer)_char是基本数据类型,Character是其包装类型。

         在java中有三个类负责对字符的操作:Character.String.StringBuffer.其中,Character类是对单个字符进行操作,String是对一个字符序列的操作,Stri ...

  4. Golden32 别名时中文 报ORA-00911: invalid character错误

    查询数据库软件我一般用两个:PL SQL和golden32:使用golden32-之前使用的时候别名为中文是没有任何问题:直到我想将PL SQL汉化(使用中文包chinese.exe),汉化完后再次查 ...

  5. Objective-C 学习笔记(Day 3,下)

    ------------------------------------------- 封装概念及其原理 一个Gun类的例子来详细说明这一环节: #import <Foundation/Foun ...

  6. 12天学好C语言——记录我的C语言学习之路(Day 8)

    12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...

  7. javascript 正则 验证 第25节

    <html> <head> <title>Form对象</title> <script type="text/javascript&qu ...

  8. Java线程练习

    /*线程练习创建两个线程,与主线程交替运行 */ class Text extends Thread{    private String name;    Text(String name)     ...

  9. MSBuild could not create or connect to a task host with runtime "CLR2" and architecture "x86".

    vs2010 and vs2012 are installed on target machine. Build c# project using vs2010, following error oc ...

  10. Poj 1017 / OpenJudge 1017 Packets/装箱问题

    1.链接地址: http://poj.org/problem?id=1017 http://bailian.openjudge.cn/practice/1017 2.题目: 总时间限制: 1000ms ...