Как добавить пользовательское меню на веб-страницу?
Я хочу добавить пользовательское меню правой кнопкой мыши в мое веб-приложение. Можно ли это сделать без использования каких-либо готовых библиотек? Если да, то как отобразить простое пользовательское меню правой кнопкой мыши, которое не использует стороннюю библиотеку JavaScript?
Я стремлюсь к чему-то вроде того, что делает Google Docs. Это позволяет пользователям щелкнуть правой кнопкой мыши и показать пользователям их собственное меню.
Примечание:
Я хочу узнать, как сделать свой собственный против использования чего-то, что кто-то сделал уже с самого начала в то время эти сторонние библиотеки раздуты функциями, тогда как я хочу только те функции, которые мне нужны, поэтому я хочу, чтобы они были полностью сделаны вручную мной.
18 ответов:
отвечая на ваш вопрос - используйте
contextmenuсобытие, как показано ниже:<html> <head> <script type="text/javascript"> if (document.addEventListener) { // IE >= 9; other browsers document.addEventListener('contextmenu', function(e) { alert("You've tried to open context menu"); //here you draw your own menu e.preventDefault(); }, false); } else { // IE < 9 document.attachEvent('oncontextmenu', function() { alert("You've tried to open context menu"); window.event.returnValue = false; }); } </script> </head> <body> Lorem ipsum... </body> </html>но вы должны спросить себя, действительно ли вы хотите перезаписать по умолчанию правый щелчок - это зависит от приложения, которое вы разрабатываете.
было очень полезно для меня. Ради таких людей, как я, ожидая рисования меню, я поставил здесь код, который я использовал, чтобы сделать меню правой кнопкой мыши:
HTML:contextmenu.HTML-код
<!doctype html> <html> <head> <!-- jQuery should be at least version 1.7 --> <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script> <script src="contextmenu.js"></script> <link rel="stylesheet" href="contextmenu.css" /> </head> <body> <div id="test1"> <a href="www.google.com" class="test">Google</a> <a href="www.google.com" class="test">Link 2</a> <a href="www.google.com" class="test">Link 3</a> <a href="www.google.com" class="test">Link 4</a> </div> <!-- initially hidden right-click menu --> <div class="hide" id="rmenu"> <ul> <li> <a href="http://www.google.com">Google</a> </li> <li> <a href="http://localhost:8080/login">Localhost</a> </li> <li> <a href="C:\">C</a> </li> </ul> </div> </body> </html>CSS:contextmenu.css
.show { z-index:1000; position: absolute; background-color:#C0C0C0; border: 1px solid blue; padding: 2px; display: block; margin: 0; list-style-type: none; list-style: none; } .hide { display: none; } .show li{ list-style: none; } .show a { border: 0 !important; text-decoration: none; } .show a:hover { text-decoration: underline !important; }JS:contextmenu.js-используется из принятого ответа
$(document).ready(function() { if ($("#test").addEventListener) { $("#test").addEventListener('contextmenu', function(e) { alert("You've tried to open context menu"); //here you draw your own menu e.preventDefault(); }, false); } else { //document.getElementById("test").attachEvent('oncontextmenu', function() { //$(".test").bind('contextmenu', function() { $('body').on('contextmenu', 'a.test', function() { //alert("contextmenu"+event); document.getElementById("rmenu").className = "show"; document.getElementById("rmenu").style.top = mouseY(event) + 'px'; document.getElementById("rmenu").style.left = mouseX(event) + 'px'; window.event.returnValue = false; }); } }); // this is from another SO post... $(document).bind("click", function(event) { document.getElementById("rmenu").className = "hide"; }); function mouseX(evt) { if (evt.pageX) { return evt.pageX; } else if (evt.clientX) { return evt.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft); } else { return null; } } function mouseY(evt) { if (evt.pageY) { return evt.pageY; } else if (evt.clientY) { return evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop); } else { return null; } }
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <head> <title>Context menu - LabLogic.net</title> </head> <body> <script language="javascript" type="text/javascript"> document.oncontextmenu=RightMouseDown; document.onmousedown = mouseDown; function mouseDown(e) { if (e.which==3) {//righClick alert("Right-click menu goes here"); } } function RightMouseDown() { return false; } </script> </body> </html>протестировано и работает в Opera 11.6, firefox 9.01, Internet Explorer 9 и chrome 17 Вы можете проверить рабочий образец по адресу javascript щелкните правой кнопкой мыши меню
вы можете попробовать просто заблокировать контекстное меню, добавив следующее к тегу вашего тела:
<body oncontextmenu="return false;">это заблокирует весь доступ к контекстному меню (не только с правой кнопки мыши, но и с клавиатуры).
P. S. Вы можете добавить в любой тег, который вы хотите отключить контекстное меню
например:
<div class="mydiv" oncontextmenu="return false;">отключить контекстное меню в том, что определенный блок div только
сочетание некоторых хороших CSS и некоторых нестандартных HTML-тегов без внешних библиотек может дайте хороший результат (JSFiddle)
HTML
<menu id="ctxMenu"> <menu title="File"> <menu title="Save"></menu> <menu title="Save As"></menu> <menu title="Open"></menu> </menu> <menu title="Edit"> <menu title="Cut"></menu> <menu title="Copy"></menu> <menu title="Paste"></menu> </menu> </menu>Примечание: тег меню не существует, я делаю это (вы можете использовать что угодно)
CSS
#ctxMenu{ display:none; z-index:100; } menu { position:absolute; display:block; left:0px; top:0px; height:20px; width:20px; padding:0; margin:0; border:1px solid; background-color:white; font-weight:normal; white-space:nowrap; } menu:hover{ background-color:#eef; font-weight:bold; } menu:hover > menu{ display:block; } menu > menu{ display:none; position:relative; top:-20px; left:100%; width:55px; } menu[title]:before{ content:attr(title); } menu:not([title]):before{ content:"30"; }The JavaScript только для этого примера, я лично удалить его для стойких меню на windows
var notepad = document.getElementById("notepad"); notepad.addEventListener("contextmenu",function(event){ event.preventDefault(); var ctxMenu = document.getElementById("ctxMenu"); ctxMenu.style.display = "block"; ctxMenu.style.left = (event.pageX - 10)+"px"; ctxMenu.style.top = (event.pageY - 10)+"px"; },false); notepad.addEventListener("click",function(event){ var ctxMenu = document.getElementById("ctxMenu"); ctxMenu.style.display = ""; ctxMenu.style.left = ""; ctxMenu.style.top = ""; },false);Также обратите внимание, что вы можете изменить
menu > menu{left:100%;}доmenu > menu{right:100%;}для меню, которое расширяется справа налево. Вам нужно будет добавить маржу или что-то еще где-то, хотя
согласно ответам здесь и на других потоках, я сделал версию, которая выглядит как одна из Google Chrome, с переходом css3. JS Fiddle
давайте начнем eazy, так как у нас есть js выше на этой странице, мы можем беспокоиться о css и макете. Макет, который мы будем использовать, является
<a>элемент<img>элемент или шрифт удивительным значок (<i class="fa fa-flag"></i>) и<span>для отображения сочетаний клавиш. Так это структура:<a href="#" onclick="doSomething()"> <img src="path/to/image.gif" /> This is a menu option <span>Ctrl + K</span> </a>мы поместим их в div и покажем, что div на правой кнопкой мыши. Давайте стиль их, как в Google Chrome, не так ли?
#menu a { display: block; color: #555; text-decoration: no[...]теперь мы добавим код из принятого ответа и получим значение X и Y курсора. Для этого мы будем использовать
e.clientXиe.clientY. Мы используем клиент, поэтому меню div должно быть исправлено.var i = document.getElementById("menu").style; if (document.addEventListener) { document.addEventListener('contextmenu', function(e) { var posX = e.clientX; var posY = e.client[...]и это все! Просто добавьте CSS-переходы, чтобы исчезать и исчезать, и готово!
var i = document.getElementById("menu").style; if (document.addEventListener) { document.addEventListener('contextmenu', function(e) { var posX = e.clientX; var posY = e.clientY; menu(posX, posY); e.preventDefault(); }, false); document.addEventListener('click', function(e) { i.opacity = "0"; setTimeout(function() { i.visibility = "hidden"; }, 501); }, false); } else { document.attachEvent('oncontextmenu', function(e) { var posX = e.clientX; var posY = e.clientY; menu(posX, posY); e.preventDefault(); }); document.attachEvent('onclick', function(e) { i.opacity = "0"; setTimeout(function() { i.visibility = "hidden"; }, 501); }); } function menu(x, y) { i.top = y + "px"; i.left = x + "px"; i.visibility = "visible"; i.opacity = "1"; }body { background: white; font-family: sans-serif; color: #5e5e5e; } #menu { visibility: hidden; opacity: 0; position: fixed; background: #fff; color: #555; font-family: sans-serif; font-size: 11px; -webkit-transition: opacity .5s ease-in-out; -moz-transition: opacity .5s ease-in-out; -ms-transition: opacity .5s ease-in-out; -o-transition: opacity .5s ease-in-out; transition: opacity .5s ease-in-out; -webkit-box-shadow: 2px 2px 2px 0px rgba(143, 144, 145, 1); -moz-box-shadow: 2px 2px 2px 0px rgba(143, 144, 145, 1); box-shadow: 2px 2px 2px 0px rgba(143, 144, 145, 1); padding: 0px; border: 1px solid #C6C6C6; } #menu a { display: block; color: #555; text-decoration: none; padding: 6px 8px 6px 30px; width: 250px; position: relative; } #menu a img, #menu a i.fa { height: 20px; font-size: 17px; width: 20px; position: absolute; left: 5px; top: 2px; } #menu a span { color: #BCB1B3; float: right; } #menu a:hover { color: #fff; background: #3879D9; } #menu hr { border: 1px solid #EBEBEB; border-bottom: 0; }<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet"/> <h2>CSS3 and JAVASCRIPT custom menu.</h2> <em>Stephan Stanisic | Lisence free</em> <p>Right-click anywhere on this page to open the custom menu. Styled like the Google Chrome contextmenu. And yes, you can use <i class="fa fa-flag"></i>font-awesome</p> <p style="font-size: small"> <b>Lisence</b> <br /> "THE PIZZA-WARE LICENSE" (Revision 42): <br /> You can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a Pizza in return. <br /> <a style="font-size:xx-small" href="https://github.com/KLVN/UrbanDictionary_API#license">https://github.com/KLVN/UrbanDictionary_API#license</a> </p> <br /> <br /> <small>(The white body background is just because I hate the light blue editor background on the result on jsfiddle)</small> <div id="menu"> <a href="#"> <img src="http://puu.sh/nr60s/42df867bf3.png" /> AdBlock Plus <span>Ctrl + ?!</span> </a> <a href="#"> <img src="http://puu.sh/nr5Z6/4360098fc1.png" /> SNTX <span>Ctrl + ?!</span> </a> <hr /> <a href="#"> <i class="fa fa-fort-awesome"></i> Fort Awesome <span>Ctrl + ?!</span> </a> <a href="#"> <i class="fa fa-flag"></i> Font Awesome <span>Ctrl + ?!</span> </a> </div>
Попробуй Такое
$(function() { var doubleClicked = false; $(document).on("contextmenu", function (e) { if(doubleClicked == false) { e.preventDefault(); // To prevent the default context menu. var windowHeight = $(window).height()/2; var windowWidth = $(window).width()/2; if(e.clientY > windowHeight && e.clientX <= windowWidth) { $("#contextMenuContainer").css("left", e.clientX); $("#contextMenuContainer").css("bottom", $(window).height()-e.clientY); $("#contextMenuContainer").css("right", "auto"); $("#contextMenuContainer").css("top", "auto"); } else if(e.clientY > windowHeight && e.clientX > windowWidth) { $("#contextMenuContainer").css("right", $(window).width()-e.clientX); $("#contextMenuContainer").css("bottom", $(window).height()-e.clientY); $("#contextMenuContainer").css("left", "auto"); $("#contextMenuContainer").css("top", "auto"); } else if(e.clientY <= windowHeight && e.clientX <= windowWidth) { $("#contextMenuContainer").css("left", e.clientX); $("#contextMenuContainer").css("top", e.clientY); $("#contextMenuContainer").css("right", "auto"); $("#contextMenuContainer").css("bottom", "auto"); } else { $("#contextMenuContainer").css("right", $(window).width()-e.clientX); $("#contextMenuContainer").css("top", e.clientY); $("#contextMenuContainer").css("left", "auto"); $("#contextMenuContainer").css("bottom", "auto"); } $("#contextMenuContainer").fadeIn(500, FocusContextOut()); doubleClicked = true; } else { e.preventDefault(); doubleClicked = false; $("#contextMenuContainer").fadeOut(500); } }); function FocusContextOut() { $(document).on("click", function () { doubleClicked = false; $("#contextMenuContainer").fadeOut(500); $(document).off("click"); }); } });
Я знаю, что на это уже ответили, но я потратил некоторое время на борьбу со вторым ответом, чтобы заставить собственное контекстное меню исчезнуть и пусть он появится там,где пользователь нажал.
HTML<body> <div id="test1"> <a href="www.google.com" class="test">Google</a> <a href="www.google.com" class="test">Link 2</a> <a href="www.google.com" class="test">Link 3</a> <a href="www.google.com" class="test">Link 4</a> </div> <!-- initially hidden right-click menu --> <div class="hide" id="rmenu"> <ul> <li class="White">White</li> <li>Green</li> <li>Yellow</li> <li>Orange</li> <li>Red</li> <li>Blue</li> </ul> </div> </body>CSS
.hide { display: none; } #rmenu { border: 1px solid black; background-color: white; } #rmenu ul { padding: 0; list-style: none; } #rmenu li { list-style: none; padding-left: 5px; padding-right: 5px; }JavaScript
if (document.getElementById('test1').addEventListener) { document.getElementById('test1').addEventListener('contextmenu', function(e) { $("#rmenu").toggleClass("hide"); $("#rmenu").css( { position: "absolute", top: e.pageY, left: e.pageX } ); e.preventDefault(); }, false); } // this is from another SO post... $(document).bind("click", function(event) { document.getElementById("rmenu").className = "hide"; });
вы можете сделать это с помощью этого кода. посетите здесь для полного учебника с автоматическим обнаружением краяhttp://www.voidtricks.com/custom-right-click-context-menu/
$(document).ready(function () { $("html").on("contextmenu",function(e){ //prevent default context menu for right click e.preventDefault(); var menu = $(".menu"); //hide menu if already shown menu.hide(); //get x and y values of the click event var pageX = e.pageX; var pageY = e.pageY; //position menu div near mouse cliked area menu.css({top: pageY , left: pageX}); var mwidth = menu.width(); var mheight = menu.height(); var screenWidth = $(window).width(); var screenHeight = $(window).height(); //if window is scrolled var scrTop = $(window).scrollTop(); //if the menu is close to right edge of the window if(pageX+mwidth > screenWidth){ menu.css({left:pageX-mwidth}); } //if the menu is close to bottom edge of the window if(pageY+mheight > screenHeight+scrTop){ menu.css({top:pageY-mheight}); } //finally show the menu menu.show(); }); $("html").on("click", function(){ $(".menu").hide(); }); });'
вот это очень хорошо учебник по созданию пользовательского контекстного меню С полным рабочим примером кода (без JQuery и других библиотек).
вы можете найти демо-код на GitHub.
они дают подробное пошаговое объяснение, которое вы можете следовать, чтобы создать свое собственное контекстное меню правой кнопкой мыши (включая html, css и javascript-код) и суммировать его в конце, приведя полный пример код.
вы можете легко следовать и адаптировать его к вашим собственным потребностям. И нет необходимости в JQuery или других библиотеках.
вот как выглядит их пример кода меню:
<nav id="context-menu" class="context-menu"> <ul class="context-menu__items"> <li class="context-menu__item"> <a href="#" class="context-menu__link" data-action="View"><i class="fa fa-eye"></i> View Task</a> </li> <li class="context-menu__item"> <a href="#" class="context-menu__link" data-action="Edit"><i class="fa fa-edit"></i> Edit Task</a> </li> <li class="context-menu__item"> <a href="#" class="context-menu__link" data-action="Delete"><i class="fa fa-times"></i> Delete Task</a> </li> </ul> </nav>
<script language="javascript" type="text/javascript"> document.oncontextmenu = RightMouseDown; document.onmousedown = mouseDown; function mouseDown(e) { if (e.which==3) {//righClick alert("Right-click menu goes here"); } } function RightMouseDown() { return false; } </script> </body> </html>
простой способ сделать это-использовать onContextMenu для возврата функции JavaScript:
<input type="button" value="Example" onContextMenu="return RightClickFunction();"> <script> function RightClickFunction() { // Enter your code here; return false; } </script>и
return false;вы отмените контекстное меню.Если вы все еще хотите, чтобы отобразить контекстное меню, вы можете просто удалить
return false;линии.
протестировано и работает в Opera 12.17, firefox 30, Internet Explorer 9 и chrome 26.0.1410.64
document.oncontextmenu =function( evt ){ alert("OK?"); return false; }
вы должны помнить, если вы хотите использовать только решение Firefox, если вы хотите добавить его во весь документ, вы должны добавить
contextmenu="mymenu"до<html>тег неbodyтег.
Вы должны обратить на это внимание.
в новом html 5.1 появилась новая функция контекстного меню.
IMPORTANT: ATM, This feature works only in Firefox 49 and later.
<html> <head> <style> .rightclick { /* YOUR CONTEXTMENU'S CSS */ visibility: hidden; background-color: white; border: 1px solid grey; width: 200px; height: 300px; } </style> </head> <body> <div class="rightclick" id="ya"> <p onclick="alert('choc-a-late')">I like chocolate</p><br><p onclick="awe-so-me">I AM AWESOME</p> </div> <p>Right click to get sweet results!</p> </body> <script> document.onclick = noClick; document.oncontextmenu = rightClick; function rightClick(e) { e = e || window.event; e.preventDefault(); document.getElementById("ya").style.visibility = "visible"; console.log("Context Menu v1.3.0 by IamGuest opened."); } function noClick() { document.getElementById("ya").style.visibility = "hidden"; console.log("Context Menu v1.3.0 by IamGuest closed."); } </script> <!-- Coded by IamGuest. Thank you for using this code! --> </html>вы можете настроить и изменить этот код, чтобы сделать более красивый, более эффективный contextmenu. Что касается изменения существующего contextmenu, я не уверен, как это сделать... Проверьте это скрипка для организованной точки зрения. Также, попробуйте нажать на элементы в контекстное меню. Они должны предупредить вас несколько удивительных сообщений. Если они не работают, попробуйте что-то еще... сложный.
<script> function fun(){ document.getElementById('menu').style.display="block"; } </script> <div id="menu" style="display: none"> menu items</div> <body oncontextmenu="fun();return false;">что я здесь делаю
- Создайте свое собственное меню div и установите положение: абсолют и дисплей:нет в случае.
- добавить на страницу или элемент для щелчка событие oncontextmenu.
- отменить действие браузера по умолчанию с возвращением false.
пользователь JS, чтобы вызвать свои собственные действия.
Я использую что-то похожее на следующее jsfiddle
function onright(el, cb) { //disable right click document.body.oncontextmenu = 'return false'; el.addEventListener('contextmenu', function (e) { e.preventDefault(); return false }); el.addEventListener('mousedown', function (e) { e = e || window.event; if (~~(e.button) === 2) { if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } return false; } }); // then bind Your cb el.addEventListener('mousedown', function (e) { e = e || window.event; ~~(e.button) === 2 && cb.call(el, e); }); }Если вы нацелены на более старые браузеры IE, вы все равно должны завершить его с помощью ' attachEvent; case
Comments