Skip to content

jQuery plugin that turns a jQueryUI menu widget into a context menu.

Notifications You must be signed in to change notification settings

hosamshahin/jquery-ui-contextmenu

 
 

Repository files navigation

jquery.ui-contextmenu Build Status Selenium Test Status

A jQuery plugin that provides a context menu (based on the standard jQueryUI menu widget).

  • Define menus from <ul> element or definition list (i.e. [{title: "Paste", cmd: "paste"}, ...]).
  • Themable using jQuery ThemeRoller.
  • Supports delegation (i.e. can be bound to elements that don't exist at the time the context menu is initialized).
  • Exposes events from jQueryUI menu: blur, create, focus, select.
  • Optional support for touch devices.

Status

The latest release is available for download at The jQuery Plugin Registry.

See also the Change Log.

Browser status matrix:

Selenium Test Status

Demo

Live demo page.

Example

Say we have some HTML elements that we want to attach a popup menu to:

<div id="container">
    <div class="hasmenu">AAA</div>
    <div class="hasmenu">BBB</div>
    <div class="hasmenu">CCC</div>
</div>

now we can enable a context menu like so:

$("#container").contextmenu({
	delegate: ".hasmenu",
	menu: [
		{title: "Copy", cmd: "copy", uiIcon: "ui-icon-copy"},
		{title: "----"},
		{title: "More", children: [
			{title: "Sub 1", cmd: "sub1"},
			{title: "Sub 2", cmd: "sub1"}
			]}
		],
	select: function(event, ui) {
		alert("select " + ui.cmd + " on " + ui.target.text());
	}
});

Instead of handling all menu commands in the select event, it is also possible to attach callbacks directly to menu entries:

$(document).contextmenu({
    delegate: ".hasmenu",
    menu: [
        {title: "Copy", uiIcon: "ui-icon-copy", action: function(event, ui){
                alert("Copy " + ui.target.text());
             }
         },
        ...
});

To attach menus to all elements on the page that have class="hasmenu", we use document as context:

$(document).contextmenu({
    delegate: ".hasmenu",
    ...
});

Initialize menu from an existing <ul> element

In this case menu must point to the markup:

$(document).contextmenu({
    delegate: ".hasmenu",
    menu: "#options",
    select: function(event, ui) {
    	...
    }
});

We also have to provide some HTML markup that defines the context menu structure (see jQueryUI menu for details):

<ul id="options" class="ui-helper-hidden">
    <li><a href="#copy"><span class="ui-icon ui-icon-copy"></span>Copy</a>
    <li class="ui-state-disabled"><a href="#paste">Paste</a>
    <li>----
    <li><a>More</a>
        <ul>
            <li><a href="#sub1">Sub 1</a>
            <li><a href="#sub2">Sub 2</a>
        </ul>
</ul>

Modify the menu depending on the context

The menu can be modified before display in order to reflect the current context.

$(document).contextmenu({
    delegate: ".hasmenu",
    menu: [
        {title: "Cut", cmd: "cut", uiIcon: "ui-icon-scissors"},
        {title: "Copy", cmd: "copy", uiIcon: "ui-icon-copy"},
        {title: "Paste", cmd: "paste", uiIcon: "ui-icon-clipboard", disabled: true },
        ...
        ],
    beforeOpen: function(event, ui) {
        var $menu = ui.menu,
            $target = ui.target,
            extraData = ui.extraData; // optionally passed when menu was opened by call to open()

        // Optionally return false, to prevent opening the menu
//      return false;

        // En/disable single entries
        $(document).contextmenu("enableEntry", "paste", false);
        // Show/hide single entries
        $(document).contextmenu("showEntry", "cut", false);
        // Redefine the title of single entries
        $(document).contextmenu("setEntry", "copy", "Copy '" + $target.text() + "'")
        // Redefine all attributes of single entries
        $(document).contextmenu("setEntry", "cut", {title: "Cuty", uiIcon: "ui-icon-heart", disabled: true});
        // Redefine the whole menu
        $(document).contextmenu("replaceMenu", [{title: "aaa"}, {title: "bbb"}, ...]);
        // Redefine the whole menu from another HTML definition
        $(document).contextmenu("replaceMenu", "#options2");
    },
    ...
});

API documentation

Options

autoTrigger
Type: Boolean, default: true
Set `false` to prevent opening on a browser's `contextmenu` event, which is normally triggered by a mouse rightclick.
The menu can still be opened by calling the `open()` method.
delegate
Type: String
A selector to filter the elements that trigger the context menu.
hide
Type: Boolean | Number | String | Object, default: { effect: "fadeOut", duration: "fast"}
Effect applied when hiding the popup.
See sample for possible option values.
ignoreParentSelect
Type: Boolean, default: true
If true, a click on a menu item that contains a sub-menu, will not trigger the select event.
menu
Type: Object[] | String | jQuery
jQuery object or selector of HTML markup that defines the context menu structure (see jQueryUI menu for details).
If an array of objects is passed, it will be used to generate
such markup on the fly.
position
Type: Object | Function,
default: {my: "left top", at: "center", of: event, collision: "fit"}
Define position where popup opens. A simple position may be passed.
Also a function may be specified, to recalculate position every time:
    $("#container").contextmenu({
        position: function(event, ui){
            return {my: "left top", at: "left bottom", of: ui.target};
        }, ...
preventContextMenuForPopup
Type: Boolean, default: false
Prevent that a right click inside an open popup menu will open the browser's system context menu.
preventSelect
Type: Boolean, default: false
Prevent accidental text selection of potential menu targets on doubleclick or drag.
show
Type: Boolean | Number | String | Object, default: { effect: "slideDown", duration: "fast"}
Effect applied when showing the popup.
See sample for possible option values.
taphold
Type: Boolean, default: false
Open menu on taphold events, which is especially useful for touch devices (but may require external plugins to generate taphold events).

Methods

close()
Close context menu if open.
Call like $(...).contextmenu("close");.
enableEntry(cmd, flag)
Enable or disable the entry. `flag` defaults to `true`
Call like $(...).contextmenu("enableEntry", "paste", false);.
getMenu()
Return the jQuery object for the menu's UL element.
isOpen()
Return true if popup is visible.
open(target[, extraData])
Open context menu on a specific target (target must match the options.delegate filter).
Call like $(...).contextmenu("open", target[, extraData]);. Optional `extraData` will be available in event handlers as ui.extraData.
replaceMenu(menu)
Replace the whole menu definition.
Call like $(...).contextmenu("replaceMenu", "#menu2");.
setEntry(cmd, data)
Redefine menu entry (title or all of it).
`data` may be a title string or a menu definition object.
Call like $(...).contextmenu("setEntry", "paste", "Paste link");.
showEntry(cmd, flag)
Show or hide the entry. `flag` defaults to `true`
Call like $(...).contextmenu("showEntry", "paste", false);.

Events

jquery-contextmenu exposes events from jQueryUI menu: blur, create, focus, select. However, since the event.target parameter contains the menu item, we additionally pass the element that was right-clicked in ui.target.

Events may be handled by passing a handler callback option:

$("#container").contextmenu({
    [...]
    select: function(event, ui) {
        alert("select " + ui.cmd + " on " + ui.target.text());
    }
});

Alternatively a handler may be bound, so this is equivalent:

$("#container").bind("contextmenuselect", function(event, ui) {
    alert("select " + ui.cmd + " on " + ui.target.text());
}
beforeOpen(event, ui)
Triggered just before the popup menu is opened.
Return false to prevent opening.
This is also a good place to modify the menu (i.e. hiding, disabling, or renaming entries, or replace the menu altogether).
blur(event, ui)
Triggered when the menu loses focus (original jQuery UI Menu event).
close(event)
Triggered when the menu is closed.
create(event, ui)
Triggered when the contextmenu widget is created.
createMenu(event, ui)
Triggered when the popup menu is created (original jQuery UI Menu `create` event).
focus(event, ui)
Triggered when a menu gains focus or when any menu item is activated (original jQuery UI Menu event).
open(event)
Triggered when the menu is opened.
select(event, ui)
Triggered when a menu item is selected.
ui.cmd contains thecommand id. Return false to prevent closing the menu.

Credits

Contributors in order of appearance:


Bitdeli Badge

About

jQuery plugin that turns a jQueryUI menu widget into a context menu.

Resources

Stars

Watchers

Forks

Packages

No packages published