Fabric.js 直线并单击选择

2023-12-26

我为这段代码创建了 3 种模式:

  1. 选择行
  2. 画线和
  3. 删除行。

看起来它正在工作。但我想改变两件事。 例如,每次我选择一行时,我只需要单击它。

你能告诉我如何改进我的代码吗?

谢谢您的回答。

这是我的代码:

<!DOCTYPE html>
<html>
<head>
 <script type ="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
 <script type ="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<title>Test</title>
</head>
<body>
<button id="select">Selection mode</button>
<button id="draw">Drawing mode</button>

<button id="delete">Delete selected object(s)</button><br />
<canvas id="c" width="400" height="400" style="border:1px solid #ccc"></canvas>

<script type="text/javascript">
var line, isDown,mode;

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

$("#select").click(function(){
    mode="select";   
         canvas.selection=true;
     canvas.perPixelTargetFind = true;
     canvas.targetFindTolerance = 4;
     canvas.renderAll();
});
$("#draw").click(function(){
    
     
    mode="draw";
});
$("#delete").click(function(){
    
    
    deleteObjects();
});

// Adding objects to the canvas...

 
canvas.on('mouse:down', function(o){
  isDown = true;
  var pointer = canvas.getPointer(o.e);
  var points = [ pointer.x, pointer.y, pointer.x, pointer.y ];
   
  if(mode=="draw"){
    line = new fabric.Line(points, {
    strokeWidth: 5,
    fill: 'red',
    stroke: 'red',
    originX: 'center',
    originY: 'center',

  });
  canvas.add(line);}
});
 
canvas.on('mouse:move', function(o){
  if (!isDown) return;
  var pointer = canvas.getPointer(o.e);
  
  if(mode=="draw"){
  line.set({ x2: pointer.x, y2: pointer.y });
  canvas.renderAll(); }
});

canvas.on('mouse:up', function(o){
  isDown = false;
});

  

// select all objects
function deleteObjects(){
    var activeObject = canvas.getActiveObject(),
    activeGroup = canvas.getActiveGroup();
    if (activeObject) {
        if (confirm('Are you sure?')) {
            canvas.remove(activeObject);
        }
    }
    else if (activeGroup) {
        if (confirm('Are you sure?')) {
            var objectsInGroup = activeGroup.getObjects();
            canvas.discardActiveGroup();
            objectsInGroup.forEach(function(object) {
            canvas.remove(object);
            });
        }
    }
}
</script>
</body>
</html>

PS:抱歉英语不好或错误。


当向画布添加一条线时,它通常是可选的。 但是,由于您修改了它自己的属性,例如从这两个点派生的宽度和高度,因此它的宽度和高度发生了变化。

如果您以编程方式更改尺寸,则必须调用line.setCoords()明确地否则不会再次计算交互点。

perPixelTargetFind 是可选的,不需要每次进入选择模式时都调用。

所以答案是:

在 mouseup 事件中调用 line.setCoords() 。

检查片段。

<!DOCTYPE html>
<html>
<head>
 <script type ="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
 <script type ="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<title>Test</title>
</head>
<body>
<button id="select">Selection mode</button>
<button id="draw">Drawing mode</button>

<button id="delete">Delete selected object(s)</button><br />
<canvas id="c" width="400" height="400" style="border:1px solid #ccc"></canvas>

<script type="text/javascript">
var line, isDown,mode;

var canvas = new fabric.Canvas('c');
     canvas.perPixelTargetFind = true;
     canvas.targetFindTolerance = 4;

$("#select").click(function(){
    mode="select";   
    canvas.selection=true;
    canvas.renderAll();
});
$("#draw").click(function(){
    
     
    mode="draw";
});
$("#delete").click(function(){
    
    
    deleteObjects();
});

// Adding objects to the canvas...

 
canvas.on('mouse:down', function(o){
  isDown = true;
  var pointer = canvas.getPointer(o.e);
  var points = [ pointer.x, pointer.y, pointer.x, pointer.y ];
   
  if(mode=="draw"){
    line = new fabric.Line(points, {
    strokeWidth: 5,
    fill: 'red',
    stroke: 'red',
    originX: 'center',
    originY: 'center',

  });
  canvas.add(line);}
});
 
