Mega Code Archive

 
Categories / JavaScript DHTML / GUI Components
 

Custom Contextual Menu(content sensitive)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"    "http://www.w3.org/tr/xhtml1/DTD/xhtml1-transitional.dtd"> <!--       Example File From "JavaScript and DHTML Cookbook"      Published by O'Reilly & Associates      Copyright 2003 Danny Goodman --> <html> <head> <title>Recipe 10.7</title> <style rel="stylesheet" id="mainStyle" type="text/css"> html {background-color:#cccccc} body {background-color:#eeeeee; font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:12px;     margin-left:15%; margin-right:15%; border:3px groove darkred; padding:15px} h1 {text-align:right; font-size:1.5em; font-weight:bold} h2 {text-align:left; font-size:1.1em; font-weight:bold; text-decoration:underline} .buttons {margin-top:10px} </style> <style type="text/css"> .contextMenus {position:absolute; background-color:#cfcfcf;                border-style:solid; border-width:1px;                border-color:#EFEFEF #505050 #505050 #EFEFEF;                visibility:hidden} .menuItem {cursor:pointer; font-size:9pt;             font-family:Arial, Helvetica, sans-serif;             padding-left:5px; color:black;             background-color:transparent;             text-decoration:none} .menuItemOn {cursor:pointer; font-size:9pt;               font-family:Arial, Helvetica, sans-serif;               padding-left:5px; color:red;               background-color:yellow;               text-decoration:underline} .contextEntry {font-weight:bold; color:darkred; cursor:pointer} </style> <script type="text/javascript"> // context menu data objects var cMenu = new Object(); cMenu["lookup1"] = {menuID:"contextMenu1", hrefs:["http://www.m-w.com/cgi-bin/dictionary?book=Dictionary&va=sesquipedalian","http://www.m-w.com/cgi-bin/dictionary?book=Thesaurus&va=sesquipedalian"]}; cMenu["lookup2"] = {menuID:"contextMenu2", hrefs:["http://www.wyomingtourism.org/","http://www.pbs.org/weta/thewest/places/states/wyoming/","http://cnn.looksmart.com/r_search?l&izch&pin=020821x36b42f8a561537f36a1&qc=&col=cnni&qm=0&st=1&nh=10&rf=1&venue=all&keyword=&qp=&search=0&key=wyoming","http://google.com","http://search.yahoo.com"]}; // position and display context menu function showContextMenu(evt) {     // hide any existing menu just in case     hideContextMenus();     evt = (evt) ? evt : ((event) ? event : null);     if (evt) {         var elem = (evt.target) ? evt.target : evt.srcElement;          if (elem.nodeType == 3) {             elem = elem.parentNode;         }         if (elem.className == "contextEntry") {             var menu = document.getElementById(cMenu[elem.id].menuID);             // turn on IE mouse capture             if (menu.setCapture) {                 menu.setCapture();             }             // position menu at mouse event location             var left, top;             if (evt.pageX) {                 left = evt.pageX;                 top = evt.pageY;             } else if (evt.offsetX || evt.offsetY) {                 left = evt.offsetX;                 top = evt.offsetY;             } else if (evt.clientX) {                 left = evt.clientX;                 top = evt.clientY;             }             menu.style.left = left + "px";             menu.style.top = top + "px";             menu.style.visibility = "visible";             if (evt.preventDefault) {                 evt.preventDefault();             }             evt.returnValue = false;         }     } } // retrieve URL from cMenu object related to chosen item function getHref(tdElem) {     var div = tdElem.parentNode.parentNode.parentNode.parentNode;     var index = tdElem.parentNode.rowIndex;     for (var i in cMenu) {         if (cMenu[i].menuID == div.id) {             return cMenu[i].hrefs[index];             }     }     return ""; } // navigate to chosen menu item function execMenu(evt) {     evt = (evt) ? evt : ((event) ? event : null);     if (evt) {         var elem = (evt.target) ? evt.target : evt.srcElement;         if (elem.nodeType == 3) {             elem = elem.parentNode;         }         if (elem.className == "menuItemOn") {             location.href = getHref(elem);         }         hideContextMenus();     } } // hide all context menus function hideContextMenus() {     if (document.releaseCapture) {         // turn off IE mouse event capture         document.releaseCapture();     }     for (var i in cMenu) {         var div = document.getElementById(cMenu[i].menuID)         div.style.visibility = "hidden";     } } // rollover highlights of context menu items function toggleHighlight(evt) {     evt = (evt) ? evt : ((event) ? event : null);     if (evt) {         var elem = (evt.target) ? evt.target : evt.srcElement;         if (elem.nodeType == 3) {             elem = elem.parentNode;         }         if (elem.className.indexOf("menuItem") != -1) {             elem.className = (evt.type == "mouseover") ? "menuItemOn" : "menuItem";         }     } } // set tooltips for menu-capable and lesser browsers function setContextTitles() {     var cMenuReady = (document.body.addEventListener || typeof document.oncontextmenu != "undefined")     var spans = document.body.getElementsByTagName("span");     for (var i = 0; i < spans.length; i++) {         if (spans[i].className == "contextEntry") {             if (cMenuReady) {                 var menuAction = (navigator.userAgent.indexOf("Mac") != -1) ? "Click and hold " : "Right click ";                 spans[i].title = menuAction + "to view relevant links"             } else {                 spans[i].title = "Relevant links available with other browsers (IE5+/Windows, Netscape 6+)."                 spans[i].style.cursor = "default";             }         }     } } // bind events and initialize tooltips function initContextMenus() {     if (document.body.addEventListener) {         // W3C DOM event model         document.body.addEventListener("contextmenu", showContextMenu, true);         document.body.addEventListener("click", hideContextMenus, true);     } else {         // IE event model         document.body.oncontextmenu = showContextMenu;     }     // set intelligent tooltips     setContextTitles(); } </script> </head> <body onload="initContextMenus()"> <h1>Custom Contextual Menu</h1> <hr />  <p>This sentence has at least one <span id="lookup1" class="contextEntry">sesquipedalian</span> word and mention of the state of <span id="lookup2" class="contextEntry">Wyoming</span>, both of which could have additional lookups.</p> <div id="contextMenu1" class="contextMenus" onclick="hideContextMenus()" onmouseup="execMenu(event)" onmouseover="toggleHighlight(event)" onmouseout="toggleHighlight(event)"> <table><tbody> <tr><td class="menuItem">Merriam-Webster Dictionary</td></tr> <tr><td class="menuItem">Merriam-Webster Thesaurus</td></tr> </tbody></table> </div> <div id="contextMenu2" class="contextMenus" onclick="hideContextMenus()" onmouseup="execMenu(event)" onmouseover="toggleHighlight(event)" onmouseout="toggleHighlight(event)"> <table><tbody> <tr><td class="menuItem">Wyoming Tourist Info</td></tr> <tr><td class="menuItem">State Map</td></tr> <tr><td class="menuItem">cnn.com</td></tr> <tr><td class="menuItem">Google</td></tr> <tr><td class="menuItem">Yahoo Search</td></tr> </tbody></table> </div> </body> </html>