Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我只能从矩形的某个点得到数据,而不是整个矩形_Javascript_Html_Image_Events_Canvas - Fatal编程技术网

Javascript 我只能从矩形的某个点得到数据,而不是整个矩形

Javascript 我只能从矩形的某个点得到数据,而不是整个矩形,javascript,html,image,events,canvas,Javascript,Html,Image,Events,Canvas,我正在尝试为HTML画布实现eventListener。 我想从SVG画布向rect添加事件 问题是 我只能从矩形的某个点得到数据,而不是整个矩形 canvas.addEventListener("click", e => { this.mousePos = { x: e.clientX - canvas.offsetLeft, y: e.clientY - canvas.offsetTop

我正在尝试为HTML画布实现eventListener。 我想从SVG画布向rect添加事件

问题是 我只能从矩形的某个点得到数据,而不是整个矩形

canvas.addEventListener("click", e => {
          this.mousePos = {
            x: e.clientX - canvas.offsetLeft,
            y: e.clientY - canvas.offsetTop
          };
          console.log(this.mousePos.x, this.mousePos.y);

          const pixel = hitCtx.getImageData(
            this.mousePos.x,
            this.mousePos.y,
            1,
            1
          ).data;
          console.log(pixel);

          var r = pixel[0];
          var g = pixel[1];
          var b = pixel[2];
          const color = "rgb(" + r + "," + g + "," + b + ")";

          console.log(color);
  
          if (color == "rgb(255,59,59)") {
            console.log("click on the pipe");
          }
});

我读了这篇文章,并遵循了第二种方法,即使用颜色

你可以试试这个

let canvas = document.querySelector("canvas");
let rect = canvas.getBoundingClientRect();
let x = e.clientX - rect.left;
let y = e.clientY - rect.top;
console.log(rect);

最初的目的是检查用户是否单击了画布中的红色矩形

给出的代码试图通过查看单击位置的像素并确定它是否为颜色(一种红色)来实现这一点。如果没有,则没有单击“管道”

然而,在给定的代码笔中,该测试是在正确的位置进行的,而不是在绘制了红色管道的画布上。而是在画布上完成。如果我们更改为在绘制红色管道的画布上进行测试,则会得到正确的单击

const canvas=document.getElementById('canvas');
const ctx=canvas.getContext('2d');
const hitCanvas=document.createElement('canvas');
const hitCtx=hitCanvas.getContext('2d');
画布宽度=300;
画布高度=200;
宽度=300;
高度=200;
var宽度=300;
var高度=10;
var startX=0;
var-startY=100;
ctx.beginPath();
ctx.translate(200,30);
ctx.旋转((31.5*Math.PI)/-180);
ctx.translate(-225,-65);
ctx.rect(this.startX,this.startY,this.width,this.height);
ctx.fillStyle=“#ff3b3b”;
ctx.fill();
hitCtx.beginPath();
hitCtx.translate(200,30);
hitCtx.旋转((-1*Math.PI)/-180);
hitCtx.translate(-225,-40);
hitCtx.rect(this.startX,this.startY,this.width,this.height);
hitCtx.fillStyle=“#ff3b3b”;
hitCtx.fill();
canvas.addEventListener(“单击”,e=>{
此参数为0.mousePos={
x:e.clientX-canvas.offsetLeft,
y:e.clientY-canvas.offsetTop
};
log(this.mousePos.x,this.mousePos.y);
const pixel=ctx.getImageData(//更改为ctx以确保我们的测试位于红色矩形上*/
这是mousePos.x,
这个,老鼠皮,
1.
1.
).数据;
控制台日志(像素);
var r=像素[0];
var g=像素[1];
var b=像素[2];
const color=“rgb”(“+r+”、“+g+”、“+b+”);
控制台。日志(颜色);
如果(颜色=“rgb(255,59,59)”){
log(“点击管道”);
}
});
正文{
保证金:0;
填充:0;
}

您似乎在名为canvas的元素上绘制了管道,即红线,但在名为hitCanvas的画布上测试了单击的像素,该画布上除了一个像素之外似乎什么都没有。应该在画布上绘制的内容。而且,这似乎与SVG没有任何关系。“你的密码笔里少了什么东西吗?”哈沃斯抱歉。我打错了它只是为了HTML画布。我会编辑。我还阅读了这篇关于按颜色添加画布事件的文章。我将把这篇文章添加到我的帖子中。我编辑我的密码笔。感谢您的反馈!你的想法是在画布上画其他东西,但通过在画布上覆盖一个图表管道来测试它是否在管道上?@霍沃斯说得对。我想将事件添加到红管,而不是整个画布overlay@A霍沃斯:我不确定。检查矩形,它在没有其他画布的情况下运行良好。谢谢你的评论。