4

重い計算を行うボタンがあり、計算ステップの間にページを更新したいと思います。

JavaScript:

.on('click', function() {
    // compute something

    jQuery('#page')
        .trigger('pageshow')
    ;

    // compute something

    jQuery('#page')
        .trigger('pageshow')
    ;

    // compute something
}

pageshow終了後に-eventがトリガーされるため、これは残念ながら機能しません.on(click)

.trigger(...)すぐに実行を強制する方法はありますか?

JavaScript-醜い解決策:

.on('click', function() {
    // compute something

    window.setTimeout(function() {
        // compute something

        jQuery('#page')
            .trigger('pageshow')
        ;

        window.setTimeout(function() {
            // compute something

            jQuery('#page')
                .trigger('pageshow')
            ;
        }, 1);
    }, 1);
}

醜い解決策はうまくいくでしょうが、本当に醜いです。.on('click', ...)また、トリガーされたときに-eventが完全に計算されるかどうかのチェックを実装する必要があります。

JavaScript-よりきれいですが、それでも醜い解決策:

var functionFirst = function() {
    // compute something

    jQuery('#page')
        .trigger('pageshow')
    ;

    window.setTimeout(functionSecond, 1);
};

var functionSecond = function() {
    // compute something

    jQuery('#page')
        .trigger('pageshow')
    ;

    window.setTimeout(functionThird, 1);
};

var functionThird = function() {
    // compute something

    jQuery('#idJqGame')
        .trigger('pageshow')
    ;
};

window.setTimeout(functionFirst, 1);

よりきれいですが、それでも醜い解決策は基本的に醜い解決策と同じことをします-それはただ読みやすいので、私は今のところこれを使用しています。

4

2 に答える 2

2

JavaScriptインタープリターは、「イベントループ」を中心に構築されています。この設計により、インタプリタは単一のスレッドで実行されるため、すべてのイベントは順番に処理されます。

アプリケーションの設計で可能な場合は、イベントではなく、ページの更新を定期的に呼び出すようにしてください。

別のオプションは、アプリケーションが最新のブラウザーでのみ実行されることを保証できる場合、「重い計算」をWebワーカーに移動することです。詳細はこちら:https ://developer.mozilla.org/en/Using_web_workers

編集1:

http://dev.opera.com/articles/view/timing-and-synchronization-in-javascript/の「ネストされたイベント」のセクションによると、ネイティブブラウザを使用すれば、目的を達成できる可能性があります。イベントをキューに入れる機能

もう1つの洗練された解決策は、イベントの順次処理を利用することです。'重い計算'をイベントハンドラーに移動します。次に、「compute」イベントと「pageshow」イベントを交互にプッシュして、それらが交互に呼び出されるようにします。とはいえ、通常のDOMイベントもの後にキューに入れられるため、ページが応答しなくなってしまうのではないかと心配しています。

編集2:

ちょうどこれを見つけました:http: //api.jquery.com/queue/助けになるかもしれません。

于 2012-07-13T17:33:08.243 に答える
1

醜い解決策が最善だと言って申し訳ありません。
見栄えはすることができますが、肝心なのは、コードを制御できるようにするには、コードを小さなブロックに分割する必要があるということです。

于 2012-07-15T17:15:55.873 に答える