Hi
I have created a basic drop down expanding menu. My code is at the bottom which can be seen if you copy and paste it into notepad. At the moment I have created the main menu options as images. My question is is there a way for me to add the OnMouseOver event to the main menu (root menu) options so when the cursor moves over the image which represents the menu option it changes to another image temporarily? So far I have been unable to integrate the OnMouseOver event successfully into my code. Thank you very much for any help. Here is my code (please paste it into Notepad or another editor to make it more readable):
----------------------------------------------------------
<SCRIPT LANGUAGE="JavaScript">
<!-- Begin ***************************************************
var isDOM = (document.getElementById ? true : false);
var isIE4 = ((document.all && !isDOM) ? true : false);
var isNS4 = (document.layers ? true : false);
function getRef(id) {
if (isDOM) return document.getElementById(id);
if (isIE4) return document.all[id];
if (isNS4) return document.layers[id];
}
function getSty(id) {
return (isNS4 ? getRef(id) : getRef(id).style);
}
// Hide timeout.
var popTimer = 0;
// Array showing highlighted menu items.
var litNow = new Array();
function popOver(menuNum, itemNum) {
clearTimeout(popTimer);
hideAllBut(menuNum);
litNow = getTree(menuNum, itemNum);
changeCol(litNow, true);
targetNum = menu[menuNum][itemNum].target;
if (targetNum > 0) {
thisX = parseInt(menu[menuNum][0].ref.left) + parseInt(menu[menuNum][itemNum].ref.left);
thisY = parseInt(menu[menuNum][0].ref.top) + parseInt(menu[menuNum][itemNum].ref.top);
with (menu[targetNum][0].ref) {
left = parseInt(thisX + menu[targetNum][0].x);
top = parseInt(thisY + menu[targetNum][0].y);
visibility = 'visible';
}
}
}
function popOut(menuNum, itemNum) {
if ((menuNum == 0) && !menu[menuNum][itemNum].target)
hideAllBut(0)
else
popTimer = setTimeout('hideAllBut(0)', 500);
}
function getTree(menuNum, itemNum) {
// Array index is the menu number. The contents are null (if that menu is not a parent)
// or the item number in that menu that is an ancestor (to light it up).
itemArray = new Array(menu.length);
while(1) {
itemArray[menuNum] = itemNum;
if (menuNum == 0) return itemArray;
itemNum = menu[menuNum][0].parentItem;
menuNum = menu[menuNum][0].parentMenu;
}
}
// Pass an array and a boolean to specify colour change, true = over colour.
function changeCol(changeArray, isOver) {
for (menuCount = 0; menuCount < changeArray.length; menuCount++) {
if (changeArray[menuCount]) {
newCol = isOver ? menu[menuCount][0].overCol : menu[menuCount][0].backCol;
// Change the colours of the div/layer background.
with (menu[menuCount][changeArray[menuCount]].ref) {
if (isNS4) bgColor = newCol;
else backgroundColor = newCol;
}
}
}
}
function hideAllBut(menuNum) {
var keepMenus = getTree(menuNum, 1);
for (count = 0; count < menu.length; count++)
if (!keepMenus[count])
menu[count][0].ref.visibility = 'hidden';
changeCol(litNow, false);
}
// *** MENU CONSTRUCTION FUNCTIONS ***
function Menu(isVert, popInd, x, y, width, overCol, backCol, borderClass, textClass) {
// True or false - a vertical menu?
this.isVert = isVert;
// The popout indicator used (if any) for this menu.
this.popInd = popInd
// Position and size settings.
this.x = x;
this.y = y;
this.width = width;
// Colours of menu and items.
this.overCol = overCol;
this.backCol = backCol;
// The stylesheet class used for item borders and the text within items.
this.borderClass = borderClass;
this.textClass = textClass;
// Parent menu and item numbers, indexed later.
this.parentMenu = null;
this.parentItem = null;
// Reference to the object's style properties (set later).
this.ref = null;
}
function Item(text, href, frame, length, spacing, target) {
this.text = text;
this.href = href;
this.frame = frame;
this.length = length;
this.spacing = spacing;
this.target = target;
// Reference to the object's style properties (set later).
this.ref = null;
}
function writeMenus() {
if (!isDOM && !isIE4 && !isNS4) return;
for (currMenu = 0; currMenu < menu.length; currMenu++) with (menu[currMenu][0]) {
// Variable for holding HTML for items and positions of next item.
var str = '', itemX = 0, itemY = 0;
// items start from 1 in the array (0 is menu object itself, above).
// Also use properties of each item nested in the other with() for construction.
for (currItem = 1; currItem < menu[currMenu].length; currItem++) with (menu[currMenu][currItem]) {
var itemID = 'menu' + currMenu + 'item' + currItem;
// The width and height of the menu item - dependent on orientation!
var w = (isVert ? width : length);
var h = (isVert ? length : width);
// Create a div or layer text string with appropriate styles/properties.
if (isDOM || isIE4) {
str += '<div id="' + itemID + '" style="position: absolute; left: ' + itemX + '; top: ' + itemY + '; width: ' + w + '; height: ' + h + '; visibility: inherit; ';
if (backCol) str += 'background: ' + backCol + '; ';
str += '" ';
}
if (isNS4) {
str += '<layer id="' + itemID + '" left="' + itemX + '" top="' + itemY + '" width="' + w + '" height="' + h + '" visibility="inherit" ';
if (backCol) str += 'bgcolor="' + backCol + '" ';
}
if (borderClass) str += 'class="' + borderClass + '" ';
// Add mouseover handlers and finish div/layer.
str += 'onMouseOver="popOver(' + currMenu + ',' + currItem + ')" onMouseOut="popOut(' + currMenu + ',' + currItem + ')">';
// Add contents of item (default: table with link inside).
// If a target frame is specified, also add that to the <a> tag.
str += '<table width="' + (w - 8) + '" border="0" cellspacing="0" cellpadding="' + (!isNS4 && borderClass ? 3 : 0) + '"><tr><td align="left" height="' + (h - 7) + '">' + '<a class="' + textClass + '" href="' + href + '"' + (frame ? ' target="' + frame + '">' : '>') + text + '</a></td>';
if (target > 0) {
// Set target's parents to this menu item.
menu[target][0].parentMenu = currMenu;
menu[target][0].parentItem = currItem;
// Add a popout indicator.
if (popInd) str += '<td class="' + textClass + '" align="right">' + popInd + '</td>';
}
str += '</tr></table>' + (isNS4 ? '</layer>' : '</div>');
if (isVert) itemY += length + spacing;
else itemX += length + spacing;
}
if (isDOM) {
var newDiv = document.createElement('div');
document.getElementsByTagName('body').item(0).appendChild(newDiv);
newDiv.innerHTML = str;
ref = newDiv.style;
ref.position = 'absolute';
ref.visibility = 'hidden';
}
// Insert a div tag to the end of the BODY with menu HTML in place for IE4.
if (isIE4) {
document.body.insertAdjacentHTML('beforeEnd', '<div id="menu' + currMenu + 'div" ' + 'style="position: absolute; visibility: hidden">' + str + '</div>');
ref = getSty('menu' + currMenu + 'div');
}
// In NS4, create a reference to a new layer and write the items to it.
if (isNS4) {
ref = new Layer(0);
ref.document.write(str);
ref.document.close();
}
for (currItem = 1; currItem < menu[currMenu].length; currItem++) {
itemName = 'menu' + currMenu + 'item' + currItem;
if (isDOM || isIE4) menu[currMenu][currItem].ref = getSty(itemName);
if (isNS4) menu[currMenu][currItem].ref = ref.document[itemName];
}
}
with(menu[0][0]) {
ref.left = x;
ref.top = y;
ref.visibility = 'visible';
}
}
//***************************************************************
//*********************************** THE MENUS *****************
//GENERAL INFO
// menu[menuNumber][0] = new Menu(Vertical menu? (true/false), 'popout indicator', left, top,
// width, 'mouseover colour', 'background colour', 'border stylesheet', 'text stylesheet');
//
// Left and Top are measured on-the-fly relative to the top-left corner of its trigger, or
// for the root menu, the top-left corner of the page.
//
// menu[menuNumber][itemNumber] = new Item('Text', 'URL', 'target frame', length of menu item,
// additional spacing to next menu item, number of target menu to popout);
//
// If no target menu (popout) is desired, it is set to 0. Because site does not use
// frames, pass an empty string as a frame target.
//
// Most menus below are 'true', that is they are vertical, except for the first root menu.
// The 'length' and 'width' of an item depends on its orientation -- length is how long
// the item runs for in the direction of the menu, and width is the lateral dimension of the menu.
var menu = new Array();
// SUB MENU COLOURS *******************************************
//(defOver is colour if mouse is moved over sub menu option, defBack is normal colour)
//F984BB is lighter pink than standard pink ff66cc as used in logo
//3b92f3 is standard light blue as used in logo
var defOver = '#ff66cc', defBack = '#3b92f3';
// Default 'length' of menu items - item height if menu is vertical, width if horizontal.
var defLength = 22;
// Menu 0 is the 'root' menu from which everything else arises.
menu[0] = new Array();
// *** ROOT MENU **********************************************
//it's positioned at (0, 83) and is 16px thick now. 0 means from the left, 83 means from the top
menu[0][0] = new Menu(false, '', 0, 83, 16, defOver, defBack, '', 'crazyText');
// NB the targets are all set to nonzero values...
// The 'length' is represented by the third number from the right, and there is spacing of 5 to the next item.
menu[0][1] = new Item('<img src=images_navigation/welcome.gif border=0>', 'home.html', '', 79, 0, 0); //no sub menu
menu[0][2] = new Item('<img src=images_navigation/products.gif border=0>', 'section.asp?SectionID=2', '', 80, 0, 1);//has a sub menu id 1
menu[0][3] = new Item('<img src=images_navigation/services.gif border=0>', 'section.asp?SectionID=3', '', 75, 0, 2);//has a sub menu id 2
//*************************************************************
// *** ROOT SUB MENU OPTION ONE *******************************
// *** Products ***
menu[1] = new Array();
// The Home menu is positioned 0px across and 19 down from its trigger, and is 250 wide.
// All text in this menu has the stylesheet class 'item' -- see the <style> section.
// 'greater-than' sign '>' represents a popout indicator
menu[1][0] = new Menu(true, '>', 0, 20, 250, defOver, defBack, 'itemBorder', 'itemText');
menu[1][1] = new Item('Avaya IP Office', 'Subsection.asp?SectionID=2&SubSectionID=4', '', defLength, 0, 0);
menu[1][2] = new Item('Avaya Communication Manager', 'Subsection.asp?SectionID=2&SubSectionID=5', '', defLength, 0, 0);
menu[1][3] = new Item('Cajun Networking', 'Subsection.asp?SectionID=2&SubSectionID=6', '', defLength, 0, 7); //NEEDS TO OPEN SUB MENU 7
// *** ROOT SUB MENU OPTION 2 *********************************
// *** Services ***
menu[2] = new Array();
menu[2][0] = new Menu(true, '>', 0, 20, 136, defOver, defBack, 'itemBorder', 'itemText');
menu[2][1] = new Item('Consultancy', 'Subsection.asp?SectionID=3&SubSectionID=17', '', defLength, 0, 0);
menu[2][2] = new Item('Finance Options', 'Subsection.asp?SectionID=3&SubSectionID=9', '', defLength, 0, 8);
// End -->
-----------------------------------------------------------
I have created a basic drop down expanding menu. My code is at the bottom which can be seen if you copy and paste it into notepad. At the moment I have created the main menu options as images. My question is is there a way for me to add the OnMouseOver event to the main menu (root menu) options so when the cursor moves over the image which represents the menu option it changes to another image temporarily? So far I have been unable to integrate the OnMouseOver event successfully into my code. Thank you very much for any help. Here is my code (please paste it into Notepad or another editor to make it more readable):
----------------------------------------------------------
<SCRIPT LANGUAGE="JavaScript">
<!-- Begin ***************************************************
var isDOM = (document.getElementById ? true : false);
var isIE4 = ((document.all && !isDOM) ? true : false);
var isNS4 = (document.layers ? true : false);
function getRef(id) {
if (isDOM) return document.getElementById(id);
if (isIE4) return document.all[id];
if (isNS4) return document.layers[id];
}
function getSty(id) {
return (isNS4 ? getRef(id) : getRef(id).style);
}
// Hide timeout.
var popTimer = 0;
// Array showing highlighted menu items.
var litNow = new Array();
function popOver(menuNum, itemNum) {
clearTimeout(popTimer);
hideAllBut(menuNum);
litNow = getTree(menuNum, itemNum);
changeCol(litNow, true);
targetNum = menu[menuNum][itemNum].target;
if (targetNum > 0) {
thisX = parseInt(menu[menuNum][0].ref.left) + parseInt(menu[menuNum][itemNum].ref.left);
thisY = parseInt(menu[menuNum][0].ref.top) + parseInt(menu[menuNum][itemNum].ref.top);
with (menu[targetNum][0].ref) {
left = parseInt(thisX + menu[targetNum][0].x);
top = parseInt(thisY + menu[targetNum][0].y);
visibility = 'visible';
}
}
}
function popOut(menuNum, itemNum) {
if ((menuNum == 0) && !menu[menuNum][itemNum].target)
hideAllBut(0)
else
popTimer = setTimeout('hideAllBut(0)', 500);
}
function getTree(menuNum, itemNum) {
// Array index is the menu number. The contents are null (if that menu is not a parent)
// or the item number in that menu that is an ancestor (to light it up).
itemArray = new Array(menu.length);
while(1) {
itemArray[menuNum] = itemNum;
if (menuNum == 0) return itemArray;
itemNum = menu[menuNum][0].parentItem;
menuNum = menu[menuNum][0].parentMenu;
}
}
// Pass an array and a boolean to specify colour change, true = over colour.
function changeCol(changeArray, isOver) {
for (menuCount = 0; menuCount < changeArray.length; menuCount++) {
if (changeArray[menuCount]) {
newCol = isOver ? menu[menuCount][0].overCol : menu[menuCount][0].backCol;
// Change the colours of the div/layer background.
with (menu[menuCount][changeArray[menuCount]].ref) {
if (isNS4) bgColor = newCol;
else backgroundColor = newCol;
}
}
}
}
function hideAllBut(menuNum) {
var keepMenus = getTree(menuNum, 1);
for (count = 0; count < menu.length; count++)
if (!keepMenus[count])
menu[count][0].ref.visibility = 'hidden';
changeCol(litNow, false);
}
// *** MENU CONSTRUCTION FUNCTIONS ***
function Menu(isVert, popInd, x, y, width, overCol, backCol, borderClass, textClass) {
// True or false - a vertical menu?
this.isVert = isVert;
// The popout indicator used (if any) for this menu.
this.popInd = popInd
// Position and size settings.
this.x = x;
this.y = y;
this.width = width;
// Colours of menu and items.
this.overCol = overCol;
this.backCol = backCol;
// The stylesheet class used for item borders and the text within items.
this.borderClass = borderClass;
this.textClass = textClass;
// Parent menu and item numbers, indexed later.
this.parentMenu = null;
this.parentItem = null;
// Reference to the object's style properties (set later).
this.ref = null;
}
function Item(text, href, frame, length, spacing, target) {
this.text = text;
this.href = href;
this.frame = frame;
this.length = length;
this.spacing = spacing;
this.target = target;
// Reference to the object's style properties (set later).
this.ref = null;
}
function writeMenus() {
if (!isDOM && !isIE4 && !isNS4) return;
for (currMenu = 0; currMenu < menu.length; currMenu++) with (menu[currMenu][0]) {
// Variable for holding HTML for items and positions of next item.
var str = '', itemX = 0, itemY = 0;
// items start from 1 in the array (0 is menu object itself, above).
// Also use properties of each item nested in the other with() for construction.
for (currItem = 1; currItem < menu[currMenu].length; currItem++) with (menu[currMenu][currItem]) {
var itemID = 'menu' + currMenu + 'item' + currItem;
// The width and height of the menu item - dependent on orientation!
var w = (isVert ? width : length);
var h = (isVert ? length : width);
// Create a div or layer text string with appropriate styles/properties.
if (isDOM || isIE4) {
str += '<div id="' + itemID + '" style="position: absolute; left: ' + itemX + '; top: ' + itemY + '; width: ' + w + '; height: ' + h + '; visibility: inherit; ';
if (backCol) str += 'background: ' + backCol + '; ';
str += '" ';
}
if (isNS4) {
str += '<layer id="' + itemID + '" left="' + itemX + '" top="' + itemY + '" width="' + w + '" height="' + h + '" visibility="inherit" ';
if (backCol) str += 'bgcolor="' + backCol + '" ';
}
if (borderClass) str += 'class="' + borderClass + '" ';
// Add mouseover handlers and finish div/layer.
str += 'onMouseOver="popOver(' + currMenu + ',' + currItem + ')" onMouseOut="popOut(' + currMenu + ',' + currItem + ')">';
// Add contents of item (default: table with link inside).
// If a target frame is specified, also add that to the <a> tag.
str += '<table width="' + (w - 8) + '" border="0" cellspacing="0" cellpadding="' + (!isNS4 && borderClass ? 3 : 0) + '"><tr><td align="left" height="' + (h - 7) + '">' + '<a class="' + textClass + '" href="' + href + '"' + (frame ? ' target="' + frame + '">' : '>') + text + '</a></td>';
if (target > 0) {
// Set target's parents to this menu item.
menu[target][0].parentMenu = currMenu;
menu[target][0].parentItem = currItem;
// Add a popout indicator.
if (popInd) str += '<td class="' + textClass + '" align="right">' + popInd + '</td>';
}
str += '</tr></table>' + (isNS4 ? '</layer>' : '</div>');
if (isVert) itemY += length + spacing;
else itemX += length + spacing;
}
if (isDOM) {
var newDiv = document.createElement('div');
document.getElementsByTagName('body').item(0).appendChild(newDiv);
newDiv.innerHTML = str;
ref = newDiv.style;
ref.position = 'absolute';
ref.visibility = 'hidden';
}
// Insert a div tag to the end of the BODY with menu HTML in place for IE4.
if (isIE4) {
document.body.insertAdjacentHTML('beforeEnd', '<div id="menu' + currMenu + 'div" ' + 'style="position: absolute; visibility: hidden">' + str + '</div>');
ref = getSty('menu' + currMenu + 'div');
}
// In NS4, create a reference to a new layer and write the items to it.
if (isNS4) {
ref = new Layer(0);
ref.document.write(str);
ref.document.close();
}
for (currItem = 1; currItem < menu[currMenu].length; currItem++) {
itemName = 'menu' + currMenu + 'item' + currItem;
if (isDOM || isIE4) menu[currMenu][currItem].ref = getSty(itemName);
if (isNS4) menu[currMenu][currItem].ref = ref.document[itemName];
}
}
with(menu[0][0]) {
ref.left = x;
ref.top = y;
ref.visibility = 'visible';
}
}
//***************************************************************
//*********************************** THE MENUS *****************
//GENERAL INFO
// menu[menuNumber][0] = new Menu(Vertical menu? (true/false), 'popout indicator', left, top,
// width, 'mouseover colour', 'background colour', 'border stylesheet', 'text stylesheet');
//
// Left and Top are measured on-the-fly relative to the top-left corner of its trigger, or
// for the root menu, the top-left corner of the page.
//
// menu[menuNumber][itemNumber] = new Item('Text', 'URL', 'target frame', length of menu item,
// additional spacing to next menu item, number of target menu to popout);
//
// If no target menu (popout) is desired, it is set to 0. Because site does not use
// frames, pass an empty string as a frame target.
//
// Most menus below are 'true', that is they are vertical, except for the first root menu.
// The 'length' and 'width' of an item depends on its orientation -- length is how long
// the item runs for in the direction of the menu, and width is the lateral dimension of the menu.
var menu = new Array();
// SUB MENU COLOURS *******************************************
//(defOver is colour if mouse is moved over sub menu option, defBack is normal colour)
//F984BB is lighter pink than standard pink ff66cc as used in logo
//3b92f3 is standard light blue as used in logo
var defOver = '#ff66cc', defBack = '#3b92f3';
// Default 'length' of menu items - item height if menu is vertical, width if horizontal.
var defLength = 22;
// Menu 0 is the 'root' menu from which everything else arises.
menu[0] = new Array();
// *** ROOT MENU **********************************************
//it's positioned at (0, 83) and is 16px thick now. 0 means from the left, 83 means from the top
menu[0][0] = new Menu(false, '', 0, 83, 16, defOver, defBack, '', 'crazyText');
// NB the targets are all set to nonzero values...
// The 'length' is represented by the third number from the right, and there is spacing of 5 to the next item.
menu[0][1] = new Item('<img src=images_navigation/welcome.gif border=0>', 'home.html', '', 79, 0, 0); //no sub menu
menu[0][2] = new Item('<img src=images_navigation/products.gif border=0>', 'section.asp?SectionID=2', '', 80, 0, 1);//has a sub menu id 1
menu[0][3] = new Item('<img src=images_navigation/services.gif border=0>', 'section.asp?SectionID=3', '', 75, 0, 2);//has a sub menu id 2
//*************************************************************
// *** ROOT SUB MENU OPTION ONE *******************************
// *** Products ***
menu[1] = new Array();
// The Home menu is positioned 0px across and 19 down from its trigger, and is 250 wide.
// All text in this menu has the stylesheet class 'item' -- see the <style> section.
// 'greater-than' sign '>' represents a popout indicator
menu[1][0] = new Menu(true, '>', 0, 20, 250, defOver, defBack, 'itemBorder', 'itemText');
menu[1][1] = new Item('Avaya IP Office', 'Subsection.asp?SectionID=2&SubSectionID=4', '', defLength, 0, 0);
menu[1][2] = new Item('Avaya Communication Manager', 'Subsection.asp?SectionID=2&SubSectionID=5', '', defLength, 0, 0);
menu[1][3] = new Item('Cajun Networking', 'Subsection.asp?SectionID=2&SubSectionID=6', '', defLength, 0, 7); //NEEDS TO OPEN SUB MENU 7
// *** ROOT SUB MENU OPTION 2 *********************************
// *** Services ***
menu[2] = new Array();
menu[2][0] = new Menu(true, '>', 0, 20, 136, defOver, defBack, 'itemBorder', 'itemText');
menu[2][1] = new Item('Consultancy', 'Subsection.asp?SectionID=3&SubSectionID=17', '', defLength, 0, 0);
menu[2][2] = new Item('Finance Options', 'Subsection.asp?SectionID=3&SubSectionID=9', '', defLength, 0, 8);
// End -->
-----------------------------------------------------------