canvas元素是否有“变化”事件?

发布于 2024-10-11 06:03:29 字数 100 浏览 1 评论 0原文

有没有办法将事件处理程序附加到 canvas 元素的 change 上?每当有东西在上面绘制任何东西时,我就需要触发一个函数。

Is there a way to attach event handler to a change of a canvas element? I need to fire a function whenever something draws anything on it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

一江春梦 2024-10-18 06:03:29

不,canvas 元素不提供任何事件,它只是一个普通的位图。

如果您确实想这样做,请劫持事件中内置的上下文上的所有调用,然后调用原始函数(您之前已复制)。

我的建议:
不要这样做,会很慢并且难以维护。相反,您可以更改应用程序的设计,例如,您可以创建自定义绘图函数,该函数将抽象画布并将事件内容放入其中。

在进行大量绘图时,这还会带来额外的好处,即减少 context.* 调用(因此代码更干净)。

No, the canvas element does not provide any events, it's just a plain bitmap.

If you really want to do this, hijack all the calls on a context built in your events and then call the original function (which you have copied previously).

My advice:
Do not do the above, it will be slow and hard to maintain. Instead change the design of your application, you could, for one, make custom drawing functions which will abstract the canvas and put in the event stuff there.

This would also have the added benefit of less context.* calls (therefore cleaner code) when doing a lot of drawing.

北凤男飞 2024-10-18 06:03:29

您可以使用 mouseup 事件。

canvasElement.addEventListener('mouseup', e => {
  // Fire function!
});

// or jQuery    
$('canvas').on('mouseup', function() {
  // Fire function!
});

上面的 mouseup 文档实际上有一个很好的画布示例

You could use the mouseup event.

canvasElement.addEventListener('mouseup', e => {
  // Fire function!
});

// or jQuery    
$('canvas').on('mouseup', function() {
  // Fire function!
});

The mouseup docs above actually have a good canvas example

御守 2024-10-18 06:03:29

如果需要跟踪这些命令,我​​实际上会包装画布。这是一个仅跟踪几种方法的简单示例:

function eventOnDraw( ctx, eventName ){
  var fireEvent = function(){
    var evt = document.createEvent("Events");
    evt.initEvent(eventName, true, true);
    ctx.canvas.dispatchEvent( evt );
  }
  var stroke = ctx.stroke;
  ctx.stroke = function(){
    stroke.call(this);
    fireEvent();
  };
  var fillRect = ctx.fillRect;
  ctx.fillRect = function(x,y,w,h){
    fillRect.call(this,x,y,w,h);
    fireEvent();
  };
  var fill = ctx.fill;
  ctx.fill = function(){
    fill.call(this);
    fireEvent();
  };
}

...

var myContext = someCanvasElement.getContext('2d');
someCanvasElement.addEventListener( 'blargle', myHandler, false );
eventOnDraw( myContext, 'blargle' );

I would actually wrap the canvas iff needed to track these commands. Here's a simple example tracking only for a few methods:

function eventOnDraw( ctx, eventName ){
  var fireEvent = function(){
    var evt = document.createEvent("Events");
    evt.initEvent(eventName, true, true);
    ctx.canvas.dispatchEvent( evt );
  }
  var stroke = ctx.stroke;
  ctx.stroke = function(){
    stroke.call(this);
    fireEvent();
  };
  var fillRect = ctx.fillRect;
  ctx.fillRect = function(x,y,w,h){
    fillRect.call(this,x,y,w,h);
    fireEvent();
  };
  var fill = ctx.fill;
  ctx.fill = function(){
    fill.call(this);
    fireEvent();
  };
}

...

var myContext = someCanvasElement.getContext('2d');
someCanvasElement.addEventListener( 'blargle', myHandler, false );
eventOnDraw( myContext, 'blargle' );
眼眸里的快感 2024-10-18 06:03:29

对我来说,我在画布上附加了一个单击事件,并且我能够检测该画布上是否绘制了任何内容。

在这里小提琴 - http://jsfiddle.net/ashwyn/egXhT/2/

检查文本//Event if Drawn 你就会明白在哪里。

For me I attached a click event on the canvas and I am able to detect if any thing is drawn on that canvas.

Fiddle here - http://jsfiddle.net/ashwyn/egXhT/2/

Check for text //Event if Drawn and you will understand where.

愛放△進行李 2024-10-18 06:03:29

不存在事件处理程序,所以这就是我所做的:

我的图像操作程序(不是绘画包)使用两个画布;

一个用于操作,另一个用于撤消功能...

<canvas id="C"></canvas>

<canvas id="U"></canvas>

因此,在需要时可以轻松比较它们以进行更改。

要查询它们是否相同:

let Same = C.toDataURL()===U.toDataURL();

或返回相反的状态...找出它们是否已更改:

let Changed = C.toDataURL()!==U.toDataURL();

我希望这有帮助。

No event handler exists so here's what I do:

My image manipulating program (not a paint package) uses two canvases;

One for manipulation and the other for the undo function...

<canvas id="C"></canvas>

<canvas id="U"></canvas>

So it's easy to compare them for change whenever needed.

To query if they're the same:

let Same = C.toDataURL()===U.toDataURL();

Or return the reverse state... find out if they've changed:

let Changed = C.toDataURL()!==U.toDataURL();

I hope this helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文