Jeegoocontext, a jQuery context menu plugin
Jeegoocontext is a jQuery plugin that allows for multiple custom context menus (pop-up menus) to exist on a single page. The plugin is able to transform any unordered list appended to the body into a multi-level, intelligently positioned styled context menu via a single call.
Features:
Easy to implement
Steps required to implement the plugin:
- Include references to the jquery library, and to jquery.jeegoocontext.min.js.
- Select a skin (skins cm_default and cm_blue included in the code-download) and include a reference to the skin's stylesheet.
- Append an unordered list to the body and give it a unique id and the following class name: "jeegoocontext" and the class name for the skin: "cm_default" or "cm_blue" for example.
- Bind any context to the menu with the following call: $('context').jeegoocontext('menu id'); Where 'context' can be any jQuery selector and 'menu id' contains the unique id of the menu, for example: $('.context').jeegoocontext('menu_1');
Both vertical and horizontal intelligent positioning
Normally the context menu opens exactly at the clicked position. However, when opened at the near edges of a webpage, the menu and subsequent submenus are offset to the left/top to avoid overflow to the right/bottom.
Overflow behavior can be customized by adjusting the widthOverflowOffset and heightOverflowOffset properties on the options object.
Customizable time delays to provide easy selection of items
The delay property on the options object provides time-out values to the menu to allow for easy selection of submenu items. Without these delays expanded submenus collapse immediately after a user moves his/her mouse to another list-item, which can be very annoying. The following animations illustrate these conditions:

No delays

Delays
Multiple context menus on a single page
Each page can contain multiple context menus. All that is required is that each menu contains a unique id and they all share the "jeegoocontext" class (overridable via the options.menuClass property).
Fully css customizable UI
The plugin contains very little presentation script, so the UI can be fully styled via css. The code-download includes a skins folder containing two skins named: "cm_default" and "cm_blue". These skins consist of nothing more than an images folder and a stylesheet.
Customizable behavior via callbacks
The plugin publishes the following four useful events to provide customizable behavior:
- onShow
- onHover
- onSelect
- onHide
From within each of these callbacks default behavior can be cancelled by returning false.
Customizable class names to avoid potential naming conflicts
The plugin uses the following class names:
- active
- hover
- jeegoocontext
- submenu
- separator
All class names are overridable to avoid potential naming conflicts.
Opera compatible
Opera doesn't allow right-click event overrides. When the plugin detects Opera it automatically binds the menu to the doubleclick event. The event-type can be overriden via the operaEvent property on the options object.
Cross-browser support
The plugin was tested in the following browsers: Opera 10, Safari 4, Chrome 3, Firefox 3, Internet Explorer 6, 7 & 8. Although compatible with all these browsers, it is not recommended to use the styled skin in IE 6 due to some (possible) weird caching bug. For some reasen IE 6 decides to re-download all images used in the menu on every mouseover.
Keyboard support
The escape key closes the menu. The enter key selects a menu-item. The arrow keys can be used to move between different menu-items and submenus. Both the up and down arrow keys can be hold down to loop through the menu-items.
Lightweight
The minified version of the script is just under 6 kb in size.
Unobtrusive
No changes to the page html are required except for appending the context menu to the body.
Suggestions? We would like to hear about your experiences with the JeeGoo context menu.
E-mail is not required
ok, so it is exactly 5px down and right.
My super-crude hack below (line 250-251) makes it work. I'm sure something in our site css is affecting it. Firebug isn't showing anything meaningful.
$menu.css({
'left': e.pageX - 5 + 'px',
'top': e.pageY - 5 + 'px' }).fadeIn(_menus[id].fadeIn);
So, I'll stick with this for now.
Thanks!
@Peter, thanks, the plugin is working fine even when I have prototype. my mistake. Thanks!
Only problem I'm having is that when I right click, unless I hold down the right mouse button until the mouse is *over* the menu, it will disappear. Once I have moused over the menu, then it will stay regardless of whether I've move the mouse off the menu. Weird. Also, the menu is popping up maybe 5-10px down and right of the tip of the mouse, but in your demos, it opens exactly at the tip of the mouse. Not sure why that is happening.
@Nick, the ESC key closes the menu for me using standard setup (no default changes or callbacks).
Would you consider moving this project to github and maybe adding a google group for users to discuss this? I think you will find more patches and more and happier users.
This is a great plugin!
Thanks,
John
I would like to have the Escape key close the menu just like normal Windows UI. I'm sure I can use the onShow callback, but it should probably be a built-in function.
@MikeS, use the onshow callback to hide you elements. You can select your elements using jQuery and hide them.
@pay, include the jquery library and the contextmenu script. You can use jQuery to make decisions or use your Zk framework.
How would I go about making a menu option appear disabled?
do you know ? how to make contextmenu in jquery and Intergret to Zk ?
@John. Wrapping the code with (function($) { })(jQuery);. No need to use jQuery.noConflict for this plugin. The $ name is
scoped to refer to the jQuery object.
Hi, I like this plugin, but I want to use it in an application that also uses prototype (for awhile until fully transitioned to jQuery), so I need to use jQuery.noConflict(); which means all the $ commands need to change to jQuery. This is standard for common jQuery plugins, so I'd recommend changing this.
Thanks!
John