javascript - 单击事件坐标与形状位置不同

标签 javascript events canvas html5-canvas

我对 canvas 和 javascript 都很陌生。我试图制作一个按钮,当您单击它时它会执行某些操作。当我为按钮创建点击事件时,我无法弄清楚为什么它不起作用。然后,当我尝试进行故障排除时,我发现矩形的 x、y 坐标与点击事件显示我正在点击的位置完全不同。我完全不知所措。我添加了一些代码只是为了确保我没有发疯。咔嗒声表明我的坐标在 X 轴上开始得更高,尽管它位于 Canvas 的最左侧。

形状在 X = 565 点击显示我在 X = 1161

这是我的代码:

function bigButton(x, y, strTxt)
{
    var getID = document.getElementById("canvas_1");

    if (getID.getContext)
    {
        var btnCtx = getID.getContext("2d");

        btnCtx.font = "Italic 32pt Times";
        btnCtx.textAlign = "center";
        btnCtx.textBaseline = "middle";

        var btnW = 150;
        var btnH = 50;
        var cx = x - btnW/2;
        var cy = y - btnH/2;
        var left = cx;
        var right = cx + btnW;
        var top = cy;
        var bottom = cy + btnH;

        btnCtx.strokeRect(cx, cy, btnW, btnH);
        btnCtx.fillText(strTxt, x, y);
        btnCtx.font = "24pt Helvetica";
        btnCtx.fillText("Coordinates of Rectangle: X = " + cx + " Y = " + cy, cx, cy + 90);

        getID.addEventListener("click", function(event)
        {
            var clickX = event.x;
            var clickY = event.y;
            alert(clickX + " " + clickY);

        }, false);
    }
}

enter image description here

最佳答案

事件中的客户端坐标是相对于客户端窗口的。您当前使用的 xy 属性不是 standard event 的一部分所以无论如何都应该避免使用它们。请改用 clientX/Y 或其中之一。

为了使它们相对于 Canvas ,您可以简单地减去 Canvas 的绝对位置。

这是一种实现方式:

getID.addEventListener("click", function(event) {

    var rect = getID.getBoundingClientRect();  // get abs. region of canvas
    var clickX = event.clientX - rect.left;    // adjust x
    var clickY = event.clientY - rect.top;     // adjust y

    alert(clickX + " " + clickY);

}, false);

还要确保您没有使用 CSS 设置 Canvas 大小,但它是 widthheight 属性(或属性,如果在 JS 中完成),因为位图将被缩放元素大小也会影响鼠标位置(相对于位图)。

如果您对 Canvas 应用填充或边框,它们也会影响相对位置。执行以下任一操作:

  1. 用margin替换padding(margin不影响client rect)并设置display: block;
  2. 将 Canvas 包裹到父 div 元素中并将 CSS 规则应用于父元素
  3. 在公式中减去 border/padding top/left 的大小

关于javascript - 单击事件坐标与形状位置不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22874052/

相关文章:

javascript - DockYard Ember Validations 自定义日期验证器

javascript - 世博会 SQLite promise 拒绝

javascript - vue.js 中设备离线时 Axios 不会失败

javascript - JS/jQuery - 在单个事件处理程序上使用全局事件处理程序

javascript - 等待发出的消息的响应?

javascript - HTML5 Canvas 和缩放

javascript - 字符串中间的正则表达式验证空间

javascript - 如何在事件发生后将标签的值传递给 JavaScript 函数?

javascript - 如何在 Macbook 的网页上测试捏合事件

javascript - 不通过JSON获取kinetic js中的数据