📄 menu.js
字号:
function RayeMenu(){
this.element = document.createElement("DIV");
this.element.className = "menu";
this.element.instance = this;
this.type = "menu";
this.parentItem = null;
this.item = new RayeItemCollection();
this.all = new Array();
this.shadows = new Array();
for(var i = 1;i < 5 ;i ++){
var o = document.createElement("DIV");
o.className = "s" + i;
this.shadows[i - 1] = o;
this.element.appendChild(o);
o = null;
}
this.menuDiv = document.createElement("DIV");
this.menuDiv.className = "s0";
this.element.appendChild(this.menuDiv);
this.element.style.visibility = "hidden";
this.element.onmousemove = RayeMenu.eventHandlers.onmousemove;
this.subMenu = new RayeItemCollection();
}
RayeMenu.prototype.addItem = function(key,label,action,className){
var o = new RayeMenuItem(this, key,label,action||"",className||"");
this.item.add(o);
this.all[o.key] = o;
this.menuDiv.appendChild(o.element);
if(null != this.parentItem){
this.parentItem.menu.all[this.parentItem.key + "." + key] = o;
}
}
RayeMenu.prototype.checkItem = function(key, check){
check = check || "check";
if(this.all[key]){
if("check" == check){
this.all[key].element.className += " menu_item_checked";
}
else{
var cn = this.all[key].element.className;
cn = cn.replace(/ menu_item_checked/g,"");
this.all[key].element.className = cn;
}
}
}
RayeMenu.prototype.disableItem = function(key, disable){
disable = disable || "disable";
if(this.all[key]){
if("disable" == disable){
this.all[key].element.className += " menu_item_disabled";
this.all[key].disabled = true;
}
else{
var cn = this.all[key].element.className;
cn = cn.replace(/ menu_item_disabled/g,"");
this.all[key].element.className = cn;
this.all[key].disabled = false;
}
}
}
RayeMenu.prototype.attechSubMenu = function(menu,itemKey){
var o = this.all[itemKey];
menu.parentItem = o;
this.subMenu.add(menu);
o.attechSubMenu(menu);
var e = o.element.getElementsByTagName("DIV").item(0);
e.appendChild(menu.element);
}
RayeMenu.prototype.renew = function(){
this.element.style.visibility = "hidden";
var l = this.item.length;
for(var i = 0;i < l;i ++){
var o = this.item.item(i);
o.element.style.display = "block";
if("normal" == o.menuType){
this.checkItem(o.key,"none");
this.disableItem(o.key,"none");
}
}
if(0 < this.subMenu.length){
var l = this.subMenu.length;
for(var i = 0;i < l ;i ++){
var o = this.subMenu.item(i);
o.renew();
}
}
}
RayeMenu.prototype.hideItem = function(key){
if(this.all[key]){
this.all[key].element.style.display = "none";
}
}
RayeMenu.prototype.show = function(x,y){
if(null == this.parentItem && null != RayeMenu.visibleInstance){
RayeMenu.visibleInstance.hide();
}
RayeMenu.visibleInstance = this;
this.element.style.display = "block";
var menu = this;
if(null != this.parentItem){
menu = this.parentItem.menu;
}
var pe = menu.element.parentNode;
var minL = pe.offsetLeft + 2;
var maxL = minL + pe.offsetWidth - 4;
var minT = pe.offsetTop + 2;
var maxT = minT + pe.offsetHeight - 4;
var top = 0;
var left = 0;
var op = this.element.offsetParent;
if(null == this.element.offsetParent){
op ={
offsetTop:0,offsetLeft:0
};
}
if(null == this.parentItem){
if(this.menuDiv.offsetWidth + x <= maxL){
left = x;
}
else if(x - this.menuDiv.offsetWidth >= minL){
left = x - this.menuDiv.offsetWidth;
}
else{
left = minL;
}
if(this.menuDiv.offsetHeight + y <= maxT){
top = y - op.offsetTop;
}
else if(y - this.menuDiv.offsetHeight >= minT){
top = y - this.menuDiv.offsetHeight - op.offsetTop;
}
else{
top = minT - op.offsetTop;
}
}
else{
var mpe = menu.element;
var e = this.parentItem.element;
if(e.offsetLeft + e.offsetWidth + mpe.offsetLeft + this.menuDiv.offsetWidth <= maxL){
left = e.offsetLeft + e.offsetWidth;
}
else if(mpe.offsetLeft - e.offsetLeft- this.menuDiv.offsetWidth >= minL){
left = - this.menuDiv.offsetWidth + 2;
}
else{
left = e.offsetWidth - this.menuDiv.offsetWidth;
}
if(mpe.offsetTop + e.offsetTop + this.menuDiv.offsetHeight + op.offsetTop<= maxT){
top = e.offsetTop;
}
else if(op.offsetTop + mpe.offsetTop + e.offsetTop + e.offsetHeight - this.menuDiv.offsetHeight >= minT){
top = e.offsetTop + e.offsetHeight - this.menuDiv.offsetHeight;
}
else{
top = 0;
}
}
this.element.style.left = left + "px";
this.element.style.top = top + "px";
this.element.style.visibility = "visible";
this.dropShadow();
this.menuDiv.style.zIndex = 0;
if(null == this.parentItem){
RayeMenu.eventHandlers.menuInstance = this;
var doc = document;
if (doc.addEventListener){
doc.addEventListener("mouseup", RayeMenu.eventHandlers.onmouseup, true);
doc.addEventListener("mousedown", RayeMenu.eventHandlers.onmousedown, true);
}
else if (doc.attachEvent){
doc.attachEvent("onmouseup", RayeMenu.eventHandlers.onmouseup);
doc.attachEvent("onmousedown", RayeMenu.eventHandlers.onmousedown);
doc.attachEvent("onmousemove", RayeMenu.eventHandlers.onmousemove);
doc.attachEvent("onlosecapture", RayeMenu.eventHandlers.onmouseup);
this.element.setCapture();
}
}
}
RayeMenu.prototype.hide = function(){
if(RayeMenu.visibleInstance == this){
RayeMenu.visibleInstance = null;
}
this.element.style.visibility = "hidden";
this.element.style.display = "none";
var l = this.shadows.length;
for(var i = 0;i < l;i ++){
this.shadows[i].style.visibility = "hidden";
}
if(null == this.parentItem){
RayeMenu.eventHandlers.menuInstance = null;
var doc = document;
if (doc.addEventListener){
doc.removeEventListener("mouseup", RayeMenu.eventHandlers.onmouseup, true);
doc.removeEventListener("mousedown", RayeMenu.eventHandlers.onmousedown, true);
}
else if (doc.attachEvent){
doc.detachEvent("onmousedown", RayeMenu.eventHandlers.onmousedown);
doc.detachEvent("onmouseup", RayeMenu.eventHandlers.onmouseup);
doc.detachEvent("onmousemove", RayeMenu.eventHandlers.onmousemove);
doc.detachEvent("onlosecapture", RayeMenu.eventHandlers.onmouseup);
doc.releaseCapture();
}
}
this.item.select(-1);
if(this.subMenu.length > 0 ){
var l = this.subMenu.length;
for(var i = 0;i < l;i ++){
this.subMenu.item(i).hide();
}
}
}
RayeMenu.prototype.dropShadow = function(){
var l = this.shadows.length;
var h = this.menuDiv.offsetHeight;
for(var i = 0;i < l;i ++){
var o = this.shadows[i];
if(h - i * 2 > 0){
o.style.height = (h - i * 2) + "px";
o.style.visibility = "visible";
}
}
}
function RayeMenuItem(menu,key,label){
this.key = key;
this.menu = menu;
this.disabled = false;
this.type = "menu_item";
if("-" == label){
this.menuType = "hr";
this.element = document.createElement("DIV");
this.element.className = "hr";
this.disabled = true;
}
else{
this.element = new RayeMenuItem.createElement(label);
this.menuType = "normal";
}
this.element.instance = this;
this.label = label || "";
this.index = -1;
}
RayeMenuItem.prototype.attechSubMenu = function(menu){
this.subMenu = menu;
var icon = this.element.getElementsByTagName("IMG").item(1);
icon.style.visibility = "inherit";
}
RayeMenuItem.prototype.onselect = function(){
if(false == this.disabled){
this.element.className += " menu_item_selected";
if(null != this.subMenu){
this.subMenu.show();
}
}
}
RayeMenuItem.prototype.onblur = function(){
if("hr" != this.menuType){
var cn = this.element.className;
cn = cn.replace(/ menu_item_selected/g,"");
this.element.className = cn;
if(null != this.subMenu){
this.subMenu.item.select(-1);
this.subMenu.hide();
}
}
}
RayeMenuItem.prototype.onindexchange = function(n){
this.index = n;
}
RayeMenuItem.createElement = function(label){
var s1 = document.createElement("img");
s1.className = "menu_icon";
s1.src = imagePath + "menu/radio.point.png";
var s2 = document.createElement("SPAN");
s2.className = "menu_label";
var t = document.createTextNode(label);
s2.appendChild(t);
var s3 = document.createElement("IMG");
s3.className = "menu_arrow";
s3.src = imagePath + "menu/arrow.right.png";
var retval = document.createElement("DIV");
retval.className = "menu_item";
var d1 = document.createElement("DIV");
d1.className = "sub_menu";
retval.appendChild(s1);
retval.appendChild(s2);
retval.appendChild(s3);
retval.appendChild(d1);
d1 = s1 = s2 = s3 = t = null;
return retval;
}
RayeMenuItem.getReal = function(o){
var e = o;
while(null != e){
if("object" == typeof e.instance){
break;
}
e = e.parentNode;
}
if(null != e && (e.instance.type == "menu_item" || e.instance.type == "menu")){
return e;
}
else{
return null;
}
}
RayeMenu.execute = null;
RayeMenu.visibleInstance = null;
RayeMenu.eventHandlers ={
getEvent: function (e, el){
if (!e){
if (el)
e = el.document.parentWindow.event;
else
e = window.event;
}
if (!e.srcElement){
var el = e.target;
while (el != null && el.nodeType != 1)
el = el.parentNode;
e.srcElement = el;
}
if (typeof e.offsetX == "undefined"){
e.offsetX = e.layerX;
e.offsetY = e.layerY;
}
return e;
}
,
getDocument: function (e){
if (e.target)
return e.target.ownerDocument;
return e.srcElement.document;
}
,
onmousemove: function(e){
e = RayeMenu.eventHandlers.getEvent(e,this);
var eitem = RayeMenuItem.getReal(e.srcElement);
if(null == eitem) return;
var inst = eitem.instance;
var menuInst = inst.menu;
e.cancelBubble = true;
if("menu_item" == inst.type){
if(null == menuInst ) return;
if(inst.index != menuInst.item.selectedIndex[0]){
menuInst.item.select(inst.index);
}
}
}
,
menuInstance: null,
onmousedown:function(e){
e = RayeMenu.eventHandlers.getEvent(e,this);
if(null == RayeMenuItem.getReal(e.srcElement)){
RayeMenu.eventHandlers.menuInstance.hide();
var o = e.srcElement;
while(null != o){
if("function" == typeof o.onmousedown){
o.onmousedown(e);
}
o = o.parentNode;
}
}
return false;
}
,
onmouseup:function(e){
e = RayeMenu.eventHandlers.getEvent(e,this);
var item = RayeMenuItem.getReal(e.srcElement);
var hide = true;
if(null != item && "menu_item" == item.instance.type){
var inst = item.instance;
if(true != inst.disabled && null == inst.subMenu){
if("function" == typeof RayeMenu.execute){
setTimeout(function(){
RayeMenu.execute(inst.key);
},0);
}
} else{
hide = false;
}
}
if(hide){
RayeMenu.eventHandlers.menuInstance.hide();
}
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -