在多个画布中无缝绘图

2023-12-22

我正在尝试使用 JS 和 Canvas 元素制作一个简单的绘图工具。我的问题是我想要几个画布,并且用户应该能够在所有画布上画一条线。这是我做的一个小页面:

<!DOCTYPE html>
<html>
<head>

    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>

    <script type="text/javascript">

        var act = null;
        var context = null;
        var draw = false;
        var c = false;

        function boot() {
            $('.can')
                .mouseenter(function(){
                    act = this;
                    context = act.getContext('2d');
                   // console.log(this);

                })
                .mouseleave(function(){
                    act = null;
                    context = null;
               //     console.log('out');
                })
                .mousedown(function(){
                    draw = true;
                })
                .mouseup(function(){
                    draw = false;
                })
                .mousemove(function(ev){

                //    console.log(act);
                      if (ev.layerX || ev.layerX == 0) { // Firefox
                        x = ev.layerX;
                        y = ev.layerY;
                      } else if (ev.offsetX || ev.offsetX == 0) { // Opera
                        x = ev.offsetX;
                        y = ev.offsetY;
                      }

                    if(draw && context != null)
                      if (!c) {
                        context.beginPath();
                        context.moveTo(x, y);
                        c = true;
                      } else {
                        context.lineTo(x, y);
                        context.stroke();
                      }
                });
        }

        $(document).ready(boot); 
    </script>

    <style>
        .can {border: 1px solid blue; display:block; float:left; margin:0;}
    </style>

</head>

<body>
    <canvas class="can" id="c2" width="200" height="200"></canvas>
    <canvas class="can" id="c1" width="200" height="200"></canvas>
    <canvas class="can" id="c3" width="200" height="200"></canvas>
</body>
</html>

它部分有效:我只能在第一个画布上绘制。 我调试了它,我真的很困惑,因为上下文按预期更改,并且仅在第一个画布中启用了绘图。

有什么想法造成这种行为的原因吗?


好的,我已经找到问题的根源了。原文在这里:

http://jsfiddle.net/CVFv5/4/ http://jsfiddle.net/CVFv5/4/

固定版本在这里:

http://jsfiddle.net/CVFv5/3/ http://jsfiddle.net/CVFv5/3/

基本上,问题是您没有正确计算 X 和 Y 变量。.offsetX and .offsetY计算相对于元素的直接祖先(在本例中为页面主体)的 x 和 y 位置。您可以通过在鼠标悬停时提醒 x 和 y 值来看到这一点。无论如何,你必须做的是:

var o = $(this).offset(),
    x = (ev.pageX - o.left),
    y = (ev.pageY - o.top);

我更改了您的代码还存在一些其他问题。首先,您没有为每个画布开始新路径,因此当您重新进入画布时,它会lineTo(x, y)从线路中断的地方开始。为了解决这个问题,我将鼠标悬停事件设置为如下所示:

.mouseout(function() {
    c=false;
})

现在,每当它进入新的画布时,它就会开始一条新的路径。

我改变的第三件事是让它只创建上下文once文件准备好。我想这可以节省一点处理时间。所以我在全局范围内添加了这一行:

var contexts = [];

这个方法在你的$('.can')方法链:

.each(function(el) {
    id = this.id;
    contexts[id] = this.getContext('2d');
})

因此,在代码的其他任何地方,您都可以像这样引用它:

contexts[this.id].beginPath();

