有没有一种方法可以将事件处理程序附加到canvas
元素的更改事件上?每当绘制任何内容时,我都需要触发一个函数。
有没有一种方法可以将事件处理程序附加到canvas
元素的更改事件上?每当绘制任何内容时,我都需要触发一个函数。
不,canvas
元素不提供任何事件,它只是一个普通的位图。
如果你真的想要做到这一点,在你的事件中劫持所有的context
调用,然后调用之前拷贝过的原始函数。
我的建议:
不要这样做,它会变得很慢且难以维护。相反,改变你应用的设计,你可以创建自定义的绘图函数,将画布抽象化,并将事件功能放在那里。
这也有一个额外的好处,即在做大量的绘图时少了一些context.*
的调用(因此代码更加简洁)。
如果需要跟踪这些命令,我会实际上包装画布。以下是一个简单的示例,仅跟踪几个方法:
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' );
对于我来说,我在画布上附加了一个点击事件,并且能够检测到是否在画布上绘制了任何东西。
这里是示例 - http://jsfiddle.net/ashwyn/egXhT/2/
查找文本//Event if Drawn
,您将理解其位置。