ошибка с google swiffy, вызывающим runtime.js несколько раз на одной странице

Я преобразовал несколько swf-файлов с помощью google swiffy v5.2, и мои новые анимации будут отображаться на многих разных страницах, большинство из которых я не контролирую и к которым у меня нет доступа. Чтобы анимация работала, ей нужен файл runtime.js swiffy, который на странице может выглядеть примерно так:

 <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, однако у меня нет такой роскоши, когда страница клиента может быть переименована или изменена источник на этот файл.

Есть ли способ предотвратить переопределение этого свойства swiffy runtime.js, когда на странице есть несколько экземпляров одного и того же файла javascript?


person Will Sampson    schedule 10.07.2013    source источник


Ответы (1)


Я предполагаю, что вы видите, что эта проблема возникает при использовании AS3 swf, к которым применяются классы документов. Например, у вас есть файл 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++));
}
person Community    schedule 15.08.2013