我已经使用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重新定义此属性?
答案 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++));
}