Flash 中的 createjs 按钮不起作用

createjs button in flash is not working

我正在尝试使用 createJs 将 flash 转换为 html5,但是,按钮没有被触发,请通过 downloading sample file here.

检查代码
    this.ReplayBtn = new lib.replayBtn();
    this.ReplayBtn.onClick = function() {
      console.log("clicked");
      this.gotoAndPlay("animate");

    }

这是 jsFiddle link jsfiddle.net/asimkh/sLbgrx08/1

onclick 和类似的事件在不久前已被弃用,因此根据它所针对的 CreateJS 版本,它们将不起作用。请改用 EventDispatcher 方法:

this.ReplayBtn = new lib.replayBtn();
this.ReplayBtn.on("click", handleClick, this);
function handleClick(event) {
  console.log("clicked");
  this.gotoAndPlay("animate");
}

请注意,您的初始代码的范围可能无法正常工作,因为 JavaScript 不维护函数范围 - 所以 this 将是 Window。使用 on() 方法的第三个参数将解决这个问题。

如果您有没有on()的旧版CreateJS,您可以使用:

this.ReplayBtn.addEventListener("click", handleClick.bind(this));

干杯。

进行了快速编辑以修复您在上一个答案的评论中发布的 fiddle。 https://jsfiddle.net/lannymcnie/sLbgrx08/20/

var createjs 在 fiddle 中的位置不佳,导致了一些问题。它本来可以在本地为您工作,而不是在 jsfiddle 上。此 "fixed" 版本显示了您的初始问题。


剩下的问题是您的图片正在加载 cross-domain,导致您点击时出错。这是因为 EaselJS 鼠标交互需要像素访问,但 cross-domain 图像使 canvas "dirty" 阻止了它。你可以在控制台看到这个错误,而且看起来你还把这个错误复制到了Flash时间轴中,所以你一定看到了。

Uncaught An error has occurred. This is most likely due to security restrictions on reading canvas pixel data with local or cross-domain images.

您无法使用您指向的 CDN 真正解决这个问题,因为它不发送 cross-origin headers,这是必需的。此外,旧版本的 PreloadJS 不支持cross-origin。

我对您的代码进行了快速修改,从支持 cross-origin 请求(我的测试域)的来源手动预加载图像,并使其正常运行。它对 CreateJS 生成的代码进行了一些修改以使其正确预加载,但请注意,该库的较新版本支持这个没问题。 https://jsfiddle.net/lannymcnie/sLbgrx08/22/

此外,我对您的框架脚本进行了一些更改:

  1. 不建议在您的 frame_0 中放入阶段滴答和设置等核心逻辑。阶段更新已经在 HTML 文件中,所以使用它。将您的 JavaScript 外部化到 FLA 之外也很好。
  2. 我绑定了您的点击处理程序,就像我在之前的回答中提到的那样。这将确保在正确的范围内调用函数:

this.ReplayBtn.onClick = clickHandler.bind(this);

  1. 您定义和调用 animateCall 函数的方式 可能 有效,但它确实很具体。由于您已经在该剪辑上定义了函数,因此只需在该范围内调用它即可。框架脚本的范围仅限于它们所在的剪辑:

this.animateCall();

  1. 当您调用 animateCall 时,您将转到 "animate" 标签,即第 0 帧。这会导致再次调用第 0 帧脚本(从 Flash 外部化您的 JS 的另一个原因).我暂时将 gotoAndPlay 注释掉了。

希望对您有所帮助。

我检查了你的按钮。它不适用于 main .jpg。所以不要将您的 .jpg 位图制作成影片剪辑。您需要重新创建另一个不透明度为 0 的矩形并将其命名为 "ReplayBtn"