Fabric.js的 Canvas有个mouse:down 事件,通过它我们可以监听到鼠标按下的行为。不过该事件只对鼠标左键其作用,如果是右键按下则不会触发该事件。

而 Canvas上又无法直接监听 contextmenu事件,所以想要实现右键点击响应就需要换种方式实现。

1,实现原理

Fabric.js 的 Canvas初始化完毕后,会自动在其上方覆盖一个 class名为upper-canvas的 canvas。

我们可以在上层这个 canvas上添加 contextmenu事件监听。当右键按下时会触发该事件,然后将点击的坐标转换成底下实际的 canvas里的坐标(坐标需要转换是因为下面 canvas 可能会被移动,缩放)。

2,效果图

默认情况下,鼠标左键点击对象即可选择中该对象。

这里增加个右键选中功能,即通过右键同样可以选中对象。

3,样例代码

canvas {

border: 1px dashed black;

}

var canvas;

window.onload = function() {

canvas = new fabric.Canvas('canvas');

var rect1 = new fabric.Rect({top: 50, left: 50, width: 70, height: 70, fill: 'red'});

canvas.add(rect1);

var rect2 = new fabric.Rect({top: 50, left: 150, width: 70, height: 70, fill: 'red'});

canvas.add(rect2);

var rect3 = new fabric.Rect({top: 50, left: 250, width: 70, height: 70, fill: 'red'});

canvas.add(rect3);

//在canvas上层对象上添加右键事件监听

$(".upper-canvas").contextmenu(onContextmenu);

}

//右键点击事件响应

var onContextmenu = function(event) {

var pointer = canvas.getPointer(event.originalEvent);

var objects = canvas.getObjects();

for (var i = objects.length - 1; i >= 0; i--) {

var object = objects[i];

//判断该对象是否在鼠标点击处

if (canvas.containsPoint(event, object)) {

//选中该对象

canvas.setActiveObject(object);

}

}

//阻止系统右键菜单

event.preventDefault();

return false;

}

附:添加一个自定义的右键菜单

1,实现原理

这里我们使用一个专门的第三方菜单组件(contextMenu)来实现,在上面的右键点击响应中将菜单弹出即可。

2,效果图

(1)当鼠标在对像上按下右键时,会出现个菜单。

(2)点击菜单里的“删除”项,即可将对象删除。

3,样例代码

canvas {

border: 1px dashed black;

}

var canvas;

//菜单项

var contextMenuItems;

window.onload = function() {

canvas = new fabric.Canvas('canvas');

var rect1 = new fabric.Rect({top: 50, left: 50, width: 70, height: 70, fill: 'red'});

canvas.add(rect1);

var rect2 = new fabric.Rect({top: 50, left: 150, width: 70, height: 70, fill: 'red'});

canvas.add(rect2);

var rect3 = new fabric.Rect({top: 50, left: 250, width: 70, height: 70, fill: 'red'});

canvas.add(rect3);

//在canvas上层对象上添加右键事件监听

$(".upper-canvas").contextmenu(onContextmenu);

//初始化右键菜单

$.contextMenu({

selector: '#contextmenu-output',

trigger: 'none',

build: function($trigger, e) {

//构建菜单项build方法在每次右键点击会执行

return {

callback: contextMenuClick,

items: contextMenuItems

};

},

});

}

//右键点击事件响应

function onContextmenu(event) {

var pointer = canvas.getPointer(event.originalEvent);

var objects = canvas.getObjects();

for (var i = objects.length - 1; i >= 0; i--) {

var object = objects[i];

//判断该对象是否在鼠标点击处

if (canvas.containsPoint(event, object)) {

//选中该对象

canvas.setActiveObject(object);

//显示菜单

showContextMenu(event, object);

continue;

}

}

//阻止系统右键菜单

event.preventDefault();

return false;

}

//右键菜单项点击

function showContextMenu(event, object) {

//定义右键菜单项

contextMenuItems = {

"delete": {name: "删除", icon: "delete", data: object},

};

//右键菜单显示位置

var position = {

x: event.clientX,

y: event.clientY

}

$('#contextmenu-output').contextMenu(position);

}

//右键菜单项点击

function contextMenuClick(key, options) {

if(key == "delete") {

//得到对应的object并删除

var object = contextMenuItems[key].data;

canvas.remove(object);

}

}

