将事件发送到createjs.Stage子对象(或一般的JavaScript对象)?
我正在用EaselJS开发一个HTML5应用程序,它使用覆盖整个窗口的画布元素来显示其界面。我使用以下函数修复画布边界,以防用户调整窗口大小:将事件发送到createjs.Stage子对象(或一般的JavaScript对象)?,javascript,html,webkit,easeljs,createjs,Javascript,Html,Webkit,Easeljs,Createjs,我正在用EaselJS开发一个HTML5应用程序,它使用覆盖整个窗口的画布元素来显示其界面。我使用以下函数修复画布边界,以防用户调整窗口大小: function resizeCanvas(event) { if (window.onresize == null) window.onresize = resizeCanvas; canvas.width = document.body.clientWidth; canvas.height = document.body.clientH
function resizeCanvas(event) {
if (window.onresize == null) window.onresize = resizeCanvas;
canvas.width = document.body.clientWidth;
canvas.height = document.body.clientHeight;
stage.update();
}
但是,当画布边界更改时,其某些元素(createjs.Stage()对象的子元素)也必须更改。理想情况下,我希望resizeCanvas()
简单地分派一个事件,并让适当的stage.children()
对象响应。我尝试在上述函数中添加以下行:stage.dispatchEvent(event)
并创建如下形状对象:
var grid = new createjs.Shape(drawGrid());
grid.addEventListener('resize', function(evt) { alert(evt); }, false);
stage.addChild(grid);
stage.addEventListener('resize', function(evt) { grid.resize(); });
// the grid-object ofc needs a resize-method that handles the event
// also: anonymous functions make this way a complete hassle, but
// you will very likely need the scope of the 'grid' here...
但是,这不起作用,我似乎严重误解了事件。addEventListener()将侦听对象本身发送的事件,而不是对象接收的事件,因此您的行:
grid.addEventListener('resize', function(evt) { alert(evt); }, false);
当网格
发出调整大小
-事件时,而不是当它收到事件时,将发出警报
,因此您必须使用grid.dispatchEvent('resize')
,以获取警报,在这种情况下。。你已经有了这个对象,为什么要调度evnt,如果你能马上调用size方法的话——这就像是一个鸡蛋问题——在这种情况下,如果网格中有孩子在听这个事件,这是有意义的
如果您真的想在这里处理事件,您必须为要调整大小的每个元素向中心对象(可能是stage
)添加一个侦听器,如下所示:
var grid = new createjs.Shape(drawGrid());
grid.addEventListener('resize', function(evt) { alert(evt); }, false);
stage.addChild(grid);
stage.addEventListener('resize', function(evt) { grid.resize(); });
// the grid-object ofc needs a resize-method that handles the event
// also: anonymous functions make this way a complete hassle, but
// you will very likely need the scope of the 'grid' here...
最后,您需要让stage分派resize事件,因此在您在resizeCanvas()
中添加stage.update()
之前:
stage.dispatchEvent('resize');
// optionally you can dispatch with an object that contains additional data
我会怎么做(我不知道这种方式是好是坏,只是我会怎么做):
我将编写一个递归方法,在每个孩子及其孩子身上调用resize方法,从stage开始,而不是使用事件。感谢您的解释和提示;我现在对这个问题有点了解了。最后,我添加了一个
createjs.Container.prototype.resize
方法,该方法对实现它的子级递归调用.resize()
。由于stage
本身是一个容器(它的大多数子容器也是如此),因此它的工作非常出色。现在我将避开事件。事件并不坏:)-在某些情况下使用它们是有意义的。但是您可以记住:事件比直接方法调用慢,因此当涉及到许多对象/调用时,使用直接调用而不是事件可能是正确的