3

我已经使用 google swiffy v5.2 转换了多个 swf 文件,并且我的新动画将显示在许多不同的页面上,其中大部分我无法控制或访问。为了让动画工作,它需要 swiffy 的 runtime.js 文件,它在页面上可能看起来像这样:

 <script src="https://www.gstatic.com/swiffy/v5.2/runtime.js"></script>

当我在同一页面上有多个动画实例或客户端自己包含此 runtime.js 文件时,就会出现问题。检查 javascript 控制台时,我收到此错误:

 Uncaught TypeError: Cannot redefine property: __swiffy_override - runtime.js:186

如果我只是担心与自己的冲突,我可能会跟踪变量或检查脚本 src 是否已经存在,但是当客户的页面可能已重命名或更改此文件的源时,我没有这种奢侈。

当页面上包含同一个 javascript 文件的多个实例时,有没有办法防止 swiffy runtime.js 重新定义此属性?

4

1 回答 1

0

我想你在使用 AS3 swfs 时会看到这个问题,它应用了 Document 类。例如,假设您有使用 AnimationBaseClass.as 的 animationAS3.swf。当它由 Google Swiffy 服务“编译”时,生成的 JSON 数据将包含 {"internedStrings":["...", "AnimationBaseClass", "..."] ....}

Google Swiffy 运行时应用 JavaScript 的 defineProperties() 或者可能是 defineProperty() 来密封它创建的“AnimationBaseClass”对象。因此,当加载另一个数据实例时,Swiffy 运行时尝试再次执行相同的操作,并且 JavaScript 解释器说“嘿,我已经定义了那个对象,我不会重新定义它。”

我发现的解决方案(我认为效率低下)是在将数据提供给 Swiffy 运行时之前重命名类。像这样:

var classEnumerator = 0; 
$.getJSON('animationAS3.json', function(data) {
    // Due to "TypeError: Cannot redefine property: AnimationBaseClass", 
    // we need to enumerate the name of the class.  I have no idea about 
    // the impact on resource usage when doing this.

    var classNameIndex;
    var i = data.internedStrings.length;
    while(i--) {
        if (data.internedStrings[i].indexOf("AnimationBaseClass") > -1) {
            classNameIndex = i;
        }
    }

    data.internedStrings[classNameIndex] = "AnimationBaseClass_" + (classEnumerator++));
}
于 2013-08-15T12:52:35.073 回答