📄 jscookmenu.js
字号:
items[items.length] = _cmSplit;
continue;
}
var item = new Array ();
var currentItem = currentDomItem.firstChild;
var hasAction = false;
for (; currentItem; currentItem = currentItem.nextSibling)
{
// scan for span or div tag
if (!currentItem.tagName)
continue;
if (currentItem.className == 'cmNoClick')
{
item[0] = _cmNoClick;
item[1] = getActionHTML (currentItem);
hasAction = true;
break;
}
if (currentItem.className == 'cmNoAction')
{
item[0] = _cmNoAction;
item[1] = getActionHTML (currentItem);
hasAction = true;
break;
}
var tag = currentItem.tagName.toLowerCase ();
if (tag != 'span')
continue;
if (!currentItem.firstChild)
item[0] = null;
else
item[0] = currentItem.innerHTML;
currentItem = currentItem.nextSibling;
break;
}
if (hasAction)
{
items[items.length] = item;
continue;
}
if (!currentItem)
continue;
for (; currentItem; currentItem = currentItem.nextSibling)
{
if (!currentItem.tagName)
continue;
var tag = currentItem.tagName.toLowerCase ();
if (tag == 'a')
{
item[1] = currentItem.innerHTML;
item[2] = currentItem.href;
item[3] = currentItem.target;
item[4] = currentItem.title;
if (item[4] == '')
item[4] = null;
}
else if (tag == 'span' || tag == 'div')
{
item[1] = currentItem.innerHTML;
item[2] = null;
item[3] = null;
item[4] = null;
}
break;
}
for (; currentItem; currentItem = currentItem.nextSibling)
{
// scan for span tag
if (!currentItem.tagName)
continue;
var tag = currentItem.tagName.toLowerCase ();
if (tag != 'ul' && tag != 'ol')
continue;
var subMenuItems = cmDrawFromTextSubMenu (currentItem);
for (i = 0; i < subMenuItems.length; ++i)
item[i + 5] = subMenuItems[i];
break;
}
items[items.length] = item;
}
return items;
}
//
// obtain the actual action item's action, which is inside a
// table. The first row should be it
//
function getActionHTML (htmlNode)
{
var returnVal = '<td></td><td></td><td></td>';
var currentDomItem;
// find the table first
for (currentDomItem = htmlNode.firstChild; currentDomItem; currentDomItem = currentDomItem.nextSibling)
{
if (currentDomItem.tagName && currentDomItem.tagName.toLowerCase () == 'table')
break;
}
if (!currentDomItem)
return returnVal;
// skip over tbody
for (currentDomItem = currentDomItem.firstChild; currentDomItem; currentDomItem = currentDomItem.nextSibling)
{
if (currentDomItem.tagName && currentDomItem.tagName.toLowerCase () == 'tbody')
break;
}
if (!currentDomItem)
return returnVal;
// get the first tr
for (currentDomItem = currentDomItem.firstChild; currentDomItem; currentDomItem = currentDomItem.nextSibling)
{
if (currentDomItem.tagName && currentDomItem.tagName.toLowerCase () == 'tr')
break;
}
if (!currentDomItem)
return returnVal;
return currentDomItem.innerHTML;
}
//
// get the DOM object associated with the item
//
function cmGetMenuItem (item)
{
if (!item.subMenuID)
return null;
var subMenu = cmGetObject (item.subMenuID);
// we are dealing with a main menu item
if (item.menu)
{
var menu = item.menu;
// skip over table, tbody, tr, reach td
subMenu = subMenu.firstChild.firstChild.firstChild.firstChild;
var i;
for (i = 0; i < menu.length; ++i)
{
if (menu[i] == item)
return subMenu;
subMenu = subMenu.nextSibling;
}
}
else if (item.parentItem) // sub menu item
{
var menu = item.parentItem;
var table = cmGetObject (item.subMenuID + 'Table');
if (!table)
return null;
// skip over table, tbody, reach tr
subMenu = table.firstChild.firstChild;
var i;
for (i = 5; i < menu.length; ++i)
{
if (menu[i] == item)
return subMenu;
subMenu = subMenu.nextSibling;
}
}
return null;
}
//
// disable a menu item
//
function cmDisableItem (item, prefix)
{
if (!item)
return;
var menuItem = cmGetMenuItem (item);
if (!menuItem)
return;
if (item.menu)
menuItem.className = prefix + 'MainItemDisabled';
else
menuItem.className = prefix + 'MenuItemDisabled';
item.isDisabled = true;
}
//
// enable a menu item
//
function cmEnableItem (item, prefix)
{
if (!item)
return;
var menuItem = cmGetMenuItem (item);
if (!menuItem)
return;
if (item.menu)
menu.className = prefix + 'MainItem';
else
menu.className = prefix + 'MenuItem';
item.isDisabled = true;
}
//////////////////////////////////////////////////////////////////////
//
// Mouse Event Handling Functions
//
//////////////////////////////////////////////////////////////////////
//
// action should be taken for mouse moving in to the menu item
//
// Here we just do things concerning this menu item, w/o opening sub menus.
//
function cmItemMouseOver (obj, isMain, idSub, menuID, index, calledByOpenSub)
{
if (!calledByOpenSub && _cmClicked)
{
cmItemMouseOverOpenSub (obj, isMain, idSub, menuID, index);
return;
}
clearTimeout (_cmTimeOut);
if (_cmItemList[index].isDisabled)
return;
var prefix = _cmMenuList[menuID].prefix;
if (!obj.cmMenuID)
{
obj.cmMenuID = menuID;
obj.cmIsMain = isMain;
}
var thisMenu = cmGetThisMenu (obj, prefix);
// insert obj into cmItems if cmItems doesn't have obj
if (!thisMenu.cmItems)
thisMenu.cmItems = new Array ();
var i;
for (i = 0; i < thisMenu.cmItems.length; ++i)
{
if (thisMenu.cmItems[i] == obj)
break;
}
if (i == thisMenu.cmItems.length)
{
//thisMenu.cmItems.push (obj);
thisMenu.cmItems[i] = obj;
}
// hide the previous submenu that is not this branch
if (_cmCurrentItem)
{
// occationally, we get this case when user
// move the mouse slowly to the border
if (_cmCurrentItem == obj || _cmCurrentItem == thisMenu)
{
var item = _cmItemList[index];
cmSetStatus (item);
return;
}
var thatMenuInfo = _cmMenuList[_cmCurrentItem.cmMenuID];
var thatPrefix = thatMenuInfo.prefix;
var thatMenu = cmGetThisMenu (_cmCurrentItem, thatPrefix);
if (thatMenu != thisMenu.cmParentMenu)
{
if (_cmCurrentItem.cmIsMain)
_cmCurrentItem.className = thatPrefix + 'MainItem';
else
_cmCurrentItem.className = thatPrefix + 'MenuItem';
if (thatMenu.id != idSub)
cmHideMenu (thatMenu, thisMenu, thatMenuInfo);
}
}
// okay, set the current menu to this obj
_cmCurrentItem = obj;
// just in case, reset all items in this menu to MenuItem
cmResetMenu (thisMenu, prefix);
var item = _cmItemList[index];
var isDefaultItem = cmIsDefaultItem (item);
if (isDefaultItem)
{
if (isMain)
obj.className = prefix + 'MainItemHover';
else
obj.className = prefix + 'MenuItemHover';
}
cmSetStatus (item);
}
//
// action should be taken for mouse moving in to the menu item
//
// This function also opens sub menu
//
function cmItemMouseOverOpenSub (obj, isMain, idSub, menuID, index)
{
clearTimeout (_cmTimeOut);
if (_cmItemList[index].isDisabled)
return;
cmItemMouseOver (obj, isMain, idSub, menuID, index, true);
if (idSub)
{
var subMenu = cmGetObject (idSub);
var menuInfo = _cmMenuList[menuID];
var orient = menuInfo.orient;
var prefix = menuInfo.prefix;
cmShowSubMenu (obj, isMain, subMenu, menuInfo);
}
}
//
// action should be taken for mouse moving out of the menu item
//
function cmItemMouseOut (obj, isMain, idSub, menuID, index)
{
var delayTime = _cmMenuList[menuID].nodeProperties.delay;
_cmTimeOut = window.setTimeout ('cmHideMenuTime ()', delayTime);
window.defaultStatus = '';
}
//
// action should be taken for mouse button down at a menu item
//
function cmItemMouseDown (obj, isMain, idSub, menuID, index)
{
if (_cmItemList[index].isDisabled)
return;
if (cmIsDefaultItem (_cmItemList[index]))
{
var prefix = _cmMenuList[menuID].prefix;
if (obj.cmIsMain)
obj.className = prefix + 'MainItemActive';
else
obj.className = prefix + 'MenuItemActive';
}
}
//
// action should be taken for mouse button down at a menu item
// this is one also opens submenu if needed
//
function cmItemMouseDownOpenSub (obj, isMain, idSub, menuID, index)
{
if (_cmItemList[index].isDisabled)
return;
_cmClicked = true;
cmItemMouseDown (obj, isMain, idSub, menuID, index);
if (idSub)
{
var subMenu = cmGetObject (idSub);
var menuInfo = _cmMenuList[menuID];
cmShowSubMenu (obj, isMain, subMenu, menuInfo);
}
}
//
// action should be taken for mouse button up at a menu item
//
function cmItemMouseUp (obj, isMain, idSub, menuID, index)
{
if (_cmItemList[index].isDisabled)
return;
var item = _cmItemList[index];
var link = null, target = '_self';
if (item.length > 2)
link = item[2];
document.getElementById("pathname").value=item[1];
if (item.length > 3 && item[3])
{
target = item[3];
}
if (link != null)
{
if (target == "_blank"){
window.open (link, target);
}
else if(target == "Modal"){
showModalDialog(''+link+'','','dialogWidth:400px; dialogHeight:300px; help: no; scroll: yes; status: no');
}
else{
_cmClicked = false;
parent.howave_main.location = link;
}
}
var menuInfo = _cmMenuList[menuID];
var prefix = menuInfo.prefix;
var thisMenu = cmGetThisMenu (obj, prefix);
var hasChild = (item.length > 5);
if (!hasChild)
{
if (cmIsDefaultItem (item))
{
if (obj.cmIsMain)
obj.className = prefix + 'MainItem';
else
obj.className = prefix + 'MenuItem';
}
cmHideMenu (thisMenu, null, menuInfo);
}
else
{
if (cmIsDefaultItem (item))
{
if (obj.cmIsMain)
obj.className = prefix + 'MainItemHover';
else
obj.className = prefix + 'MenuItemHover';
}
}
}
//////////////////////////////////////////////////////////////////////
//
// Mouse Event Support Utility Functions
//
//////////////////////////////////////////////////////////////////////
//
// move submenu to the appropriate location
//
function cmMoveSubMenu (obj, isMain, subMenu, menuInfo)
{
var orient = menuInfo.orient;
var offsetAdjust;
if (isMain)
{
if (orient.charAt (0) == 'h')
offsetAdjust = menuInfo.nodeProperties.offsetHMainAdjust;
else
offsetAdjust = menuInfo.nodeProperties.offsetVMainAdjust;
}
else
offsetAdjust = menuInfo.nodeProperties.offsetSubAdjust;
if (!isMain && orient.charAt (0) == 'h')
orient = 'v' + orient.charAt (1) + orient.charAt (2);
var mode = String (orient);
var p = subMenu.offsetParent;
var subMenuWidth = cmGetWidth (subMenu);
var horiz = cmGetHorizontalAlign (obj, mode, p, subMenuWidth);
if (mode.charAt (0) == 'h')
{
if (mode.charAt (1) == 'b')
subMenu.style.top = (cmGetYAt (obj, p) + cmGetHeight (obj) + offsetAdjust[1]) + 'px';
else
subMenu.style.top = (cmGetYAt (obj, p) - cmGetHeight (subMenu) - offsetAdjust[1]) + 'px';
if (horiz == 'r')
subMenu.style.left = (cmGetXAt (obj, p) + offsetAdjust[0]) + 'px';
else
subMenu.style.left = (cmGetXAt (obj, p) + cmGetWidth (obj) - subMenuWidth - offsetAdjust[0]) + 'px';
}
else
{
if (horiz == 'r')
subMenu.style.left = (cmGetXAt (obj, p) + cmGetWidth (obj) + offsetAdjust[0]) + 'px';
else
subMenu.style.left = (cmGetXAt (obj, p) - subMenuWidth - offsetAdjust[0]) + 'px';
if (mode.charAt (1) == 'b')
subMenu.style.top = (cmGetYAt (obj, p) + offsetAdjust[1]) + 'px';
else
subMenu.style.top = (cmGetYAt (obj, p) + cmGetHeight (obj) - cmGetHeight (subMenu) + offsetAdjust[1]) + 'px';
}
// IE specific iframe masking method
/*@cc_on
@if (@_jscript_version >= 5.5)
if (menuInfo.cmFrameMasking)
{
if (!subMenu.cmFrameObj)
{
var frameObj = cmAllocFrame ();
subMenu.cmFrameObj = frameObj;
}
var frameObj = subMenu.cmFrameObj;
frameObj.style.zIndex = subMenu.style.zIndex - 1;
frameObj.style.left = (cmGetX (subMenu) - cmGetX (frameObj.offsetParent)) + 'px';
frameObj.style.top = (cmGetY (subMenu) - cmGetY (frameObj.offsetParent)) + 'px';
frameObj.style.width = cmGetWidth (subMenu) + 'px';
frameObj.style.height = cmGetHeight (subMenu) + 'px';
frameObj.style.display = 'block';
}
@end
@*/
if (horiz != orient.charAt (2))
orient = orient.charAt (0) + orient.charAt (1) + horiz;
return orient;
}
//
// automatically re-adjust the menu position based on available screen size.
//
function cmGetHorizontalAlign (obj, mode, p, subMenuWidth)
{
var horiz = mode.charAt (2);
if (!(document.body))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -