Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.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
将事件发送到createjs.Stage子对象(或一般的JavaScript对象)?_Javascript_Html_Webkit_Easeljs_Createjs - Fatal编程技术网

将事件发送到createjs.Stage子对象(或一般的JavaScript对象)?

将事件发送到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

我正在用EaselJS开发一个HTML5应用程序,它使用覆盖整个窗口的画布元素来显示其界面。我使用以下函数修复画布边界,以防用户调整窗口大小:

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
本身是一个
容器(它的大多数子容器也是如此),因此它的工作非常出色。现在我将避开事件。事件并不坏:)-在某些情况下使用它们是有意义的。但是您可以记住:事件比直接方法调用慢,因此当涉及到许多对象/调用时,使用直接调用而不是事件可能是正确的