The context menu on the nested child also shows the parent context menu

I have several DOM elements with context menus. When one element is a child of another, and I call the context menu of the inner child, I also see the context menu from the parent. This is implemented using the jquery-ui.contextmenu plugin .

Is there a way to configure the plugin to prevent the parent menu from appearing, or will I have to process all click events manually and filter them, so I only show the menu that I want?

Below is my code:

HTML:

<!-- Add a child which will have a context menu --> <div class="outer-child" id="outer-child"> Outer Child <!-- inner child with its own context menu --> <div class="inner-child" id="inner-child"> Inner Child </div> </div> </div> 

CSS

 .outer-child { position: absolute; top: 0px; left: 0px; width: 200px; height: 200px; border: 1px solid red; background: green; } .inner-child { position: absolute; top: 50px; left: 50px; width: 100px; height: 100px; border: 1px solid blue; background: yellow; } 

JavaScript:

 // create context menu on outer child $("#outer-child").contextmenu({ menu: [ {title: "This is the Outer Menu", cmd: "outer-menu"} ], select: function(event, ui) { alert("select " + ui.cmd + " on " + ui.target.text()); } }); // create context menu on inner child $('#inner-child').contextmenu({ menu: [ {title: "Inner Menu", cmd: "inner-menu"} ], select: function(event, ui) { alert("select " + ui.cmd + " on " + ui.target.text()); } }); 

Here you can find jsfiddle demo here . (Right-click the internal field and select both context menus)

+5
source share
1 answer

You can fix this problem by calling the event.stopPropagation() method in the event.stopPropagation() event of the child.

 // create context menu on outer child $("#outer-child").contextmenu({ menu: [{ title: "This is the Outer Menu", cmd: "outer-menu" }], select: function(event, ui) { alert("select " + ui.cmd + " on " + ui.target.text()); }, }); // create context menu on inner child $('#inner-child').contextmenu({ beforeOpen: function(event, ui) { event.stopPropagation(); }, menu: [{ title: "Inner Menu", cmd: "inner-menu" }], select: function(event, ui) { alert("select " + ui.cmd + " on " + ui.target.text()); } }); 
 .outer-child { position: absolute; top: 0px; left: 0px; width: 200px; height: 200px; border: 1px solid red; background: green; } .inner-child { position: absolute; top: 50px; left: 50px; width: 100px; height: 100px; border: 1px solid blue; background: yellow; } 
 <link href="http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" rel="stylesheet" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script> <script src="http://wwwendt.de/tech/demo/jquery-contextmenu/jquery.ui-contextmenu.js"></script> <!-- Create an area to contain our editable components --> <div class="container" id="container"> <!-- Add a child which will have a context menu --> <div class="outer-child" id="outer-child">Outer Child <!-- inner child with its own context menu --> <div class="inner-child" id="inner-child">Inner Child</div> </div> </div> 
+5
source

Source: https://habr.com/ru/post/1205375/


All Articles