canvas.on('mouse:move', function(o){
  if (!isDown) return;
  var pointer = canvas.getPointer(o.e);
  
  if(mode=="draw"){
  line.set({ x2: pointer.x, y2: pointer.y });
  canvas.renderAll(); }
});

canvas.on('mouse:up', function(o){
  isDown = false;
  line.setCoords();
});

  

// select all objects
function deleteObjects(){
    var activeObject = canvas.getActiveObject(),
    activeGroup = canvas.getActiveGroup();
    if (activeObject) {
        if (confirm('Are you sure?')) {
            canvas.remove(activeObject);
        }
    }
    else if (activeGroup) {
        if (confirm('Are you sure?')) {
            var objectsInGroup = activeGroup.getObjects();
            canvas.discardActiveGroup();
            objectsInGroup.forEach(function(object) {
            canvas.remove(object);
            });
        }
    }
}
</script>
</body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fabric.js 直线并单击选择 的相关文章

  • 如何使用 Fabric.js 创建自定义画笔涂料?

    我一直在尝试使用图像文件创建自定义画笔绘画织物JS http fabricjs com 我尝试过使用布料 PatternBrush http fabricjs com docs fabric PatternBrush html但这不是我正在
  • FabricJS:当我更改路径坐标时,路径的边界框不会更新

    我们在处理结构中的路径时遇到问题 当用户拖动第一个点或最后一个点时 我们需要始终更改二次线 路径 的坐标 路径会像往常一样更新 但问题是路径的边界框不会随着 object path 的每次更改而更新 参见图片 function var ca
  • Fabric.js 画布上的多个剪切区域

    制作照片拼贴制作器 https editphotosforfree com 我使用 Fabric js 它具有基于对象的裁剪功能 这个功能很棒 但剪切区域内的图像无法缩放 移动或旋转 我想要一个固定位置的剪切区域 并且图像可以根据用户的需要
  • 使用 Fabric.js 的交互式文本字段

    在过去的几周里 我经常使用 Fabric js 但对于文本字段 我只发现可以在创建时设置文本 有没有可能的方法来制作交互式文本字段 或者我是否必须找到解决方法来实现这一目标 对于交互式文本字段 我指的是画布上我可以单击并直接写入的区域 Fa
  • 重新创建 Fabric.js 画布并导出为图像?

    我有一个画布 用户可以在其中使用另一个画布中的图像创建设计div他们点击 将其发送到 Fabric js 画布 并在其中移动等等 由于画布的大小是width 270 and height 519 比成品小 我需要用尺寸为的画布重新创建它wi
  • 使用 Fabric.js 以编程方式创建和选择组

    假设我有一个包含 6 个对象的画布和一个位于画布外的按钮 当我单击此按钮时 其中 3 个对象将成为一组并被选中 对象将保持其相对于画布的位置 那可能吗 我尝试了很多事情 但都能成功 我正在寻找的解决方案如下所示 var objectList
  • 在电脑上将fabricjs画布另存为图像

    我想通过单击 html 页面中的按钮将 Fabric 画布保存为 PC 上的图像 jpg 或 png 相同 我尝试了一个解决方案但不起作用 function saveF canvF var imageCanv canvF toDataURL
  • 具有 CSS 类的 img 的 DataURL

    我必须应用一些样式 img 感谢 CSS 类 是否有可能获得dataURL of the img 与CSS样式 function Original const imgOriginal document getElementById orig
  • Fabricjs,旋转对象后是否可以获得虚拟矩形的左、上、右位置

    旋转物体后是否可以获得虚拟矩形的左 上 右位置 您正在寻找的是边界矩形你的对象 获取边界矩形 忽略Vpt Object 返回对象边界矩形的坐标 左 上 宽 高 该框旨在与画布轴对齐 返回 具有 left top width height 属
  • Fabric.js画布监听键盘事件?

    在我的结构应用程序中 我当前正在侦听某些按键 例如删除键 并删除任何选定的元素 我监听按键的方法是 document onkeydown function e if 46 e keyCode 46 is Delete key do stuf
  • webpack、babel:Fabric.js 的 es6 导入与 require

    我在我的开发工具链中使用了 webpack 和 babel 运行以下代码时 import as fabric from fabric var canvas new fabric Canvas canvas 我收到以下错误 fabric2 d
  • JavaScript - 动态创建 SVG 并修改光标

    假设我有一个 HTML5 画布 在本例中使用 Fabric js 并且我想更改画布上的光标以表示已选择的画笔大小和颜色 我认为应该有一种方法可以通过使用 JS 动态更改 SVG 的属性 大小和颜色 来做到这一点 这样我们就不必使用多个图像
  • 如何在FabricJs中设置相对位置(oCoords)?

    我在fabricJs中有一个文本 我设置了顶部和左侧 这会将 aCoords 正确设置为这些值 但是 oCoords 不匹配 并且文本未显示在正确的位置 我怀疑我需要以某种方式设置为 oCoords 以便文本显示在画布上的右侧像素坐标 顶部
  • 如何使用 Fabric.js 在画布上画一条线

    我正在使用 Fabric js 在画布上画一条线 这是我的代码 但我没有得到任何输出 Line click function alert Line canvas add new fabric Line 50 100 200 200 left
  • 使用动态模式从 JSON 加载

    我正在尝试保存 Fabric js 画布并使用重新加载它loadFromJson 但我收到错误 patternSourceCanvas 未定义 我认为我应该将其设为全局 所以我删除了 var 但是 当我用新图案填充其他新形状时 这个新图案将
  • 使用fabric js连接两个对象

    我目前有一个画布应用程序 可以在其中添加对象 形状 这是我的FIDDLE http jsfiddle net vxqL4yg9 您基本上单击新模拟将初始化画布 然后您可以添加圆形或矩形 我正在尝试添加一个名为 添加子项 的功能 您可以在其中
  • 尝试在 FabricJS 中使用句柄创建对话气泡

    我正在尝试使用 FabricJS 创建一个语音气泡 以集成到 WordPress 插件中 希望 免费发布 以帮助人们注释图像 我在这里找到了原始的气泡 语音气泡 html5 canvas js https stackoverflow com
  • Fabric JS ClipPath:裁剪后如何使图像适合画布?

    我使用 FabricJS 和 ClipPath 属性实现了图像裁剪 问题是如何使裁剪后的图像适合画布 我希望裁剪后的图像填充画布区域 但不知道是否可以使用 Fabric js 来完成 因此 我希望用户单击 裁剪 按钮后图像的选定部分适合画布
  • 通过 Fabric.js 推送 D3.js 输出以支持 IE8?

    我正在评估Fabric js http fabricjs com 作为替代拉斐尔 js http raphaeljs com 用于创建与 IE8 兼容的交互式可视化 IE8 不支持 SVG 或画布 不幸的是 IE8 支持是不可协商的 Rap
  • 导出具有高质量图像的画布的最佳实践是什么?

    我需要你的帮助 我解释一下我的情况 我正在使用 Fabric js 库在我的应用程序中放置形状 文本等 我的画布尺寸为 1000x1000 像素 约 26 45x26 45 厘米 我有一个图像上传脚本 仅用于上传高质量图像 例如 300 d