现在它起作用了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在多个画布中无缝绘图 的相关文章

  • 从 HTTP 登录到 HTTPS

    我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • JavaScript 验证和 PHP 验证?

    我正在使用 jquery 验证插件来验证空表单 我还应该在 PHP 中检查一下以确保 100 正确吗 或者用 javascript 验证就可以了 谢谢 您应该始终在服务器上进行验证 如果用户以某种方式不使用 Javascript 提交表单
  • 如何通过单击链接来更改 div 的内容?

    这是我的网页的 修改后的 jsfiddle 它还有很多 而且定位是正确的 与此相反 http jsfiddle net ry0tec3p 1 http jsfiddle net ry0tec3p 1 a href class btn1 st
  • 如何使用角度材料在具有可扩展行的表格中创建嵌套垫表

    我有以下数据 id c9d5ab1a subdomain wing domain aircraft part id c9d5ab1a info mimetype application json info dependent parent
  • onclick 事件中未调用函数

    我想在每个 YouTube 链接的末尾添加一些 HTML 以在 litebox 中打开播放器 到目前为止 这是我的代码 document ready function var valid url new RegExp youtube com
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • 表单发布请求并存储收到的数据

    我有一个非常简单的表单 在提交时发出发布请求
  • 聆听 Angular 2 中的元素可见性

    我正在为我的网络应用程序使用 Bootstrap 和 Angular 2 v4 我想监听指令中的元素以了解可见性变化 我的元素有一个可以隐藏其子元素的父元素hidden sm up我需要在每次隐藏或显示时触发一个函数 div hidden
  • 用于选择特定 div 中具有特定类的锚元素的 jQuery 选择器是什么

    我有一些这样的代码 我想选择每个 a 带有类的标签status在 div 中foo div a class status a div 你可以这样做 foo find status a
  • 使用 CSS 折叠和展开元素

    我正在尝试构建一个页面 加载时仅可见标题 并且 当用户单击标题时 每个标题下方的表格会在隐藏和显示状态之间切换 我的限制是只能在 CSS 中执行此操作 这是我到目前为止想到的 https jsfiddle net Argoron c1ypx
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • react-native - 图像需要来自 JSON 的本地路径

    你好社区 我正在react native中开发一个测试应用程序 并尝试从本地存储位置获取图像 我实际在做什么 我将图像直接链接源提供给 var 并在渲染函数中调用此方法 react 0 14 8 react native 0 23 1 np
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • 什么是 WKWebView 中的 WKErrorDomain 错误 4

    fatal error LPWebView encounters an error Error Domain WKErrorDomain Code 4 A JavaScript exception occurred UserInfo 0x7
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容

