📄 menu.js
字号:
* @private
*/
_initSubTree: function() {
var oNode;
if(this.srcElement.tagName == "DIV") {
/*
Populate the collection of item groups and item
group titles
*/
oNode = this.body.firstChild;
var nGroup = 0,
sGroupTitleTagName = this.GROUP_TITLE_TAG_NAME.toUpperCase();
do {
if(oNode && oNode.tagName) {
switch(oNode.tagName.toUpperCase()) {
case sGroupTitleTagName:
this._aGroupTitleElements[nGroup] = oNode;
break;
case "UL":
this._aListElements[nGroup] = oNode;
this._aItemGroups[nGroup] = [];
nGroup++;
break;
}
}
}
while((oNode = oNode.nextSibling));
/*
Apply the "first-of-type" class to the first UL to mimic
the "first-of-type" CSS3 psuedo class.
*/
if(this._aListElements[0]) {
Dom.addClass(this._aListElements[0], "first-of-type");
}
}
oNode = null;
if(this.srcElement.tagName) {
var sSrcElementTagName = this.srcElement.tagName.toUpperCase();
switch(sSrcElementTagName) {
case "DIV":
if(this._aListElements.length > 0) {
var i = this._aListElements.length - 1;
do {
oNode = this._aListElements[i].firstChild;
do {
if(
oNode &&
oNode.tagName &&
oNode.tagName.toUpperCase() == "LI"
) {
this.addItem(
new this.ITEM_TYPE(
oNode,
{ parent: this }
),
i
);
}
}
while((oNode = oNode.nextSibling));
}
while(i--);
}
break;
case "SELECT":
oNode = this.srcElement.firstChild;
do {
if(oNode && oNode.tagName) {
switch(oNode.tagName.toUpperCase()) {
case "OPTGROUP":
case "OPTION":
this.addItem(
new this.ITEM_TYPE(
oNode,
{ parent: this }
)
);
break;
}
}
}
while((oNode = oNode.nextSibling));
break;
}
}
},
/**
* @method _getFirstEnabledItem
* @description Returns the first enabled item in the menu.
* @return {YAHOO.widget.MenuItem}
* @private
*/
_getFirstEnabledItem: function() {
var nGroups = this._aItemGroups.length,
oItem,
aItemGroup;
for(var i=0; i<nGroups; i++) {
aItemGroup = this._aItemGroups[i];
if(aItemGroup) {
var nItems = aItemGroup.length;
for(var n=0; n<nItems; n++) {
oItem = aItemGroup[n];
if(
!oItem.cfg.getProperty("disabled") &&
oItem.element.style.display != "none"
) {
return oItem;
}
oItem = null;
}
}
}
},
/**
* @method _checkPosition
* @description Checks to make sure that the value of the "position" property
* is one of the supported strings. Returns true if the position is supported.
* @private
* @param {Object} p_sPosition String specifying the position of the menu.
* @return {Boolean}
*/
_checkPosition: function(p_sPosition) {
if(typeof p_sPosition == "string") {
var sPosition = p_sPosition.toLowerCase();
return ("dynamic,static".indexOf(sPosition) != -1);
}
},
/**
* @method _addItemToGroup
* @description Adds a menu item to a group.
* @private
* @param {Number} p_nGroupIndex Number indicating the group to which the
* item belongs.
* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem
* instance to be added to the menu.
* @param {String} p_oItem String specifying the text of the item to be added
* to the menu.
* @param {Object} p_oItem Object literal containing a set of menu item
* configuration properties.
* @param {Number} p_nItemIndex Optional. Number indicating the index at
* which the menu item should be added.
* @return {YAHOO.widget.MenuItem}
*/
_addItemToGroup: function(p_nGroupIndex, p_oItem, p_nItemIndex) {
var oItem;
if(p_oItem instanceof this.ITEM_TYPE) {
oItem = p_oItem;
oItem.parent = this;
}
else if(typeof p_oItem == "string") {
oItem = new this.ITEM_TYPE(p_oItem, { parent: this });
}
else if(typeof p_oItem == "object") {
p_oItem.parent = this;
oItem = new this.ITEM_TYPE(p_oItem.text, p_oItem);
}
if(oItem) {
var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0,
aGroup = this._getItemGroup(nGroupIndex),
oGroupItem;
if(!aGroup) {
aGroup = this._createItemGroup(nGroupIndex);
}
if(typeof p_nItemIndex == "number") {
var bAppend = (p_nItemIndex >= aGroup.length);
if(aGroup[p_nItemIndex]) {
aGroup.splice(p_nItemIndex, 0, oItem);
}
else {
aGroup[p_nItemIndex] = oItem;
}
oGroupItem = aGroup[p_nItemIndex];
if(oGroupItem) {
if(
bAppend &&
(
!oGroupItem.element.parentNode ||
oGroupItem.element.parentNode.nodeType == 11
)
) {
this._aListElements[nGroupIndex].appendChild(
oGroupItem.element
);
}
else {
/**
* Returns the next sibling of an item in an array.
* @private
* @param {p_aArray} Array to search.
* @param {p_nStartIndex} Number indicating the index to
* start searching the array.
* @return {Object}
*/
function getNextItemSibling(p_aArray, p_nStartIndex) {
return (
p_aArray[p_nStartIndex] ||
getNextItemSibling(
p_aArray,
(p_nStartIndex+1)
)
);
}
var oNextItemSibling =
getNextItemSibling(aGroup, (p_nItemIndex+1));
if(
oNextItemSibling &&
(
!oGroupItem.element.parentNode ||
oGroupItem.element.parentNode.nodeType == 11
)
) {
this._aListElements[nGroupIndex].insertBefore(
oGroupItem.element,
oNextItemSibling.element
);
}
}
oGroupItem.parent = this;
this._subscribeToItemEvents(oGroupItem);
this._configureSubmenu(oGroupItem);
this._updateItemProperties(nGroupIndex);
this.itemAddedEvent.fire(oGroupItem);
return oGroupItem;
}
}
else {
var nItemIndex = aGroup.length;
aGroup[nItemIndex] = oItem;
oGroupItem = aGroup[nItemIndex];
if(oGroupItem) {
if(
!Dom.isAncestor(
this._aListElements[nGroupIndex],
oGroupItem.element
)
) {
this._aListElements[nGroupIndex].appendChild(
oGroupItem.element
);
}
oGroupItem.element.setAttribute("groupindex", nGroupIndex);
oGroupItem.element.setAttribute("index", nItemIndex);
oGroupItem.parent = this;
oGroupItem.index = nItemIndex;
oGroupItem.groupIndex = nGroupIndex;
this._subscribeToItemEvents(oGroupItem);
this._configureSubmenu(oGroupItem);
if(nItemIndex === 0) {
Dom.addClass(oGroupItem.element, "first-of-type");
}
this.itemAddedEvent.fire(oGroupItem);
return oGroupItem;
}
}
}
},
/**
* @method _removeItemFromGroupByIndex
* @description Removes a menu item from a group by index. Returns the menu
* item that was removed.
* @private
* @param {Number} p_nGroupIndex Number indicating the group to which the menu
* item belongs.
* @param {Number} p_nItemIndex Number indicating the index of the menu item
* to be removed.
* @return {YAHOO.widget.MenuItem}
*/
_removeItemFromGroupByIndex: function(p_nGroupIndex, p_nItemIndex) {
var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0,
aGroup = this._getItemGroup(nGroupIndex);
if(aGroup) {
var aArray = aGroup.splice(p_nItemIndex, 1),
oItem = aArray[0];
if(oItem) {
// Update the index and className properties of each member
this._updateItemProperties(nGroupIndex);
if(aGroup.length === 0) {
// Remove the UL
var oUL = this._aListElements[nGroupIndex];
if(this.body && oUL) {
this.body.removeChild(oUL);
}
// Remove the group from the array of items
this._aItemGroups.splice(nGroupIndex, 1);
// Remove the UL from the array of ULs
this._aListElements.splice(nGroupIndex, 1);
/*
Assign the "first-of-type" class to the new first UL
in the collection
*/
oUL = this._aListElements[0];
if(oUL) {
Dom.addClass(oUL, "first-of-type");
}
}
this.itemRemovedEvent.fire(oItem);
// Return a reference to the item that was removed
return oItem;
}
}
},
/**
* @method _removeItemFromGroupByValue
* @description Removes a menu item from a group by reference. Returns the
* menu item that was removed.
* @private
* @param {Number} p_nGroupIndex Number indicating the group to which the
* menu item belongs.
* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem
* instance to be removed.
* @return {YAHOO.widget.MenuItem}
*/
_removeItemFromGroupByValue: function(p_nGroupIndex, p_oItem) {
var aGroup = this._getItemGroup(p_nGroupIndex);
if(aGroup) {
var nItems = aGroup.length,
nItemIndex = -1;
if(nItems > 0) {
var i = nItems-1;
do {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -