Sometimes it is required to show a custom context menu instead of the browser default one when right-clicking on the webpage or on a specific element.
By doing that it is possible to show a context menu according to the element and disable the default menu where necessary.
It is customizable according to the website design.
For implementing this I am using jQuery in this tutorial.
When right-clicking on the element then disable the browser default context menu and display the custom options.
Contents
1. HTML
Create some <h2>
elements. To display context menu create <div class='context-menu'>
.
Where list color options in <ul>
element.
With jQuery I popup this <div>
when right-click on the <h2>
element.
Also, create a hidden element to track the <h2>
element when right clicked and perform the action on it.
Completed Code
<div class="container"> <!-- Titles --> <h2 id='post_1'>Dynamically add and remove element with jQuery</h2> <h2 id='post_2'>How to Delete a value from an Array in JavaScript</h2> <h2 id='post_3'>Read and Get Parameters from URL with JavaScript</h2> <h2 id='post_4'>HTML - How to Show Text Above Image on Hover</h2> <!-- Context-menu --> <div class='context-menu'> <ul> <li><span class='Gainsboro'></span> <span>Gainsboro </span></li> <li><span class='Orange'></span> <span>Orange</span></li> <li><span class='Plum'></span> <span>Plum</span></li> </ul> </div> <input type='hidden' value='' id='txt_id'> </div>
2. CSS
I set the .context-menu
class position: absolute;
and display: none;
for hiding the menu first time.
Completed Code
.container{ border-radius:3px; padding:5px; width: 60%; margin: 0 auto; } h2{ font-weight: normal; font-size: 25px; } h2:hover{ cursor: pointer; } /* Context menu */ .context-menu{ display: none; position: absolute; border: 1px solid black; border-radius: 3px; width: 200px; background: white; box-shadow: 10px 10px 5px #888888; } .context-menu ul{ list-style: none; padding: 2px; } .context-menu ul li{ padding: 5px 2px; margin-bottom: 3px; color: white; font-weight: bold; background-color: darkturquoise; } .context-menu ul li:hover{ cursor: pointer; background-color: #7fffd4; } /* Colors */ .Gainsboro ,.Orange ,.Plum { width:15px; height:15px; border: 0px solid black; display: inline-block; margin-right: 5px; } .Gainsboro { background-color: Gainsboro ; } .Orange { background-color: Orange ; } .Plum { background-color: Plum ; }
3. jQuery
Enabling custom context-menu on <h2>
I am showing context-menu on <h2>
right-click for this I bind contextmenu event on <h2>
. Here, storing the id in the hidden field $("#txt_id").val(id)
, this value is been used when a custom menu list item gets clicked.
Position menu on the clicked area and displaying it.
// disable right click and show custom context menu $("h2").bind('contextmenu', function (e) { var id = this.id; $("#txt_id").val(id); var top = e.pageY+5; var left = e.pageX; // Show contextmenu $(".context-menu").toggle(100).css({ top: top + "px", left: left + "px" }); // disable default context menu return false; });
Hide context menu when to click or right-click outside
Bind contextmenu and click event on the document to hide the custom menu and remove the hidden field id.
$(document).bind('contextmenu click',function(){ $(".context-menu").hide(); $("#txt_id").val(""); });
Disable default menu from custom context menu
// disable context-menu from custom menu $('.context-menu').bind('contextmenu',function(){ return false; });
Perform action on the list item
Finding the class name of the first <span >
element on the clicked list item and using this class name to add the background color on the id stored in the hidden field.
// Clicked context-menu item $('.context-menu li').click(function(){ var className = $(this).find("span:nth-child(1)").attr("class"); var titleid = $('#txt_id').val(); $( "#"+ titleid ).css( "background-color", className ); $(".context-menu").hide(); });
Completed Code
$(document).ready(function(){ // disable right click and show custom context menu $("h2").bind('contextmenu', function (e) { var id = this.id; $("#txt_id").val(id); var top = e.pageY+5; var left = e.pageX; // Show contextmenu $(".context-menu").toggle(100).css({ top: top + "px", left: left + "px" }); // disable default context menu return false; }); // Hide context menu $(document).bind('contextmenu click',function(){ $(".context-menu").hide(); $("#txt_id").val(""); }); // disable context-menu from custom menu $('.context-menu').bind('contextmenu',function(){ return false; }); // Clicked context-menu item $('.context-menu li').click(function(){ var className = $(this).find("span:nth-child(1)").attr("class"); var titleid = $('#txt_id').val(); $( "#"+ titleid ).css( "background-color", className ); $(".context-menu").hide(); }); });
4. Demo
5. Conclusion
I hope the tutorial, helps you to implement a custom context menu on the selector element and add some actions.
If you found this tutorial helpful then don't forget to share.