随机推荐

  • Java 对象、更改字段侦听器、设计模式

    有一个类 public class MyClass private String field1 private String field2 private String field3 getters setters 然后我们更新一些字段 M
  • 尽管 flex-basis: 0 [重复],Flexbox 项目的宽度并不相等

    这个问题在这里已经有答案了 我在 Flexbox 中有 4 列 我希望它们的宽度相等 那个有overflow hidden比其他人占据更多的位置 而我无法修复它 在我看来 我遇到了与这篇文章中所述相同的问题 Flexbox 和溢出隐藏无法正
  • 使用“从浏览器中单击”按钮打开客户端的桌面应用程序 - Python/HTML [重复]

    这个问题在这里已经有答案了 我想打开桌面应用程序 例如 记事本 Powerpoint Putty 附上它在共享点上如何工作的图像 随附的示例图像显示了如何通过单击按钮打开 Microsoft Teams 我需要这个精确的复制品 单击 打开
  • Visual Studio 2015 调试并继续

    我们将环境从 Visual Studio 2008 更改为 2015 更新 1 现在我们遇到了一些奇怪的调试行为 当我们遇到断点并更改一些代码并继续时 我们无法再在快速监视或立即窗口中看到某些类型的变量内容 例如数据表 图像 A type
  • 如何测试 PHP 程序? [复制]

    这个问题在这里已经有答案了 有没有办法测试程序代码 我一直在研究 PHPUnit 它似乎是创建自动化测试的好方法 然而 它似乎是面向面向对象的代码 是否有过程代码的替代方案 或者我应该在尝试测试网站之前将网站转换为面向对象 这可能需要一段时
  • System.Text.Json 将字典序列化为数组

    是否可以使用 System Text Json 将字典序列化 和反序列化 为数组 代替 hello world 我需要将我的字典序列化为 key hello value world 最好不必在我的类的字典属性上设置属性 使用 newtons
  • 在Python中的图像中的表格上创建边框

    我有一个图像 其中有一个表格和一些其他数据 我需要为表格绘制边框以分隔每个单元格 My image looks like this What i am trying 1 dilating the image to create contin
  • java读取上传文件的内容

    我知道如何上传文件
  • 如何拦截自定义 HTTP 标头值并将其存储在 Wicket 的 WebSession 中?

    我需要从每个请求中获取特定的自定义 HTTP 标头值并将其放入 WebSession 中 以便以后可以在任何网页上使用它 我相信 Wicket 的方法是使用一个自定义类来扩展具有适当访问器的 WebSession 我的问题是 我需要什么样的
  • Iphone SDK,从 UIImage 创建视频

    我需要根据所选图像创建视频 我有代码它应该可以工作 但在附加缓冲区时给出错误 这就是两种类型图像的保存方式 void imagePickerController UIImagePickerController picker didFinis
  • 多个控制器和指令之间的通信

    我有一个支持 HTML5 Canvas 可视化的指令 该指令具有多种方法来修改可视化的不同部分 问题是具有不同父 子 兄弟关系的多个控制器需要与该指令进行通信 现在我已经将这种非常糟糕的方式连接起来 将事件发送到指令的父控制器 然后将它们广
  • Magento 1.7:在 2 列模板中以全宽显示类别页面上的类别图像

    无法找到运行 Magento 1 7 时此问题的解决方案 上面主栏中显示的类别 我想将其显示在两列上方的页面宽度上 这是一个例子 http www vimodos nl schoenen art sex 92 http www vimodo
  • 在struts 2中调用带参数的方法?

    我在 struts 2 动作类中给出了下面的方法 public String add String boo codes here 我想调用add方法 还有我的struts xml
  • 如何在 PHP 中对数字进行四舍五入

    我经营一个 woocommerce 网站 重量以磅为单位 我需要将它们转换为公斤 我从网站下载了这个脚本 它完成了这项工作 但它设置了带有很多小数的新权重 不知道如何四舍五入 我试图使用round new weight 2 但它没有接受或不
  • 串口未接收到任何数据

    我正在开发需要与 COM 端口交互的程序 通过本次问答了解到 NET SerialPort DataReceived 事件未触发 https stackoverflow com questions 2281618 net serialpor
  • 如何避免用户提交的MySQL数据库存储重复的内容

    我正在创建一个网站 允许用户列出最多 5 家与他们关联的公司 当其他用户搜索这些公司时 与该公司关联的所有用户都会显示在搜索结果中 用户将通过文本输入字段提交这些公司 如何避免用户提交重复的公司 例如 如果UserA提交了一家名为stack
  • 将所有存储过程和函数从一个 SQL Server 一次性复制到另一个 SQL Server 的最简单方法

    我需要将所有存储过程和函数立即从一个 SQL Server 数据库复制到另一个数据库 有可能吗 在 SQL Server Management Studio 中 转到对象资源管理器 找到你的数据库 右键单击它 gt Tasks gt Gen
  • ThreeJS collada 文件未居中

    我是 ThreeJS 的新手 我正在尝试将 collada 文件加载到查看器中 我首先复制 Elf colladaLoader 演示的代码 https trijs org examples webgl loader collada http
  • 使用 OpenCV 进行视频稳定

    我有一个用移动摄像机拍摄的视频 其中包含移动的物体 我想稳定视频 以便所有静止物体在视频源中保持静止 我怎样才能做到这一点OpenCV 即 例如 如果我有两个图像 prev frame 和 next frame 我该如何转换下一帧所以摄像机
  • 在多个画布中无缝绘图

    我正在尝试使用 JS 和 Canvas 元素制作一个简单的绘图工具 我的问题是我想要几个画布 并且用户应该能够在所有画布上画一条线 这是我做的一个小页面