Javascript 如何将事件侦听器添加到画布中的图像?

Javascript 如何将事件侦听器添加到画布中的图像?,javascript,html,canvas,Javascript,Html,Canvas,我需要在画布中的图像上附加一些鼠标事件 我试过了,但还是不行 var pointer = new Image(); pointer.src = "/img/line_point.png"; pointer.onload = function() { context.drawImage(pointer, 55,123); } pointer.addEventListener("mouseover", maap, false); 您需要将事件

我需要在画布中的图像上附加一些鼠标事件

我试过了,但还是不行

    var pointer = new Image();
    pointer.src = "/img/line_point.png";
    pointer.onload = function() {
        context.drawImage(pointer, 55,123);
    }
    pointer.addEventListener("mouseover", maap, false);

您需要将事件侦听器添加到画布元素,然后手动检查事件x和y参数是否在画布上绘制的图像上。

您需要将事件侦听器添加到画布元素,然后手动检查事件x和y参数是否在画布上绘制的图像上。

a
canvas
没有一个结构来记忆绘制到其中的对象。它只是一个有像素的
平面
画布。如果需要使用其中的对象,请切换到。Javascript中有许多
SVG
库。比如

使用普通svg,您可以像

<svg width="4in" height="3in" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <image id="myImg" x="200" y="200" width="100px" height="100px"></image>
</svg>

您甚至可以使用
document.getElementById('myImg')
jQuery('#myImg')
向其中添加事件


如果您想继续使用画布,请将事件侦听器添加到画布本身并检查坐标。

a
Canvas
没有用于记住绘制到其中的对象的结构。它只是一个有像素的
平面
画布。如果需要使用其中的对象,请切换到。Javascript中有许多
SVG
库。比如

使用普通svg,您可以像

<svg width="4in" height="3in" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <image id="myImg" x="200" y="200" width="100px" height="100px"></image>
</svg>

您甚至可以使用
document.getElementById('myImg')
jQuery('#myImg')
向其中添加事件


如果您想坚持使用画布,请向画布本身添加一个事件侦听器并检查坐标。

如果您想这样附加事件,最好使用SVG。

如果您想这样附加事件,最好使用SVG。

将画布想象成教室中的白板。无论老师在白板上写什么或画什么,都是白板的一部分,你不能选择任何一个。如果你想从板上挑选一些东西,你可以使用软板,在软板上放置物体,然后将它们从一个位置移动到另一个位置。SVG是软板的一个示例,这里的每个图形(如直线、圆弧)都是对象,您可以在它们上添加单击侦听器


如果希望画布的行为类似于SVG,则必须对其进行处理。您可以在画布上添加click listener,并且无论何时在其上接收到事件,都需要计算该事件发生在哪个元素上

把画布想象成教室里的白板。无论老师在白板上写什么或画什么,都是白板的一部分,你不能选择任何一个。如果你想从板上挑选一些东西,你可以使用软板,在软板上放置物体,然后将它们从一个位置移动到另一个位置。SVG是软板的一个示例,这里的每个图形(如直线、圆弧)都是对象,您可以在它们上添加单击侦听器


如果希望画布的行为类似于SVG,则必须对其进行处理。您可以在画布上添加click listener,并且无论何时在其上接收到事件,都需要计算该事件发生在哪个元素上

使用David Geary的最新优秀著作《核心HTML5画布》中的相关样本来复兴旧线程。这在我的应用程序中运行良好

mycanvas.onmousedown = function (e) {
    var loc = windowToCanvas(e.clientX, e.clientY);
    $('#outputXY').val(loc.x + ',' + loc.y);
};

mycanvas.onmousemove = function (e) {
    var loc = windowToCanvas(e.clientX, e.clientY);
    $('#outputXY').val(loc.x + ',' + loc.y);
};

function windowToCanvas(x, y) {
    var r = mycanvas.getBoundingClientRect();
    return { x: x - r.left * (mycanvas.width  / r.width),
             y: y - r.top  * (mycanvas.height / r.height)};
};

用DavidGeary最近出版的优秀书籍《核心HTML5画布》中的相关样本来复活旧线程。这在我的应用程序中运行良好

mycanvas.onmousedown = function (e) {
    var loc = windowToCanvas(e.clientX, e.clientY);
    $('#outputXY').val(loc.x + ',' + loc.y);
};

mycanvas.onmousemove = function (e) {
    var loc = windowToCanvas(e.clientX, e.clientY);
    $('#outputXY').val(loc.x + ',' + loc.y);
};

function windowToCanvas(x, y) {
    var r = mycanvas.getBoundingClientRect();
    return { x: x - r.left * (mycanvas.width  / r.width),
             y: y - r.top  * (mycanvas.height / r.height)};
};

有可能找到更灵活的解决方案吗?事件侦听器绑定到元素。您仅有的元素是canvas元素。是否有可能找到更灵活的解决方案?事件侦听器绑定到元素。您仅有的元素是canvas元素。请像使用canvas库一样使用。下面的答案是什么样的代码?我也有同样的问题!使用画布库。下面的答案是什么样的代码?我也有同样的问题!