随机推荐

  • matplotlib 中共享轴方形子图的新 pythonic 风格?

    相关 在 matplotlib 中绘制具有固定限制的自动缩放子图 https stackoverflow com questions 13612610 plotting autoscaled subplots with fixed limi
  • 跟踪电子邮件以真实图像打开

    我正在考虑将电子邮件跟踪添加到我为小型客户企业构建的网络服务中 我打算做嵌入式图像解决方案 参考我服务器上的图像 除非其他人有更好的方法 但是当我使用图像标签引用服务器上的 PHP 页面时 它会加载 损坏的图像 图标 我怎样才能使它成为有效
  • 如何在material-ui中使用伪选择器?

    我一直在努力实现简单的事情 我试图显示 隐藏我的
  • 在 Xcode 4 中将项目添加到工作区时出现问题

    我前段时间在 Xcode 3 2 x 下启动了几个项目 几天前我切换到 Xcode 4 并希望将工作区功能用作这两个项目 基本上 我的计划是从两个项目中提取一些共同的功能 并使它们成为两个项目所依赖的公共库 然而 在我接触到棘手的依赖关系之
  • 如何在 Angular 中注册触摸移动事件?

    总结一下问题 堆栈闪电战 https stackblitz com edit angular touch playground https stackblitz com edit angular touch playground 我正在尝试
  • SQL Server NText 字段限制为 43,679 个字符?

    我使用 SQL Server 数据库来存储很长的 Unicode 字符串 该字段来自 ntext 类型 理论上应限制为 2 30 个 Unicode 字符 From MSDN 文档 https msdn microsoft com en u
  • nginx:将所有请求发送到单个html页面

    使用 nginx 我想保留 url 但无论如何实际上都会加载相同的页面 我将使用该网址History getState 在我的 javascript 应用程序中路由请求 看起来这应该是一件很简单的事情吧 location rewrite b
  • 重定向弹出窗口并发布消息

    我陷入了一个问题 我必须从弹出窗口重定向到不同的域并向其发布消息 这是场景 用户打开一个新的弹出窗口 该窗口位于同一域中 例如 http doamin one com http doamin one com 用户在弹出窗口中填写表格并单击提
  • 当程序有命令行参数时,如何使用 GDB 分析程序的核心转储文件?

    我的程序是这样运行的 exe p param1 i param2 o param3 它崩溃并生成一个核心转储文件 core pid 我想通过以下方式分析核心转储文件 gdb exe p param1 i param2 o param3 co
  • 如何将 i18n 用于一种语言 cakephp

    我如何设置 i18n 才能翻译成西班牙语 我不希望用户更改应用程序上的语言 所以我只需要用户以西班牙语查看该应用程序 我认为不需要任何路由 我是对的吗 如果您的网站只有一种语言 只需将西班牙语文本直接写入需要的视图文件中即可 无需加倍工作
  • 在 Dockerfile 中如何从网络驱动器复制文件

    我在以下位置托管了一个文件 无法更改 somenetwork somefiles myfile In my Dockerfile我想 COPY somenetwork somefiles myfile opt files file 有没有办
  • 如何以编程方式(在运行时)滑动 RecyclerView 的一行?

    我有一个 RecyclerView 里面有这样的项目 I use ItemTouchHelper SimpleCallback监听 swipe 和 onChildDraw 以在项目被滑动时绘制画布 再多滑动一下 我的问题 我想仅在项目列表中
  • gtk_box_pack_start 和 gtk_container_add 有什么区别?

    在我看来 这两个函数都可以用来向容器添加一些小部件 有什么不同 gtk pack start让您可以更好地控制子窗口小部件如何分配空间 您可以控制子窗口小部件是否 扩展 分配任何额外空间 填充 使用所有分配的空间或仅使用它们请求的最小空间
  • JavaScript - 将带有方法的对象保存为字符串

    我一直在寻找一种方法来做到这一点 但似乎找不到任何东西 我有不同的配置对象 我需要将它们保存为变量中的文本以便稍后进行处理 这里是一个示例 object args config config next null final delimite
  • 阅读此 XML 的好方法是什么?

    阅读此 XML 的好方法是什么 或者也许我可以以不同的方式构建 XML 我想要的是流程成为主要内容 然后您可以遵循任意数量的相关流程
  • 如何阻止 favicon.ico 请求?

    我没有 favicon ico 但我的浏览器总是发出请求 是否可以阻止浏览器从我的网站发出对网站图标的请求 也许 HTML 标头中有一些元标记 我首先要说的是 在网页中拥有网站图标是一件好事 通常 然而 这并不总是理想的 有时开发人员需要一
  • 错误:(gcloud.services.enable)用户无权访问项目(或者可能不存在):调用者没有权限

    我希望编写一个可以从 Cloud Shell 运行的脚本 以便在所有项目中启用 API 它正在成功地完成每个项目 但我收到每个项目都被拒绝的消息 我是所有者 所以不应该有任何许可问题 作为权限测试 如果我仅运行 gcloud service
  • C++三元运算符执行条件

    我不确定 C C 三元运算符的执行保证 例如 如果给我一个地址和一个布尔值来判断该地址是否适合读取 我可以使用 if else 轻松避免读取错误 int foo const bool addressGood const int ptr if
  • 为 jQuery 延迟对象提供默认的“失败”方法

    我正在使用 jQuery 编写一个 Javascript API 客户端 我的顶级请求方法如下所示 function request method uri params proxies var deferred Deferred ajax
  • Fabric.js 直线并单击选择

    我为这段代码创建了 3 种模式 选择行 画线和 删除行 看起来它正在工作 但我想改变两件事 例如 每次我选择一行时 我只需要单击它 你能告诉我如何改进我的代码吗 谢谢您的回答 这是我的代码