CreateJS 针对 mc 范围问题
CreateJS targeting mc scope issue
在使用 CreateJS 的 Adobe AnimateCC 中,我在第一帧上有一个名为 disclaimer_btn
的 mc,在名为 discTxt
的第一帧上有一个 mc。我希望能够在 discTxt
中的框架标签上将鼠标悬停在 disclaimer_btn
上并转到 gotoAndStop。在第 150 帧左右,我尝试进行鼠标悬停,但它不起作用。如果我在我的函数中使用警告框,那就行得通了。
错误是Uncaught TypeError: Cannot read property 'bind' of undefined
,在代码中它指向这里.bind(this));
如果我从 this.discTxt.fl_MouseOverHandler.bind(this));
之前删除 this.discTxt
,我会得到错误 Uncaught ReferenceError: fl_MouseOverHandler is not defined
。
我已阅读 and 并且这些解决方案在这种情况下对我不起作用。
我知道这是一个范围问题,我在这里做错了什么?
var frequency = 3;
stage.enableMouseOver(frequency);
this.disclaimer_btn.addEventListener("mouseover", this.discTxt.fl_MouseOverHandler.bind(this));
this.fl_MouseOverHandler = function()
{
this.discTxt.gotoAndStop("on");
}
这只是顺序的问题。因为您必须将函数定义为 this
上的变量,所以函数定义不会“提升”。首先定义提升函数,无论它们在代码中定义的顺序如何。
// Hoisted
function myFunction() {}
// Not hoisted
var myFunction = function() {}
this.myFunction = function() {}
在第二个示例中,定义了变量本身,但在您设置它的那一行之前它将为空。您可以通过将 addEventListener
移动到该行下方来解决此问题,以便在定义函数后调用它。
或者,更改为托管方法并绑定:
btn.addEventListener("click", myFunction.bind(this));
function myFunction() {}
您还可以使用 on
,它是 addEventListener
的 CreateJS 函数替代品,它具有一些语法糖,例如范围参数。
btn.on("click", myFunction, this);
最后,如果您确实使用 this
定义函数,请确保传递正确的值。在您的示例中,您在 this
上定义函数,但将其作为 this.discTxt
的 属性 传递。除非 this.discTxt
是另一个 MovieClip,并且该函数是在那里定义的,否则您将传递 null。
TLDR:
- 如果您将函数定义为
this
上的 属性,则将其移至 `addEventListener 下方
- 或更改它以便使用
function myFunction()
定义函数并绑定它。
在使用 CreateJS 的 Adobe AnimateCC 中,我在第一帧上有一个名为 disclaimer_btn
的 mc,在名为 discTxt
的第一帧上有一个 mc。我希望能够在 discTxt
中的框架标签上将鼠标悬停在 disclaimer_btn
上并转到 gotoAndStop。在第 150 帧左右,我尝试进行鼠标悬停,但它不起作用。如果我在我的函数中使用警告框,那就行得通了。
错误是Uncaught TypeError: Cannot read property 'bind' of undefined
,在代码中它指向这里.bind(this));
如果我从 this.discTxt.fl_MouseOverHandler.bind(this));
之前删除 this.discTxt
,我会得到错误 Uncaught ReferenceError: fl_MouseOverHandler is not defined
。
我已阅读
我知道这是一个范围问题,我在这里做错了什么?
var frequency = 3;
stage.enableMouseOver(frequency);
this.disclaimer_btn.addEventListener("mouseover", this.discTxt.fl_MouseOverHandler.bind(this));
this.fl_MouseOverHandler = function()
{
this.discTxt.gotoAndStop("on");
}
这只是顺序的问题。因为您必须将函数定义为 this
上的变量,所以函数定义不会“提升”。首先定义提升函数,无论它们在代码中定义的顺序如何。
// Hoisted
function myFunction() {}
// Not hoisted
var myFunction = function() {}
this.myFunction = function() {}
在第二个示例中,定义了变量本身,但在您设置它的那一行之前它将为空。您可以通过将 addEventListener
移动到该行下方来解决此问题,以便在定义函数后调用它。
或者,更改为托管方法并绑定:
btn.addEventListener("click", myFunction.bind(this));
function myFunction() {}
您还可以使用 on
,它是 addEventListener
的 CreateJS 函数替代品,它具有一些语法糖,例如范围参数。
btn.on("click", myFunction, this);
最后,如果您确实使用 this
定义函数,请确保传递正确的值。在您的示例中,您在 this
上定义函数,但将其作为 this.discTxt
的 属性 传递。除非 this.discTxt
是另一个 MovieClip,并且该函数是在那里定义的,否则您将传递 null。
TLDR:
- 如果您将函数定义为
this
上的 属性,则将其移至 `addEventListener 下方
- 或更改它以便使用
function myFunction()
定义函数并绑定它。