error with google swiffy calling runtime.js multiple times in the same page

为君一笑 提交于 2019-12-10 17:53:56

问题


I have converted multiple swf files using google swiffy v5.2 and will have my new animations displayed on many different pages, most of which I do not have control of or access to. In order for the animation to work it needs the swiffy's runtime.js file, which might look something like this on the page:

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

The problem arises when I either have multiple instances of the animation on the same page or a client has this runtime.js file included on their own. When checking the javascript console I get this error:

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

If i was only worried about the conflict with myself I could possibly keep track of a variable or check if the script src existed already, however I do not have this luxury when a client's page may have renamed or changed the source to this file.

Is there a way to prevent the swiffy runtime.js from redefining this property when there are multiple instances of the same javascript file being included on the page?


回答1:


I imagine you are seeing this problem happen when using AS3 swfs, which have Document classes applied to them. For example, say you have animationAS3.swf, which uses AnimationBaseClass.as. When it is "compiled" by Google Swiffy service the resultant JSON data will contain {"internedStrings":["...", "AnimationBaseClass", "..."] ....}

The Google Swiffy runtime applies JavaScript's defineProperties() or perhaps defineProperty() to seal an "AnimationBaseClass" object it creates. So, when another instance of the data is loaded the Swiffy runtime attempts to do the same thing again, and the JavaScript interpreter says "Hey, I've already defined that object, I won't redefine it."

The solution I've found, which I believe is inefficient, is to rename the class before giving the data to the Swiffy runtime. Like this:

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


来源:https://stackoverflow.com/questions/17560764/error-with-google-swiffy-calling-runtime-js-multiple-times-in-the-same-page

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!