📄 menu.js
字号:
* fired the event.
*/
_onClick: function(p_sType, p_aArgs, p_oMenu) {
var oEvent = p_aArgs[0],
oItem = p_aArgs[1],
oTarget = Event.getTarget(oEvent);
if(oItem && !oItem.cfg.getProperty("disabled")) {
var oItemCfg = oItem.cfg,
oSubmenu = oItemCfg.getProperty("submenu");
/*
ACCESSIBILITY FEATURE FOR SCREEN READERS:
Expand/collapse the submenu when the user clicks
on the submenu indicator image.
*/
if(oTarget == oItem.submenuIndicator && oSubmenu) {
if(oSubmenu.cfg.getProperty("visible")) {
oSubmenu.hide();
}
else {
this.clearActiveItem();
this.activeItem = oItem;
oItem.cfg.setProperty("selected", true);
oSubmenu.show();
}
}
else {
var sURL = oItemCfg.getProperty("url"),
bCurrentPageURL = (sURL.substr((sURL.length-1),1) == "#"),
sTarget = oItemCfg.getProperty("target"),
bHasTarget = (sTarget && sTarget.length > 0);
/*
Prevent the browser from following links
equal to "#"
*/
if(
oTarget.tagName.toUpperCase() == "A" &&
bCurrentPageURL && !bHasTarget
) {
Event.preventDefault(oEvent);
}
if(
oTarget.tagName.toUpperCase() != "A" &&
!bCurrentPageURL && !bHasTarget
) {
/*
Follow the URL of the item regardless of
whether or not the user clicked specifically
on the anchor element.
*/
document.location = sURL;
}
/*
If the item doesn't navigate to a URL and it doesn't have
a submenu, then collapse the menu tree.
*/
if(bCurrentPageURL && !oSubmenu) {
var oRoot = this.getRoot();
if(oRoot.cfg.getProperty("position") == "static") {
oRoot.clearActiveItem();
}
else {
oRoot.hide();
}
}
}
}
},
/**
* @method _onKeyDown
* @description "keydown" event handler for the menu.
* @protected
* @param {String} p_sType String representing the name of the event that
* was fired.
* @param {Array} p_aArgs Array of arguments sent when the event was fired.
* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_onKeyDown: function(p_sType, p_aArgs, p_oMenu) {
var oEvent = p_aArgs[0],
oItem = p_aArgs[1],
oSubmenu;
if(oItem && !oItem.cfg.getProperty("disabled")) {
var oItemCfg = oItem.cfg,
oParentItem = this.parent,
oRoot,
oNextItem;
switch(oEvent.keyCode) {
case 38: // Up arrow
case 40: // Down arrow
if(
oItem == this.activeItem &&
!oItemCfg.getProperty("selected")
) {
oItemCfg.setProperty("selected", true);
}
else {
oNextItem = (oEvent.keyCode == 38) ?
oItem.getPreviousEnabledSibling() :
oItem.getNextEnabledSibling();
if(oNextItem) {
this.clearActiveItem();
oNextItem.cfg.setProperty("selected", true);
oNextItem.focus();
}
}
Event.preventDefault(oEvent);
break;
case 39: // Right arrow
oSubmenu = oItemCfg.getProperty("submenu");
if(oSubmenu) {
if(!oItemCfg.getProperty("selected")) {
oItemCfg.setProperty("selected", true);
}
oSubmenu.show();
oSubmenu.setInitialSelection();
}
else {
oRoot = this.getRoot();
if(oRoot instanceof YAHOO.widget.MenuBar) {
oNextItem = oRoot.activeItem.getNextEnabledSibling();
if(oNextItem) {
oRoot.clearActiveItem();
oNextItem.cfg.setProperty("selected", true);
oSubmenu = oNextItem.cfg.getProperty("submenu");
if(oSubmenu) {
oSubmenu.show();
}
oNextItem.focus();
}
}
}
Event.preventDefault(oEvent);
break;
case 37: // Left arrow
if(oParentItem) {
var oParentMenu = oParentItem.parent;
if(oParentMenu instanceof YAHOO.widget.MenuBar) {
oNextItem =
oParentMenu.activeItem.getPreviousEnabledSibling();
if(oNextItem) {
oParentMenu.clearActiveItem();
oNextItem.cfg.setProperty("selected", true);
oSubmenu = oNextItem.cfg.getProperty("submenu");
if(oSubmenu) {
oSubmenu.show();
}
oNextItem.focus();
}
}
else {
this.hide();
oParentItem.focus();
}
}
Event.preventDefault(oEvent);
break;
}
}
if(oEvent.keyCode == 27) { // Esc key
if(this.cfg.getProperty("position") == "dynamic") {
this.hide();
if(this.parent) {
this.parent.focus();
}
}
else if(this.activeItem) {
oSubmenu = this.activeItem.cfg.getProperty("submenu");
if(oSubmenu && oSubmenu.cfg.getProperty("visible")) {
oSubmenu.hide();
this.activeItem.focus();
}
else {
this.activeItem.cfg.setProperty("selected", false);
this.activeItem.blur();
}
}
Event.preventDefault(oEvent);
}
},
/**
* @method _onTextResize
* @description "textresize" event handler for the menu.
* @protected
* @param {String} p_sType String representing the name of the event that
* was fired.
* @param {Array} p_aArgs Array of arguments sent when the event was fired.
* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_onTextResize: function(p_sType, p_aArgs, p_oMenu) {
if(this.browser == "gecko" && !this._handleResize) {
this._handleResize = true;
return;
}
var oConfig = this.cfg;
if(oConfig.getProperty("position") == "dynamic") {
oConfig.setProperty("width", (this._getOffsetWidth() + "px"));
}
},
// Private methods
/**
* @method _onInit
* @description "init" event handler for the menu.
* @private
* @param {String} p_sType String representing the name of the event that
* was fired.
* @param {Array} p_aArgs Array of arguments sent when the event was fired.
* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_onInit: function(p_sType, p_aArgs, p_oMenu) {
if(
(
(this.parent && !this.lazyLoad) ||
(!this.parent && this.cfg.getProperty("position") == "static") ||
(
!this.parent &&
!this.lazyLoad &&
this.cfg.getProperty("position") == "dynamic"
)
) &&
this.getItemGroups().length === 0
) {
if(this.srcElement) {
this._initSubTree();
}
if(this.itemData) {
this.addItems(this.itemData);
}
}
else if(this.lazyLoad) {
this.cfg.fireQueue();
}
},
/**
* @method _onBeforeRender
* @description "beforerender" event handler for the menu. Appends all of the
* <code><ul></code>, <code><li></code> and their accompanying
* title elements to the body element of the menu.
* @private
* @param {String} p_sType String representing the name of the event that
* was fired.
* @param {Array} p_aArgs Array of arguments sent when the event was fired.
* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_onBeforeRender: function(p_sType, p_aArgs, p_oMenu) {
var oConfig = this.cfg,
oEl = this.element,
nListElements = this._aListElements.length;
if(nListElements > 0) {
var i = 0,
bFirstList = true,
oUL,
oGroupTitle;
do {
oUL = this._aListElements[i];
if(oUL) {
if(bFirstList) {
Dom.addClass(oUL, "first-of-type");
bFirstList = false;
}
if(!Dom.isAncestor(oEl, oUL)) {
this.appendToBody(oUL);
}
oGroupTitle = this._aGroupTitleElements[i];
if(oGroupTitle) {
if(!Dom.isAncestor(oEl, oGroupTitle)) {
oUL.parentNode.insertBefore(oGroupTitle, oUL);
}
Dom.addClass(oUL, "hastitle");
}
}
i++;
}
while(i < nListElements);
}
},
/**
* @method _onRender
* @description "render" event handler for the menu.
* @private
* @param {String} p_sType String representing the name of the event that
* was fired.
* @param {Array} p_aArgs Array of arguments sent when the event was fired.
* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_onRender: function(p_sType, p_aArgs, p_oMenu) {
if(this.cfg.getProperty("position") == "dynamic") {
var sWidth =
this.element.parentNode.tagName.toUpperCase() == "BODY" ?
this.element.offsetWidth : this._getOffsetWidth();
this.cfg.setProperty("width", (sWidth + "px"));
}
},
/**
* @method _onBeforeShow
* @description "beforeshow" event handler for the menu.
* @private
* @param {String} p_sType String representing the name of the event that
* was fired.
* @param {Array} p_aArgs Array of arguments sent when the event was fired.
* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_onBeforeShow: function(p_sType, p_aArgs, p_oMenu) {
if(this.lazyLoad && this.getItemGroups().length === 0) {
if(this.srcElement) {
this._initSubTree();
}
if(this.itemData) {
if(
this.parent && this.parent.parent &&
this.parent.parent.srcElement &&
this.parent.parent.srcElement.tagName.toUpperCase() == "SELECT"
) {
var nOptions = this.itemData.length;
for(var n=0; n<nOptions; n++) {
if(this.itemDat
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -