Bootstrap 3.0 Context Menu
HTML
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.min.css">
<table id="myTable" class="table table-hover">
<thead>
<tr>
<th>#</th>
<th>First Name</th>
<th>Last Name</th>
<th>Username</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Mark</td>
<td>Otto</td>
<td class="username">@mdo</td>
</tr>
<tr>
<td>2</td>
<td>Jacob</td>
<td>Thornton</td>
<td class="username">@fat</td>
</tr>
<tr>
<td>3</td>
<td>Larry</td>
<td>the Bird</td>
<td class="username">@twitter</td>
</tr>
</tbody>
</table>
<ul id="contextMenu" class="dropdown-menu" role="menu" style="display:none" >
<li><a tabindex="-1" href="#" value="menu1:action-1">Action</a></li>
<li><a tabindex="-1" href="#" value="menu1:action-2">Another action</a></li>
<li><a tabindex="-1" href="#" value="menu1:action-3">Something else here</a></li>
<li class="divider"></li>
<li><a tabindex="-1" href="#" value="action-4">Separated link</a></li>
</ul>
<ul id="contextMenuUsername" class="dropdown-menu" role="menu" style="display:none" >
<li><a tabindex="-1" href="#" value="menu2:action-1">User action</a></li>
<li><a tabindex="-1" href="#" value="menu2:action-2">Another user action</a></li>
</ul>
<!-- Post Info -->
<div style='position:fixed;bottom:0;left:0;
background:lightgray;width:100%;'>
About this SO Question: <a href='http://stackoverflow.com/q/18666601/1366033'>Use Bootstrap 3 dropdown menu as context menu</a><br/>
<div>
JavaScript
(function ($, window) {
var menus = {};
$.fn.contextMenu = function (settings) {
var $menu = $(settings.menuSelector);
$menu.data("menuSelector", settings.menuSelector);
if ($menu.length === 0) return;
menus[settings.menuSelector] = {$menu: $menu, settings: settings};
//make sure menu closes on any click
$(document).click(function (e) {
hideAll();
});
$(document).on("contextmenu", function (e) {
var $ul = $(e.target).closest("ul");
if ($ul.length === 0 || !$ul.data("menuSelector")) {
hideAll();
}
});
// Open context menu
(function(element, menuSelector){
element.on("contextmenu", function (e) {
// return native menu if pressing control
if (e.ctrlKey) return;
hideAll();
var menu = getMenu(menuSelector);
//open menu
menu.$menu
.data("invokedOn", $(e.target))
.show()
.css({
position: "absolute",
left: getMenuPosition(e.clientX, 'width', 'scrollLeft'),
top: getMenuPosition(e.clientY, 'height', 'scrollTop')
})
.off('click')
.on('click', 'a', function (e) {
menu.$menu.hide();
var $invokedOn = menu.$menu.data("invokedOn");
var $selectedMenu = $(e.target);
callOnMenuHide(menu);
menu.settings.menuSelected.call(this, $invokedOn, $selectedMenu);
});
callOnMenuShow(menu);
return false;
});
})($(this), settings.menuSelector);
function getMenu(menuSelector) {
...