html添加鼠标右键菜单,Fabric.js - 添加鼠标右键点击事件响应(附:右键菜单)...相关推荐

  1. Fabric.js添加辅助线的方法

    Fabric.js高级点的教程1–添加辅助线的方法 Fabric.js添加辅助线的方法 Fabric.js 非常的强大,但是国内的资源教程很少,最近想加个功能给元素添加辅助参考线(类似 演示 ).这样 ...

  2. js自动触发点击事件

    js自动触发点击事件 // 进入页面立即触发(()=>{// 兼容IEif(document.all) {document.getElementById("aid").cli ...

  3. Android点击事件、下拉菜单、单选框实例

    Android点击事件.下拉菜单.单选框实例 点击事件 1.ClickActivity.java import android.app.Activity; import android.os.Bund ...

  4. 获取js里添加的css文件,用JS添加一个css文件

    我在这里发现了一些关于我的问题的问题,但我无法使用它. 通过JS点击它们时我会改变的CSS属性,JQuery的用JS添加一个css文件 Green Red /*$(document).ready(fu ...

  5. 动态二级下拉菜单html,js实现简洁大方的二级下拉菜单效果代码

    本文实例讲述了js实现简洁大方的二级下拉菜单效果代码.分享给大家供大家参考.具体如下: 这是一款简洁大方的二级下拉菜单,菜单的颜色自己根据需要重新定义吧,这里仅给大家提供一种制作二级菜单的思路,整体效 ...

  6. win10鼠标灵敏度怎么调_Win10系统鼠标右键点击没有任何反应怎么解决?

    Win10系统鼠标右键没有反应怎么办?今天一个用户在使用Win10系统电脑的时候,突然出现鼠标右键点击没有任何反应的问题,这是怎么回事?是鼠标坏了吗?下文就给大家详细分析可能的原因及其解决办法. 一. ...

  7. js input点击事件_Vue.js的旅程,简单的todo实例「602」

    对vue没有一丝了解的朋友可以看我的文章601Vue.js的旅程,初步认识Vue.js「601」. 这回我们做一个网上很多练习用的todo实例. 更多文章请关注我的头条号. 一.我们开始吧,先链接vu ...

  8. android app 主界面,android ViewPager实现App主界面Tab菜单页面切换和点击事件

    Tabhost实现页面滑动切换比较麻烦,这里介绍一下viewPage 控件. 实现了三屏滑动带标题点击和tab页面内按钮的的点击事件实现: viewPage  的优点是可以滑动切换缺点是MainAct ...

  9. html 记录点击次数,jquery/js记录点击事件,单击次数加一,双击清零

    目的:点击按钮,点击后在网页上显示点击次数,双击清零 实现:js或者jquery 代码如下: pageEncoding="utf-8"%> 点击事件 window.onloa ...

  10. JS的点击事件 onclick

    onclick 点击事件 onclick 以文字de放大与缩小为实例 嗨- 各位小可爱们,我们又见面了 先来了解一下定义和用法 onclick 属性在单击鼠标时触发. 记住是 单击单击单击!!! 只点 ...

最新文章

  1. 数据中台已成气候!大数据架构师如何站上风口?
  2. 数据分析显示,疫情下数据科学家的薪水几乎未受影响
  3. CentOS+Nginx+Tomcat+Mysql+PHP 环境搭建及系统部署
  4. Oracle删库跑路
  5. 简述hdfs工作原理_hdfs工作机制和原理 简述hdfs的原理
  6. 【Julia】Julia使用Pkg下载镜像配置问题解决方案
  7. 【翻译】Sencha Cmd中脚本压缩方法之比较
  8. kotlin运行_Kotlin允许,运行,也适用于
  9. 欧姆龙plc学习笔记(六)(从cx-one上传程序到欧姆龙plc)
  10. (模电笔记二 By Multisim)波特图(Bode Plotter)幅频特性相频特性详解
  11. 用ArcGIS提取HWSD中的土壤单一属性数据
  12. 什么是一级域名、二级域名?
  13. 两年数据对比柱形图_视频教程:堆积柱形图的几种变化形式
  14. web网页设计期末课程大作业 基于HTML+CSS+JavaScript响应式环保科技公司网站模板(环保主题网站设计)
  15. 一个女留学生在美国的七年
  16. aid learning安装应用_Aid Learning
  17. 肉蛋堡记 - 符皓冉
  18. 关于录制短视频点播不能播放问题的总结
  19. 常微分方程数值解法1
  20. 我作为大学生刚出校园实习的感受

热门文章

  1. 支付系列-对接支付宝支付
  2. 这些行业高薪职位最多
  3. 多媒体(流媒体)技术领域及开源系统,媒体库数据如音乐、图片问题等-(图像,音视频)
  4. 100流明相当于多少w_GE的50W卤素灯光通量标明1500流明实际有这么高吗换几W的LED灯较合适...
  5. python用爬虫实现抢票_PythonGUI+爬虫-从零打造12306抢票软件价值1680元
  6. 最详细、最全面的【Java日志框架】介绍,建议收藏,包含JUL、log4j、logback、log4j2等所有主流框架
  7. 电脑重装系统后文件怎么恢复
  8. 保姆级教学:手把手教你如何分析研报!
  9. 使用hexo+gitee免费搭建个人博客全网最详细
  10. 大话谈VUE之export const