2013-07-10 46 views
3

我已經使用谷歌swiffy v5.2轉換多個SWF文件,並將我的新動畫顯示在許多不同的網頁上,其中大部分我沒有控制或訪問。爲了使動畫工作,它需要Swiffy不在的runtime.js文件,這可能會是這個樣子的網頁上:谷歌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重新定義此屬性?

回答

0

我想象一下,在使用AS3 swfs的時候會發生這個問題,這些swf有文檔類應用於它們。例如,假設你有animationAS3.swf,它使用AnimationBaseClass.as。當它是由谷歌Swiffy與服務「編譯」產生的JSON數據將包含 {"internedStrings":["...", "AnimationBaseClass", "..."] ....}

的谷歌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++)); 
}