1

これは何かおかしい...

外部 SWF をロードする Flash ファイルがあります。そこで、LoadVars を使用してサーバーから外部データを取得します。データが到着したら、setInterval を使用して、コンテンツをフェードインする関数を呼び出します。

ここまでは順調ですね。

しかし、すべてのデータが到着する前にメニューを切り替えると (つまり、あるムービーをアンロードして別のムービーをロードする)、Flash が約 15 秒間ハングし、悪名高いメッセージ「このムービーのスクリプトが Flash をスローダウンさせています - 中止しますか?」が表示されます。それ?" (大まかに翻訳)。

大きな問題を引き起こす SWF に «onUnload» 関数を追加しました。ここでは、clearInterval を使用してインターバルを取り除き、LoadVars-Variable を再インスタンス化します。

何も役に立たない...

何か案は?

リクエストに応じて-問題を引き起こしているSWFのソースは次のとおりです。

var myTimer = null;
var server_send:LoadVars = new LoadVars();

this.onUnload = function () {
    clearInterval(myTimer);
    server_send = new LoadVars();
    trace("stopping gewerbe");
};

var myself = scrollContent;

import JSON;    // external Class for parsing JSON

var sRes:LoadVars = new LoadVars();

function fadeIn(which){
    which._alpha += 3;

    if(which._alpha >= 100){
        clearInterval(myTimer);
    }
}

sRes.onLoad = function(success:Boolean){

    if (success){

        var o:Object = JSON.parse(sRes.res);
        var s:String = JSON.stringify(o); 

        //trace(sRes.res);

        var y = 0;

        for(item in o){

            actCol = 0;

            myself.attachMovie("row", "entry" + item, myself.getNextHighestDepth(), {_x: 0, _y:y});

            var tr = myself["entry" + item];

            tr.cTitle = o[item]["title"];
            tr.cBild = o[item]["image"];
            tr.cText = o[item]["text"];
            y += 65;

        }

        myTimer = setInterval(fadeIn, 0.1, myself);

        _root.myIntervals.push(myTimer);

    }
    else
    {
        trace("no connection...");
    }

}

myself._alpha = 0;

var vars = Array("id");
var values = Array("3");

server_send.load('void.txt');

for(var i=0;i<vars.length;i++)
{
    server_send[vars[i]] = escape(values[i]);
}

server_send.sendAndLoad(_global.server, sRes, "POST");

stop();
4

2 に答える 2

0

アップデート

まず、setInterval の使用をやめることをお勧めします。特に問題があります。代わりに、Timer管理と使用がはるかに簡単なクラスを使用してください。

ただし、関数のsetInterval内部sRes.onLoadはおそらくあなたの問題です。間隔はミリ秒単位である必要があるため、0.1 はおそらく 100 (1/10 秒) である必要があり、clearInterval呼び出しは範囲外である可能性がfadeInあります。これらを a でチェックして、期待どおりにクリアされていることを確認してください。unLoadmyIntervaltrace

コード

わかりました、もう少し読みやすくするためにコードを並べ替えました...しかし、まだ非常に悪い形です。あなたとさらに議論する必要があることをマークしています... (以下のコード内の追加コメントを参照してください。)

stop();

// Moved import to the top.
import JSON;

// Grouping var declarations.
var myself = scrollContent;
myself._alpha = 0;

var values = Array("3");
var myTimer = null;
var sRes:LoadVars = new LoadVars();
var server_send:LoadVars = new LoadVars();
var vars = Array("id");    

// why are we looping through an array of one value?
for(var i=0; i<vars.length; i++)
{
    server_send[vars[i]] = escape(values[i]);
}

server_send.load('void.txt'); // what is this for?

server_send.sendAndLoad(_global.server, sRes, "POST"); // where do we define _global.server

this.onUnload = function () {
    clearInterval(myTimer); // is myTimer in scope here?
    server_send = new LoadVars();
    trace("stopping gewerbe");
};    

function fadeIn(which){
    which._alpha += 3;
    if(which._alpha >= 100){
        clearInterval(myTimer); // is myTimer in scope here?
    }
}

sRes.onLoad = function(success:Boolean)
{
    if (success)
    {
        var o:Object = JSON.parse(sRes.res);
        var s:String = JSON.stringify(o); 
        var y = 0;

        for(item in o)
        {
            actCol = 0;
            myself.attachMovie("row", "entry" + item, myself.getNextHighestDepth(), {_x: 0, _y:y});
            var tr = myself["entry" + item];
            tr.cTitle = o[item]["title"];
            tr.cBild = o[item]["image"];
            tr.cText = o[item]["text"];
            y += 65;
        }

        myTimer = setInterval(fadeIn, 0.1, myself); // setInterval uses milliseconds 0.1 is almost certainly the problem. 
                                                    // if you want 1/10th of a second, specify 100 as the interval.
        _root.myIntervals.push(myTimer); // We never see _root.myIntervals again, what's this for? 
                                         // The fadeIn and unLoad methods could use this to 
                                         // guarantee that they clear the right interval.
    }
    else
    {
        trace("no connection...");
    }
}
于 2010-10-24T21:02:21.587 に答える
-1

助けてくれてありがとう - 私は癖を見つけたようです...

ムービーがアンロードされたときでも sendAndLoad-response が呼び出され、ループが発生したようです。

私がしたことは次のとおりです。

«doParse» というスクリプトの先頭に変数を追加し、それを true に設定します

var doParse = true;

次に、アンロード関数で、この var を false に設定します。

this.onUnload = function () {
doParse = false;
...
}

データが到着したときに呼び出されるイベントでは、これを追加しました:

if(success && doParse == true){
...
}

これは役に立ち、メッセージは消えました。

于 2010-10-24T21:46:00.737 に答える