📄 xmenu.js
字号:
// check browsers
var ua = navigator.userAgent;
var opera = /opera [56789]|opera\/[56789]/i.test(ua);
var ie = !opera && /MSIE/.test(ua);
var ie50 = ie && /MSIE 5\.[01234]/.test(ua);
var ie6 = ie && /MSIE [6789]/.test(ua);
var ieBox = ie && (document.compatMode == null || document.compatMode != "CSS1Compat");
var moz = !opera && /gecko/i.test(ua);
var nn6 = !opera && /netscape.*6\./i.test(ua);
// define the default values
webfxMenuDefaultWidth = 100;
webfxMenuDefaultBorderLeft = 1;
webfxMenuDefaultBorderRight = 1;
webfxMenuDefaultBorderTop = 1;
webfxMenuDefaultBorderBottom = 1;
webfxMenuDefaultPaddingLeft = 1;
webfxMenuDefaultPaddingRight = 1;
webfxMenuDefaultPaddingTop = 1;
webfxMenuDefaultPaddingBottom = 1;
webfxMenuDefaultShadowLeft = 0;
webfxMenuDefaultShadowRight = ie && !ie50 && /win32/i.test(navigator.platform) ? 4 :0;
webfxMenuDefaultShadowTop = 0;
webfxMenuDefaultShadowBottom = ie && !ie50 && /win32/i.test(navigator.platform) ? 4 : 0;
webfxMenuItemDefaultHeight = 18;
webfxMenuItemDefaultText = "Untitled";
webfxMenuItemDefaultHref = "javascript:void(0)";
webfxMenuSeparatorDefaultHeight = 6;
webfxMenuDefaultEmptyText = "Empty";
webfxMenuDefaultUseAutoPosition = nn6 ? false : true;
// other global constants
webfxMenuImagePath = root.path;
webfxMenuUseHover = opera ? true : false;
webfxMenuHideTime = 500;
webfxMenuShowTime = 200;
var webFXMenuHandler = {
idCounter : 0,
idPrefix : "webfx-menu-object-",
getId : function () { return this.idPrefix + this.idCounter++; },
overMenuItem : function (oItem) {
var jsItem = this.all[oItem.id];
if (jsItem.subMenu) {
jsItem.parentMenu.hideAllSubs();
jsItem.subMenu.show();
}
else
jsItem.parentMenu.hideAllSubs();
},
blurMenu : function (oMenuItem) {
window.setTimeout("webFXMenuHandler.all[\"" + oMenuItem.id + "\"].subMenu.hide();", 200);
},
all : {}
};
function WebFXMenu() {
this._menuItems = [];
this._subMenus = [];
this.id = webFXMenuHandler.getId();
this.top = 0;
this.left = 0;
this.shown = false;
this.parentMenu = null;
webFXMenuHandler.all[this.id] = this;
}
function hideAll(){
var menuLayers = document.all.tags("DIV");
for (i=0; i<menuLayers.length; i++) {
if (menuLayers[i].id.indexOf("webfx-menu") != -1) {
hideObject(menuLayers[i].id);
}
}
}
function hideAllEX(){
if(window.event.srcElement.className!="webfxmenuroot"){
var menuLayers = document.all.tags("DIV");
for (i=0; i<menuLayers.length; i++) {
if (menuLayers[i].id.indexOf("webfx-menu") != -1) {
hideObject(menuLayers[i].id);
}
}
}
}
function hideObject(obj) {
document.all[obj].style.visibility = "hidden";
}
WebFXMenu.prototype.width = webfxMenuDefaultWidth;
WebFXMenu.prototype.emptyText = webfxMenuDefaultEmptyText;
WebFXMenu.prototype.useAutoPosition = webfxMenuDefaultUseAutoPosition;
WebFXMenu.prototype.borderLeft = webfxMenuDefaultBorderLeft;
WebFXMenu.prototype.borderRight = webfxMenuDefaultBorderRight;
WebFXMenu.prototype.borderTop = webfxMenuDefaultBorderTop;
WebFXMenu.prototype.borderBottom = webfxMenuDefaultBorderBottom;
WebFXMenu.prototype.paddingLeft = webfxMenuDefaultPaddingLeft;
WebFXMenu.prototype.paddingRight = webfxMenuDefaultPaddingRight;
WebFXMenu.prototype.paddingTop = webfxMenuDefaultPaddingTop;
WebFXMenu.prototype.paddingBottom = webfxMenuDefaultPaddingBottom;
WebFXMenu.prototype.shadowLeft = webfxMenuDefaultShadowLeft;
WebFXMenu.prototype.shadowRight = webfxMenuDefaultShadowRight;
WebFXMenu.prototype.shadowTop = webfxMenuDefaultShadowTop;
WebFXMenu.prototype.shadowBottom = webfxMenuDefaultShadowBottom;
WebFXMenu.prototype.add = function (menuItem) {
this._menuItems[this._menuItems.length] = menuItem;
if (menuItem.subMenu) {
this._subMenus[this._subMenus.length] = menuItem.subMenu;
menuItem.subMenu.parentMenu = this;
}
menuItem.parentMenu = this;
};
WebFXMenu.prototype.show = function (relObj, sDir) {
if (this.useAutoPosition)
this.position(relObj, sDir);
var divElement = document.getElementById(this.id);
divElement.style.left = opera ? this.left : this.left + "px";
divElement.style.top = opera ? this.top : this.top + "px";
divElement.style.visibility = "visible";
this.shown = true;
if (this.parentMenu)
{
this.parentMenu.show();
}
};
WebFXMenu.prototype.hide = function () {
this.hideAllSubs();
var divElement = document.getElementById(this.id);
divElement.style.visibility = "hidden";
this.shown = false;
};
WebFXMenu.prototype.hideAllSubs = function () {
for (var i = 0; i < this._subMenus.length; i++) {
if (this._subMenus[i].shown)
this._subMenus[i].hide();
}
};
WebFXMenu.prototype.toString = function () {
var top = this.top + this.borderTop + this.paddingTop;
var str = "<div id='" + this.id + "' class='webfx-menu' style='" +
"width:" + (!ieBox ?
this.width - this.borderLeft - this.paddingLeft - this.borderRight - this.paddingRight :
this.width) + "px;" +
(this.useAutoPosition ?
"left:" + this.left + "px;" + "top:" + this.top + "px;" :
"") +
(ie50 ? "filter: none;" : "") +
"'>";
if (this._menuItems.length == 0) {
str += "<span class='webfx-menu-empty'>" + this.emptyText + "</span>";
}
else {
// loop through all menuItems
for (var i = 0; i < this._menuItems.length; i++) {
var mi = this._menuItems[i];
str += mi;
if (!this.useAutoPosition) {
if (mi.subMenu && !mi.subMenu.useAutoPosition)
mi.subMenu.top = top - mi.subMenu.borderTop - mi.subMenu.paddingTop;
top += mi.height;
}
}
}
str += "</div>";
for (var i = 0; i < this._subMenus.length; i++) {
this._subMenus[i].left = this.left + this.width - this._subMenus[i].borderLeft;
str += this._subMenus[i];
}
return str;
};
// WebFXMenu.prototype.position defined later
function WebFXMenuItem(sText, sHref, sToolTip, oSubMenu) {
this.text = sText || webfxMenuItemDefaultText;
this.href = (sHref == null || sHref == "") ? webfxMenuItemDefaultHref : sHref;
this.subMenu = oSubMenu;
if (oSubMenu)
oSubMenu.parentMenuItem = this;
this.toolTip = sToolTip;
this.id = webFXMenuHandler.getId();
webFXMenuHandler.all[this.id] = this;
};
WebFXMenuItem.prototype.height = webfxMenuItemDefaultHeight;
WebFXMenuItem.prototype.toString = function () {
return "<a" +
" id='" + this.id + "'" +
" href='" + this.href + "'" +
(this.toolTip ? " title='" + this.toolTip + "'" : "") +
" onmouseover='webFXMenuHandler.overMenuItem(this)'" +
">" +
(this.subMenu ? "<img class='arrow' src='" + webfxMenuImagePath + "images/arrow.right.gif'>" : "") +
this.text +
"</a>";
};
function WebFXMenuSeparator() {
this.id = webFXMenuHandler.getId();
webFXMenuHandler.all[this.id] = this;
};
WebFXMenuSeparator.prototype.height = webfxMenuSeparatorDefaultHeight;
WebFXMenuSeparator.prototype.toString = function () {
return "<div></div>"
};
function WebFXMenuBar() {
this._parentConstructor = WebFXMenu;
this._parentConstructor();
}
WebFXMenuBar.prototype = new WebFXMenu;
WebFXMenuBar.prototype.toString = function () {
var str = "<div id='" + this.id + "' class='webfx-menu-bar'>";
// loop through all menuButtons
for (var i = 0; i < this._menuItems.length; i++)
str += this._menuItems[i];
str += "</div>";
for (var i = 0; i < this._subMenus.length; i++)
str += this._subMenus[i];
return str;
};
function WebFXMenuButton(sText, sHref, sToolTip, oSubMenu) {
this._parentConstructor = WebFXMenuItem;
this._parentConstructor(sText, sHref, sToolTip, oSubMenu);
}
WebFXMenuButton.prototype = new WebFXMenuItem;
WebFXMenuButton.prototype.toString = function () {
return "<a" +
" id='" + this.id + "'" +
" href='" + this.href + "'" +
(this.toolTip ? " title='" + this.toolTip + "'" : "") +
(opera ? (
" onoperafocus='webFXMenuHandler.overMenuItem(this)'" +
(this.subMenu ? " onoperablur='webFXMenuHandler.blurMenu(this)'" : "")
) : (
" onfocus='webFXMenuHandler.overMenuItem(this)'" +
(this.subMenu ? " onblur='webFXMenuHandler.blurMenu(this)'" : "")
)) +
">" +
this.text +
(this.subMenu ? " <img class='arrow' src='" + webfxMenuDefaultImagePath + "arrow.down.gif' align='absmiddle'>" : "") +
"</a>";
};
/* Position functions */
function getInnerLeft(el) {
if (el == null) return 0;
if (ieBox && el == document.body || !ieBox && el == document.documentElement) return 0;
return getLeft(el) + getBorderLeft(el);
}
function getLeft(el) {
if (el == null) return 0;
return el.offsetLeft + getInnerLeft(el.offsetParent);
}
function getInnerTop(el) {
if (el == null) return 0;
if (ieBox && el == document.body || !ieBox && el == document.documentElement) return 0;
return getTop(el) + getBorderTop(el);
}
function getTop(el) {
if (el == null) return 0;
return el.offsetTop + getInnerTop(el.offsetParent);
}
function getBorderLeft(el) {
return ie ?
el.clientLeft :
parseInt(window.getComputedStyle(el, null).getPropertyValue("border-left-width"));
}
function getBorderTop(el) {
return ie ?
el.clientTop :
parseInt(window.getComputedStyle(el, null).getPropertyValue("border-top-width"));
}
function opera_getLeft(el) {
if (el == null) return 0;
return el.offsetLeft + opera_getLeft(el.offsetParent);
}
function opera_getTop(el) {
if (el == null) return 0;
return el.offsetTop + opera_getTop(el.offsetParent);
}
function getOuterRect(el) {
return {
left: (opera ? opera_getLeft(el) : getLeft(el)),
top: (opera ? opera_getTop(el) : getTop(el)),
width: el.offsetWidth,
height: el.offsetHeight
};
}
// mozilla bug! scrollbars not included in innerWidth/height
function getDocumentRect(el) {
return {
left: 0,
top: 0,
width: (ie ?
(ieBox ? document.body.clientWidth : document.documentElement.clientWidth) :
window.innerWidth
),
height: (ie ?
(ieBox ? document.body.clientHeight : document.documentElement.clientHeight) :
window.innerHeight
)
};
}
function getScrollPos(el) {
return {
left: (ie ?
(ieBox ? document.body.scrollLeft : document.documentElement.scrollLeft) :
window.pageXOffset
),
top: (ie ?
(ieBox ? document.body.scrollTop : document.documentElement.scrollTop) :
window.pageYOffset
)
};
}
/* end position functions */
WebFXMenu.prototype.position = function (relEl, sDir) {
var dir = sDir;
// find parent item rectangle, piRect
var piRect;
if (!relEl) {
var pi = this.parentMenuItem;
if (!this.parentMenuItem)
return;
relEl = document.getElementById(pi.id);
if (dir == null)
dir = pi instanceof WebFXMenuButton ? "vertical" : "horizontal";
piRect = getOuterRect(relEl);
}
else if (relEl.left != null && relEl.top != null && relEl.width != null && relEl.height != null) { // got a rect
piRect = relEl;
}
else
piRect = getOuterRect(relEl);
var menuEl = document.getElementById(this.id);
var menuRect = getOuterRect(menuEl);
var docRect = getDocumentRect();
var scrollPos = getScrollPos();
var pMenu = this.parentMenu;
if (dir == "vertical") {
if (piRect.left + menuRect.width - scrollPos.left <= docRect.width)
this.left = piRect.left;
else if (docRect.width >= menuRect.width)
this.left = docRect.width + scrollPos.left - menuRect.width;
else
this.left = scrollPos.left;
if (piRect.top + piRect.height + menuRect.height <= docRect.height + scrollPos.top)
this.top = piRect.top + piRect.height;
else if (piRect.top - menuRect.height >= scrollPos.top)
this.top = piRect.top - menuRect.height;
else if (docRect.height >= menuRect.height)
this.top = docRect.height + scrollPos.top - menuRect.height;
else
this.top = scrollPos.top;
}
else {
if (piRect.top + menuRect.height - this.borderTop - this.paddingTop <= docRect.height + scrollPos.top)
this.top = piRect.top - this.borderTop - this.paddingTop;
else if (piRect.top + piRect.height - menuRect.height + this.borderTop + this.paddingTop >= 0)
this.top = piRect.top + piRect.height - menuRect.height + this.borderBottom + this.paddingBottom + this.shadowBottom;
else if (docRect.height >= menuRect.height)
this.top = docRect.height + scrollPos.top - menuRect.height;
else
this.top = scrollPos.top;
var pMenuPaddingLeft = pMenu ? pMenu.paddingLeft : 0;
var pMenuBorderLeft = pMenu ? pMenu.borderLeft : 0;
var pMenuPaddingRight = pMenu ? pMenu.paddingRight : 0;
var pMenuBorderRight = pMenu ? pMenu.borderRight : 0;
if (piRect.left + piRect.width + menuRect.width + pMenuPaddingRight +
pMenuBorderRight - this.borderLeft + this.shadowRight <= docRect.width + scrollPos.left)
this.left = piRect.left + piRect.width + pMenuPaddingRight + pMenuBorderRight - this.borderLeft;
else if (piRect.left - menuRect.width - pMenuPaddingLeft - pMenuBorderLeft + this.borderRight + this.shadowRight >= 0)
this.left = piRect.left - menuRect.width - pMenuPaddingLeft - pMenuBorderLeft + this.borderRight + this.shadowRight;
else if (docRect.width >= menuRect.width)
this.left = docRect.width + scrollPos.left - menuRect.width;
else
this.left = scrollPos.left;
}
};
/* add onfocus/blur for anchors in opera
* Opera 5.10 seems to support focus and blur but in reality it is even worse
*/
if (opera) {
document.onmousedown = function(e) {
var a = e.target;
while (a != null && a.tagName != "A") a = a.parentNode;
if (document._oldFocus && document._oldFocus != a) {
if (typeof document._oldFocus.onoperablur == "string") {
var f = new Function ("event", document._oldFocus.onoperablur);
document._oldFocus.onFakeBlur = f;
}
if (typeof document._oldFocus.onFakeBlur == "function")
document._oldFocus.onFakeBlur(e);
}
if (a && a != document._oldFocus) {
document._oldFocus = a;
if (typeof a.onoperafocus == "string") {
var f = new Function ("event", a.onoperafocus);
a.onFakeFocus = f;
}
if (typeof a.onFakeFocus == "function")
a.onFakeFocus(e);
}
else
document._oldFocus = null;
};
}
document.onclick=hideAllEX;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -