0

これは、非同期のフェード/アニメーション機能が含まれていないことを確認するための単純化された例です。

負荷の高い機能が動作しているときは背景が赤く、準備ができているときは背景が黒くなるようにしたいです。実際に何が起こるかというと、ほとんどの場合、関数の準備が整った後、背景が直接黒に変わります。「完了」の通知を待っていても、赤い背景は表示されません。

より良い解決策はありますか? setTimeout で数ミリ秒待って、背景が赤に変わるようにします。work() を直接呼び出すと、問題が発生します。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Test</title>
<script type='text/javascript'>
function work()
{
    var i, a;
    a = [];
    for(i = 0; i < 250000; i++)
    {
        a.push(Math.random());
    }
    a.sort();
    document.getElementsByTagName('body')[0].style.background = '#000000';
    alert('done');
    return true;
}

window.onload = function() {
    document.getElementsByTagName('body')[0].style.background = '#ff0000';
    //work();
    setTimeout(work, 100);

};
</script>
</head>
<body>
<h1>Test</h1>
</body>
</html>
4

1 に答える 1

0

「モーダルポップアップ」は、ブラウザを完全に(永久に)ロックしてユーザーを本当に動揺させないようにスクリプトを保存するためにあります。このガードは JS コードからは検出できず、同期モデルに従う JS の実行を一時停止します。それはあなたを救うことです、ブロックしないコードを書いてください!サンク/クロージャーまたはキューを使用して、ほとんどの計算を再開およびキャンセルできるように設定するのは、実際にはかなり簡単です。

とにかく...私の経験では、FF3.5 (Win) と IE6-8 で CSS を更新するには 1 ミリ秒の「遅延」で十分です (実際の遅延は 1 ミリ秒以上になる可能性が高いです)。これにより、同期モデル内でのイベント ポスト バックの「キューイング」が強制されます。これにより、少なくとも上記のケースでは、JS の実行が続行される前に CSS スタイルを適用できます。Prototype.js は「遅延」関数に 0ms の値を使用していると思いますが、私はそれほど勇敢ではありません。

また、「document.body」:-)

(このアプローチ全体が野外の魚市場のようなにおいがしますが、「より良い」方法はないと確信しています。)

于 2009-10-21T00:45:57.130 に答える