forked from arnklint/jquery-contextMenu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
jquery.contextMenu.js
73 lines (63 loc) · 2.33 KB
/
jquery.contextMenu.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**
* jQuery.contextMenu - Show a custom context when right clicking something
* Jonas Arnklint, http://github.com/arnklint/jquery-contextMenu
* Released into the public domain
* Date: Jan 14, 2011
* @author Jonas Arnklint
* @version 1.3
*
*/
// Making a local '$' alias of jQuery to support jQuery.noConflict
(function($) {
jQuery.fn.contextMenu = function ( name, actions, options ) {
var me = this,
menu = $('<ul id="'+name+'" class="context-menu"></ul>').hide().appendTo('body'),
active_element = null, // last clicked element that responds with contextMenu
hide_menu = function() {
$('.context-menu').each(function() {
$(this).trigger("closed");
$(this).hide();
});
$('body').unbind('click', hide_menu);
},
default_options = {
disable_native_context_menu: false // disables the native contextmenu everywhere you click
},
options = $.extend(default_options, options);
$(document).bind('contextmenu', function(e) {
if (options.disable_native_context_menu)
e.preventDefault();
hide_menu();
});
$.each(actions, function(me, item_options) {
var menuItem = $('<li><a href="#">'+me+'</a></li>');
if (item_options.klass)
menuItem.attr("class", item_options.klass);
menuItem.appendTo(menu).bind('click', function(e) {
item_options.click(active_element);
e.preventDefault();
});
});
return me.bind('contextmenu', function(e){
// Hide any existing context menus
hide_menu();
active_element = $(this); // set clicked element
if (options.showMenu) {
options.showMenu.call(menu, active_element);
}
// Bind to the closed event if there is a hideMenu handler specified
if (options.hideMenu) {
menu.bind("closed", function() {
options.hideMenu.call(menu, active_element);
});
}
menu.show(0, function() { $('body').bind('click', hide_menu); }).css({
position: 'absolute',
top: e.pageY,
left: e.pageX,
zIndex: 1000
});
return false;
});
}
})(jQuery);