google swiffy在同一页面中多次调用runtime.js时出错

时间:2013-07-10 00:57:50

标签: javascript javascript-objects google-swiffy

我已经使用google swiffy v5.2转换了多个swf文件,并且会在许多不同的页面上显示我的新动画,其中大部分都是我无法控制或访问的。为了使动画能够工作,它需要漂亮的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重新定义此属性?

1 个答案:

答案 0 :(得分:0)

我想你在使用AS3 swfs时会看到这个问题,它们已经应用了Document类。例如,假设您有animationAS3.swf,它使用AnimationBaseClass.as。当它由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++));
}