使用带有HTML 5 Canvas的JQuery创建上下文菜单

玄恩

我尝试开发具有上下文菜单的HTML 5 Canvas。单击“画布”中的每个图像时,它将显示每个图像的上下文菜单。那里只有一块画布

<canvas id="canvas" width=300 height=300></canvas>

当我绘制时它将显示所有图像。我尝试一些jquery库上下文菜单,它仅在有更多画布的情况下才支持(因为它使用classid元素来检测HTML元素)。

现在我只想使用1个画布,已检测到画布中每个图像的单击,但是我不知道如何创建上下文菜单。您能建议我使用jquery库还是以我为例?

谢谢。

一种想法是使用无序列表创建自己的自定义上下文菜单。

  • 通过侦听contextmenu画布上的事件来覆盖默认的上下文菜单

    canvas.addEventListener('contextmenu', handleContextMenu, false);  
    
  • 在画布上绘制的特定图像内单击上下文鼠标按钮时,您可以使用针对所单击图像的个性化列表项来重建UL。

  • 设置UL的position:absolutelefttop以在画布上的鼠标位置定位您的上下文菜单。

  • 您可以在不需要UL时将其隐藏。

  • 侦听UL列表项上的单击事件,以响应用户上下文菜单的选择。

示例代码和演示:

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
function reOffset(){
  var BB=canvas.getBoundingClientRect();
  offsetX=BB.left;
  offsetY=BB.top;        
}
var offsetX,offsetY;
reOffset();
window.onscroll=function(e){ reOffset(); }
window.onresize=function(e){ reOffset(); }

var $menu=$('#contextMenu');

var rects=[];
rects.push({x:50,y:50,width:50,height:50,color:"red",contextMenu:['One red','Two red']});
rects.push({x:150,y:100,width:75,height:75,color:"blue",contextMenu:['One blue','Two blue']});

ctx.clearRect(0,0,cw,ch);
for(var i=0;i<rects.length;i++){
  var rect=rects[i];
  ctx.beginPath();
  ctx.fillStyle=rect.color;
  ctx.rect(rect.x,rect.y,rect.width,rect.height);
  ctx.fill();
}

$('#contextMenu').on('click','li',function(e){
  // hide the context menu
  showContextMenu();
  alert('Context selection: '+$(this).text());
});

// hide the context menu
showContextMenu();

canvas.addEventListener('mousedown', handleMouseDown, false);  
canvas.addEventListener('contextmenu', handleContextMenu, false);  

function handleMouseDown(e){
  // hide the context menu
  showContextMenu();
}

function handleContextMenu(e){
  // tell the browser we're handling this event
  e.preventDefault();
  e.stopPropagation();

  // get mouse position relative to the canvas
  var x=parseInt(e.clientX-offsetX);
  var y=parseInt(e.clientY-offsetY);

  // hide the context menu
  showContextMenu();

  // check each rect for hits
  for(var i=0;i<rects.length;i++){
    var rect=rects[i];
    var rectRight=rect.x+rect.width;
    var rectBottom=rect.y+rect.height;

    // check each rect for hits
    if(x>=rect.x && x<=rectRight && y>=rect.y && y<=rectBottom  ){
      showContextMenu(rect,x,y);
    }
  }
  return(false);
}

function showContextMenu(r,x,y){
  if(!r){$menu.hide(); return;}
  $menu.show();
  var m=r.contextMenu;
  $menu.empty();
  $menu.css({left:x,top:y});
  for(var i=0;i<m.length;i++){
    $('<li>', { text:m[i], 'data-fn':i, }).appendTo($menu[0]);
  }
}
body{ background-color: ivory; padding:0; }
#canvas{border:1px solid red;}
#canvasContainer{position:relative;}
#canvas,#contextMenu{position:absolute;}
#contextMenu{
  border:1px solid green;
  background:white;
  list-style:none;
  padding:3px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<h4>Right click on rect for context menu.</h4>
<div id=canvasContainer>
  <canvas id="canvas" width=300 height=300></canvas>
  <ul id=contextMenu><li>Test</li></ul>
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用PyQt5创建上下文菜单

HTML5 canvas:重绘整个上下文

使用Jquery上下文菜单

如何将上下文菜单嵌入HTML5视频播放器?

流星:如何获取HTML5 Canvas元素的上下文

如何将HTML5 canvas上下文重置为默认值?

上下文菜单未使用PyQt5显示正确的语言

如何使用React的Context功能将HTML5 Canvas上下文传递给this.props.children?

HTML5 Canvas-相对于对象中心缩放,无需转换上下文

使用 JQuery 获取创建的画布的上下文

使用pyqt5时,上下文菜单在托盘图标上不起作用

如何使用 PyQt5 添加到 Python 文本框中的默认上下文菜单?

在上下文菜单中使用自定义名称创建新的“新建”子菜单

html5 画布上下文在整页中模糊

上下文菜单和带有dataTable的目标

jQuery上下文菜单,具有多个操作的单个菜单

QTableWidget列标题的PyQt5上下文菜单

在新动态创建的窗口html中将canvas上下文插入html字符串

如何使用Syncfusion ej2在上下文菜单中创建关闭功能

如何使用自定义上下文菜单创建桌面图标

如何在WP SL8.1上使用C#创建上下文菜单?

如何使用Chris Domigan在jQuery中使用ContextMenu插件取消绑定/删除上下文菜单?

上下文菜单中没有“使用IDLE编辑”

jQuery,使用上下文菜单粘贴后移除焦点

在 Swift 5 中使用范围创建结构数组时,“没有更多上下文的表达式类型不明确”

html上下文文件的上下文菜单中的VS2015扩展

使用带有Laravel 5的jQuery创建href

如何正确使用jQuery“上下文”

带有jCanvas的HTML5 Canvas:如何删除图层