📄 menu4.js
字号:
function getMenuItemElement( el ) { while ( el != null && el._menuItem == null) el = el.parentNode; return el;}function getTrElement( el ) { while ( el != null && el.tagName != "TR" ) el = el.parentNode; return el;}MenuBar.prototype.write = function (oDocument) { this._document = oDocument || document; this._document.write( this.toHtml() ); var el = this._document.getElementById( this.id ); this.hookupMenu( el );};MenuBar.prototype.create = function (oDocument) { this._document = oDocument || document; var dummyDiv = this._document.createElement( "DIV" ); dummyDiv.innerHTML = this.toHtml(); var el = dummyDiv.removeChild( dummyDiv.firstChild ); this.hookupMenu( el ); return el;};MenuBar.prototype.handleKeyEvent = function ( e ) { if ( this.getActiveState() == "open" ) return; var nKeyCode = e.keyCode; if ( this.active && e[ Menu.keyboardAccelProperty ] ) { e.returnValue = false; e.keyCode = 0; } if ( nKeyCode == Menu.keyboardAccelKey || nKeyCode == Menu.keyboardAccelKey2 ) { if ( !e.repeat ) { this.toggleActive(); } e.returnValue = false; e.keyCode = 0; return; } if ( !this.active ) { // do not set return value to true return; } switch ( nKeyCode ) { case 39: // right this.goToNextMenuItem(); e.returnValue = false; break; case 37: // left this.goToPreviousMenuItem(); e.returnValue = false; break; case 40: // down case 38: // up case 13: // enter var mi = this.items[ this.getSelectedIndex() ]; if ( mi ) { mi.dispatchAction(); if ( mi.subMenu ) mi.subMenu.setSelectedIndex( 0 ); } e.returnValue = false; break; case 27: // esc // we need to make sure that the menu bar looses its current // keyboard activation state this.setActive( false ); e.returnValue = false; break; default: // find any mnemonic that matches var c = String.fromCharCode( nKeyCode ).toLowerCase(); var items = this.items; var l = items.length; for ( var i = 0; i < l; i++ ) { if ( items[i].mnemonic == c ) { items[i].dispatchAction(); e.returnValue = false; break; } } }};MenuBar.prototype.getMenuBar = function () { return this;};MenuBar.prototype._menu_goToNextMenuItem = Menu.prototype.goToNextMenuItem;MenuBar.prototype.goToNextMenuItem = function () { var expand = this.getActiveState() == "open"; this._menu_goToNextMenuItem(); var mi = this.items[ this.getSelectedIndex() ]; if ( expand && mi != null ) { window.setTimeout( "eventListeners.menuBar.ongotonextmenuitem(\"" + this.id + "\")", 1 ); }};MenuBar.prototype._menu_goToPreviousMenuItem = Menu.prototype.goToPreviousMenuItem;MenuBar.prototype.goToPreviousMenuItem = function () { var expand = this.getActiveState() == "open"; this._menu_goToPreviousMenuItem(); var mi = this.items[ this.getSelectedIndex() ]; if ( expand && mi != null ) { window.setTimeout( "eventListeners.menuBar.ongotopreviousmenuitem(\"" + this.id + "\")", 1 ); }};MenuBar.prototype._menu_setSelectedIndex = Menu.prototype.setSelectedIndex;MenuBar.prototype.setSelectedIndex = function ( nIndex ) { this._menu_setSelectedIndex( nIndex ); this.active = nIndex != -1;};MenuBar.prototype.setActive = function ( bActive ) { if ( this.active != bActive ) { this.active = Boolean( bActive ); if ( this.active ) { this.setSelectedIndex( 0 ); this.backupFocused(); window.focus(); } else { this.setSelectedIndex( -1 ); this.restoreFocused(); } }};MenuBar.prototype.toggleActive = function () { if ( this.getActiveState() == "active" ) this.setActive( false ); else if ( this.getActiveState() == "inactive" ) this.setActive( true );};// returns active, inactive or openMenuBar.prototype.getActiveState = function () { if ( this.shownSubMenu != null || this._aboutToShowSubMenu) return "open"; else if ( this.active ) return "active"; else return "inactive";};MenuBar.prototype.backupFocused = function () { this._activeElement = this._document.activeElement;};MenuBar.prototype.restoreFocused = function () { try { this._activeElement.focus(); } catch (ex) {} delete this._activeElement;};MenuBar.prototype.destroy = function () { var l = this.items.length; for ( var i = l -1; i >= 0; i-- ) this.items[i].destroy(); this.detachEvents(); this._activeElement = null; this._htmlElement = null; this._document = null; this.items = []; this.shownSubMenu = null; this.eventListeners = null; menuCache.remove( this );};////////////////////////////////////////////////////////////////////////////////////// MenuButton extends MenuItem//function MenuButton( sLabelText, oSubMenu ) { this.MenuItem = MenuItem; this.MenuItem( sLabelText, null, null, oSubMenu ); // private this._hover = false; this._useInsets = false; // should insets be taken into account when showing sub menu}MenuButton.prototype = new MenuItem;MenuButton.prototype.subMenuDirection = "vertical";MenuButton.prototype.scrollIntoView = function () {};MenuButton.prototype.toHtml = function () { var cssClass = this.getCssClass(); var toolTip = this.getToolTip(); if ( this.subMenu && !this.subMenu._onclose ) this.subMenu._onclose = new Function( "eventListeners.menuButton.onclose(\"" + this.id + "\")" ); return "<span unselectable=\"on\" " + (cssClass != "" ? " class=\"" + cssClass + "\"" : "") + (toolTip != "" ? " title=\"" + toolTip + "\"" : "") + (!this.visible ? " style=\"display: none\"" : "") + "><span unselectable=\"on\" class=\"left\"></span>" + "<span unselectable=\"on\" class=\"middle\">" + this.getTextHtml() + "</span>" + "<span unselectable=\"on\" class=\"right\"></span>" + "</span>";};MenuButton.prototype.getCssClass = function () { if ( this.disabled && this._selected ) return "menu-button disabled-hover"; else if ( this.disabled ) return "menu-button disabled"; else if ( this._selected ) { if ( this.parentMenu.getActiveState() == "open" ) { return "menu-button active"; } else return "menu-button hover"; } else if ( this._hover ) return "menu-button hover"; return "menu-button ";};MenuButton.prototype.subMenuClosed = function () { if ( this.subMenu._closeReason == "escape" ) this.setSelected( true ); else this.setSelected( false ); if ( this.parentMenu.getActiveState() == "inactive" ) this.parentMenu.restoreFocused();};MenuButton.prototype.setSelected = function ( bSelected ) { var oldSelected = this._selected; this._selected = Boolean( bSelected ); var tr = this._htmlElement; if ( tr ) tr.className = this.getCssClass(); if ( this._selected == oldSelected ) return; if ( !this._selected ) this.closeSubMenu( true ); if ( bSelected ) { this.parentMenu.setSelectedIndex( this.itemIndex ); this.scrollIntoView(); } else this.parentMenu.setSelectedIndex( -1 );};////////////////////////////////////////////////////////////////////////////////////// event listener//var eventListeners = { menu: { onkeydown: function ( id ) { var oThis = menuCache[id]; var w = oThis.getDocument().parentWindow; oThis.handleKeyEvent( w.event ); }, onunload: function ( id ) { if (id in menuCache) { menuCache[id].closeAllMenus(); menuCache[id].destroy(); } // else already destroyed }, oncontextmenu: function ( id ) { var oThis = menuCache[id]; var w = oThis.getDocument().parentWindow; w.event.returnValue = false; }, onscroll: function ( id ) { menuCache[id].fixScrollEnabledState(); }, onmouseover: function ( id ) { var oThis = menuCache[id]; var w = oThis.getDocument().parentWindow; var fromEl = getTrElement( w.event.fromElement ); var toEl = getTrElement( w.event.toElement ); if ( toEl != null && toEl != fromEl ) { var mi = toEl._menuItem; if ( mi ) { if ( !mi.disabled || oThis.mouseHoverDisabled ) { mi.setSelected( true ); mi.showSubMenu( true ); } } else { // scroll button if (toEl.className == "disabled" || toEl.className == "disabled-hover" ) toEl.className = "disabled-hover"; else toEl.className = "hover"; oThis.selectedIndex = -1; } } }, onmouseout: function ( id ) { var oThis = menuCache[id]; var w = oThis.getDocument().parentWindow; var fromEl = getTrElement( w.event.fromElement ); var toEl = getTrElement( w.event.toElement ); if ( fromEl != null && toEl != fromEl ) { var id = fromEl.parentNode.parentNode.id; var mi = fromEl._menuItem; if ( id == "scroll-up-item" || id == "scroll-down-item" ) { if (fromEl.className == "disabled-hover" || fromEl.className == "disabled" ) fromEl.className = "disabled"; else fromEl.className = ""; oThis.selectedIndex = -1; } else if ( mi && ( toEl != null || mi.subMenu == null || mi.disabled ) ) { mi.setSelected( false ); } } }, onmouseup: function ( id ) { var oThis = menuCache[id]; var w = oThis.getDocument().parentWindow; var srcEl = getMenuItemElement( w.event.srcElement ); if ( srcEl != null ) { var id = srcEl.parentNode.parentNode.id; if ( id == "scroll-up-item" || id == "scroll-down-item" ) { return; } oThis.selectedIndex = srcEl.rowIndex; var menuItem = oThis.items[ oThis.selectedIndex ]; menuItem.dispatchAction(); } }, onmousewheel: function ( id ) { var oThis = menuCache[id]; var d = oThis.getDocument(); var w = d.parentWindow; var scrollContainer = d.getElementById("scroll-container"); scrollContainer.scrollTop -= 3 * w.event.wheelDelta / 120 * ScrollButton.scrollAmount; }, onreadystatechange: function ( id ) { var oThis = menuCache[id]; var d = oThis.getDocument(); var linkEl = d.getElementsByTagName("LINK")[0]; if ( linkEl.readyState == "complete" ) { oThis.resetSizeCache(); // reset sizes oThis.fixSize(); oThis.fixScrollButtons(); } }, oncloseinterval: function ( id ) { menuCache[id]._checkCloseState(); } }, menuItem: { onshowtimer: function ( id ) { var oThis = menuCache[id]; var sm = oThis.subMenu; var pm = oThis.parentMenu; var selectedIndex = sm.getSelectedIndex(); pm.closeAllSubs( sm ); window.setTimeout( "eventListeners.menuItem.onshowtimer2(\"" + id + "\")", 1); }, onshowtimer2: function ( id ) { var oThis = menuCache[id]; var sm = oThis.subMenu; var selectedIndex = sm.getSelectedIndex(); oThis.positionSubMenu(); sm.setSelectedIndex( selectedIndex ); oThis.setSelected( true ); }, onclosetimer: function ( id ) { var oThis = menuCache[id]; var sm = oThis.subMenu; sm.close(); }, onpositionsubmenutimer: function ( id ) { var oThis = menuCache[id]; var sm = oThis.subMenu; sm.resetSizeCache(); // reset sizes oThis.positionSubMenu(); sm.setSelectedIndex( 0 ); } }, menuBar: { onmouseover: function ( id ) { var oThis = menuCache[id]; var e = oThis.getDocument().parentWindow.event; var fromEl = getMenuItemElement( e.fromElement ); var toEl = getMenuItemElement( e.toElement ); if ( toEl != null && toEl != fromEl ) { var mb = toEl._menuItem; var m = mb.parentMenu; if ( m.getActiveState() == "open" ) { window.setTimeout( function () { mb.dispatchAction(); }, 1); } else if ( m.getActiveState() == "active" ) { mb.setSelected( true ); } else { mb._hover = true; toEl.className = mb.getCssClass(); } } }, onmouseout: function ( id ) { var oThis = menuCache[id]; var e = oThis.getDocument().parentWindow.event; var fromEl = getMenuItemElement( e.fromElement ); var toEl = getMenuItemElement( e.toElement ); if ( fromEl != null && toEl != fromEl ) { var mb = fromEl._menuItem; mb._hover = false; fromEl.className = mb.getCssClass(); } }, onmousedown: function ( id ) { var oThis = menuCache[id]; var e = oThis.getDocument().parentWindow.event; if ( e.button != MenuBar.leftMouseButton ) return; var el = getMenuItemElement( e.srcElement ); if ( el != null ) { var mb = el._menuItem; if ( mb.subMenu ) { mb.subMenu._checkCloseState(); if ( new Date() - mb.subMenu._closedAt > 100 ) { // longer than the time to // do the hide mb.dispatchAction(); } else { mb._hover = true; mb._htmlElement.className = mb.getCssClass(); } } } }, onkeydown: function ( id ) { var oThis = menuCache[id]; var e = oThis.getDocument().parentWindow.event; oThis.handleKeyEvent( e ); }, onunload: function ( id ) { menuCache[id].destroy(); }, ongotonextmenuitem: function ( id ) { var oThis = menuCache[id]; var mi = oThis.items[ oThis.getSelectedIndex() ]; mi.dispatchAction(); if ( mi.subMenu ) mi.subMenu.setSelectedIndex( 0 ); }, ongotopreviousmenuitem: function ( id ) { var oThis = menuCache[id]; var mi = oThis.items[ oThis.getSelectedIndex() ]; mi.dispatchAction(); if ( mi.subMenu ) mi.subMenu.setSelectedIndex( 0 ); } }, menuButton: { onclose: function ( id ) { menuCache[id].subMenuClosed(); } }};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -