📄 menu.js
字号:
if(aGroup[i] == p_oItem) {
nItemIndex = i;
break;
}
}
while(i--);
if(nItemIndex > -1) {
return this._removeItemFromGroupByIndex(
p_nGroupIndex,
nItemIndex
);
}
}
}
},
/**
* @method _updateItemProperties
* @description Updates the "index," "groupindex," and "className" properties
* of the menu items in the specified group.
* @private
* @param {Number} p_nGroupIndex Number indicating the group of items to update.
*/
_updateItemProperties: function(p_nGroupIndex) {
var aGroup = this._getItemGroup(p_nGroupIndex),
nItems = aGroup.length;
if(nItems > 0) {
var i = nItems - 1,
oItem,
oLI;
// Update the index and className properties of each member
do {
oItem = aGroup[i];
if(oItem) {
oLI = oItem.element;
oItem.index = i;
oItem.groupIndex = p_nGroupIndex;
oLI.setAttribute("groupindex", p_nGroupIndex);
oLI.setAttribute("index", i);
Dom.removeClass(oLI, "first-of-type");
}
}
while(i--);
if(oLI) {
Dom.addClass(oLI, "first-of-type");
}
}
},
/**
* @method _createItemGroup
* @description Creates a new menu item group (array) and its associated
* <code><ul></code> element. Returns an aray of menu item groups.
* @private
* @param {Number} p_nIndex Number indicating the group to create.
* @return {Array}
*/
_createItemGroup: function(p_nIndex) {
if(!this._aItemGroups[p_nIndex]) {
this._aItemGroups[p_nIndex] = [];
var oUL = document.createElement("ul");
this._aListElements[p_nIndex] = oUL;
return this._aItemGroups[p_nIndex];
}
},
/**
* @method _getItemGroup
* @description Returns the menu item group at the specified index.
* @private
* @param {Number} p_nIndex Number indicating the index of the menu item group
* to be retrieved.
* @return {Array}
*/
_getItemGroup: function(p_nIndex) {
var nIndex = ((typeof p_nIndex == "number") ? p_nIndex : 0);
return this._aItemGroups[nIndex];
},
/**
* @method _configureSubmenu
* @description Subscribes the menu item's submenu to its parent menu's events.
* @private
* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem
* instance with the submenu to be configured.
*/
_configureSubmenu: function(p_oItem) {
var oSubmenu = p_oItem.cfg.getProperty("submenu");
if(oSubmenu) {
/*
Listen for configuration changes to the parent menu
so they they can be applied to the submenu.
*/
this.cfg.configChangedEvent.subscribe(
this._onParentMenuConfigChange,
oSubmenu,
true
);
this.renderEvent.subscribe(
this._onParentMenuRender,
oSubmenu,
true
);
oSubmenu.beforeShowEvent.subscribe(
this._onSubmenuBeforeShow,
oSubmenu,
true
);
oSubmenu.showEvent.subscribe(
this._onSubmenuShow,
oSubmenu,
true
);
oSubmenu.hideEvent.subscribe(
this._onSubmenuHide,
oSubmenu,
true
);
}
},
/**
* @method _subscribeToItemEvents
* @description Subscribes a menu to a menu item's event.
* @private
* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem
* instance whose events should be subscribed to.
*/
_subscribeToItemEvents: function(p_oItem) {
p_oItem.focusEvent.subscribe(this._onMenuItemFocus, p_oItem, this);
p_oItem.blurEvent.subscribe(this._onMenuItemBlur, this, true);
p_oItem.cfg.configChangedEvent.subscribe(
this._onMenuItemConfigChange,
p_oItem,
this
);
},
/**
* @method _getOffsetWidth
* @description Returns the offset width of the menu's
* <code><div></code> element.
* @private
*/
_getOffsetWidth: function() {
var oClone = this.element.cloneNode(true);
Dom.setStyle(oClone, "width", "");
document.body.appendChild(oClone);
var sWidth = oClone.offsetWidth;
document.body.removeChild(oClone);
return sWidth;
},
/**
* @method _cancelHideDelay
* @description Cancels the call to "hideMenu."
* @private
*/
_cancelHideDelay: function() {
var oRoot = this.getRoot();
if(oRoot._nHideDelayId) {
window.clearTimeout(oRoot._nHideDelayId);
}
},
/**
* @method _execHideDelay
* @description Hides the menu after the number of milliseconds specified by
* the "hidedelay" configuration property.
* @private
*/
_execHideDelay: function() {
this._cancelHideDelay();
var oRoot = this.getRoot(),
me = this;
function hideMenu() {
if(oRoot.activeItem) {
oRoot.clearActiveItem();
}
if(oRoot == me && me.cfg.getProperty("position") == "dynamic") {
me.hide();
}
}
oRoot._nHideDelayId =
window.setTimeout(hideMenu, oRoot.cfg.getProperty("hidedelay"));
},
/**
* @method _cancelShowDelay
* @description Cancels the call to the "showMenu."
* @private
*/
_cancelShowDelay: function() {
var oRoot = this.getRoot();
if(oRoot._nShowDelayId) {
window.clearTimeout(oRoot._nShowDelayId);
}
},
/**
* @method _execShowDelay
* @description Shows the menu after the number of milliseconds specified by
* the "showdelay" configuration property have ellapsed.
* @private
* @param {YAHOO.widget.Menu} p_oMenu Object specifying the menu that should
* be made visible.
*/
_execShowDelay: function(p_oMenu) {
var oRoot = this.getRoot();
function showMenu() {
p_oMenu.show();
}
oRoot._nShowDelayId =
window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay"));
},
// Protected methods
/**
* @method _onMouseOver
* @description "mouseover" 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.
*/
_onMouseOver: function(p_sType, p_aArgs, p_oMenu) {
var oEvent = p_aArgs[0],
oItem = p_aArgs[1],
oTarget = Event.getTarget(oEvent);
if(
!this._bHandledMouseOverEvent &&
(oTarget == this.element || Dom.isAncestor(this.element, oTarget))
) {
this.clearActiveItem();
this._bHandledMouseOverEvent = true;
this._bHandledMouseOutEvent = false;
}
if(
oItem && !oItem.handledMouseOverEvent &&
!oItem.cfg.getProperty("disabled") &&
(oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget))
) {
var nShowDelay = this.cfg.getProperty("showdelay"),
bShowDelay = (nShowDelay > 0);
if(bShowDelay) {
this._cancelShowDelay();
}
var oActiveItem = this.activeItem;
if(oActiveItem) {
oActiveItem.cfg.setProperty("selected", false);
var oActiveSubmenu = oActiveItem.cfg.getProperty("submenu");
if(oActiveSubmenu) {
oActiveSubmenu.hide();
}
}
var oItemCfg = oItem.cfg;
// Select and focus the current menu item
oItemCfg.setProperty("selected", true);
oItem.focus();
if(this.cfg.getProperty("autosubmenudisplay")) {
// Show the submenu this menu item
var oSubmenu = oItemCfg.getProperty("submenu");
if(oSubmenu) {
if(bShowDelay) {
this._execShowDelay(oSubmenu);
}
else {
oSubmenu.show();
}
}
}
oItem.handledMouseOverEvent = true;
oItem.handledMouseOutEvent = false;
}
},
/**
* @method _onMouseOut
* @description "mouseout" 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.
*/
_onMouseOut: function(p_sType, p_aArgs, p_oMenu) {
var oEvent = p_aArgs[0],
oItem = p_aArgs[1],
oRelatedTarget = Event.getRelatedTarget(oEvent),
bMovingToSubmenu = false;
if(oItem && !oItem.cfg.getProperty("disabled")) {
var oItemCfg = oItem.cfg,
oSubmenu = oItemCfg.getProperty("submenu");
if(
oSubmenu &&
(
oRelatedTarget == oSubmenu.element ||
Dom.isAncestor(oSubmenu.element, oRelatedTarget)
)
) {
bMovingToSubmenu = true;
}
if(
!oItem.handledMouseOutEvent &&
(
(
oRelatedTarget != oItem.element &&
!Dom.isAncestor(oItem.element, oRelatedTarget)
) || bMovingToSubmenu
)
) {
if(
!oSubmenu ||
(oSubmenu && !oSubmenu.cfg.getProperty("visible"))
) {
oItem.cfg.setProperty("selected", false);
if(
oSubmenu &&
oSubmenu.cfg.getProperty("showdelay") &&
!oSubmenu.cfg.getProperty("visible")
) {
this._cancelShowDelay();
}
}
oItem.handledMouseOutEvent = true;
oItem.handledMouseOverEvent = false;
}
}
if(
!this._bHandledMouseOutEvent &&
(
(
oRelatedTarget != this.element &&
!Dom.isAncestor(this.element, oRelatedTarget)
)
|| bMovingToSubmenu
)
) {
this._bHandledMouseOutEvent = true;
this._bHandledMouseOverEvent = false;
}
},
/**
* @method _onClick
* @description "click" 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -