Making custom right-click context menus for my web-app Making custom right-click context menus for my web-app javascript javascript

Making custom right-click context menus for my web-app


I know this question is very old, but just came up with the same problem and solved it myself, so I'm answering in case anyone finds this through google as I did. I based my solution on @Andrew's one, but basically modified everything afterwards.

EDIT: seeing how popular this has been lately, I decided to update also the styles to make it look more like 2014 and less like windows 95. I fixed the bugs @Quantico and @Trengot spotted so now it's a more solid answer.

EDIT 2: I set it up with StackSnippets as they're a really cool new feature. I leave the good jsfiddle here for reference thought (click on the 4th panel to see them work).

New Stack Snippet:

// JAVASCRIPT (jQuery)// Trigger action when the contexmenu is about to be shown$(document).bind("contextmenu", function (event) {        // Avoid the real one    event.preventDefault();        // Show contextmenu    $(".custom-menu").finish().toggle(100).        // In the right position (the mouse)    css({        top: event.pageY + "px",        left: event.pageX + "px"    });});// If the document is clicked somewhere$(document).bind("mousedown", function (e) {        // If the clicked element is not the menu    if (!$(e.target).parents(".custom-menu").length > 0) {                // Hide it        $(".custom-menu").hide(100);    }});// If the menu element is clicked$(".custom-menu li").click(function(){        // This is the triggered action name    switch($(this).attr("data-action")) {                // A case for each action. Your actions here        case "first": alert("first"); break;        case "second": alert("second"); break;        case "third": alert("third"); break;    }      // Hide it AFTER the action was triggered    $(".custom-menu").hide(100);  });
/* CSS3 *//* The whole thing */.custom-menu {    display: none;    z-index: 1000;    position: absolute;    overflow: hidden;    border: 1px solid #CCC;    white-space: nowrap;    font-family: sans-serif;    background: #FFF;    color: #333;    border-radius: 5px;    padding: 0;}/* Each of the items in the list */.custom-menu li {    padding: 8px 12px;    cursor: pointer;    list-style-type: none;    transition: all .3s ease;    user-select: none;}.custom-menu li:hover {    background-color: #DEF;}
<!-- HTML --><script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.js"></script><ul class='custom-menu'>  <li data-action="first">First thing</li>  <li data-action="second">Second thing</li>  <li data-action="third">Third thing</li></ul><!-- Not needed, only for making it clickable on StackOverflow -->Right click me