2

ドキュメントの読み込み時に、選択オブジェクトの内容を他の選択ボックスにコピーする関数を実行しています (ネットワーク帯域幅を節約するため)。

関数が完了するまでに数秒かかるため、メインの div をマスクしたいと考えました (何かが起こっていることをユーザーに知らせるため)。

残念ながら、関数が完了するまでマスクは表示されません。

    // I want the mask to show immediately here, but never gets shown
    $('#unassignedPunchResults').mask('Getting results');

    $('.employeeList').each(function (i) {
        // this is freezing the browser for a few seconds, the masking is not showing
        $('#employeeList option').clone().appendTo(this);  
    });

    $('#unassignedPunchResults').unmask();

mask() 呼び出しの後に javascript を中断してそのイベントをフラッシュして続行し、より長い処理 (each()) の処理中にユーザーがマスクを確認できるようにするにはどうすればよいですか?

4

3 に答える 3

3

残りのコードをsetTimeout(function() { ... }, 0)呼び出しに入れます。

于 2012-05-31T20:15:13.717 に答える
1

またはワーカーを使用しますが、msie <10を破棄するか、500ミリ秒未満で実行されるセグメントに計算を分割し、setintervalを使用して5秒にわたって読み込みを分散する必要があります。googleは、コード例としてjavascriptでスレッドをシミュレートします。

于 2012-05-31T20:38:46.443 に答える
1

私はこれについてしばらく考えてきました。最初の解決策は、settimeout関数を使用することです。

ただし、任意の遅延を追加するため、少し「汚い」可能性があります。より適切なロジックは$('.employeeList').each(function (i)...、マスク関数が実行されレンダリングされた後に関数を実行することです。

Jquery では、遅延条件が満たされた後に実行される thenのような遅延関数を使用してそれを行うことができます。

だから試してみてください:

// I want the mask to show immediately here, but never gets shown
    $('#unassignedPunchResults').mask('Getting results').then(function(){

    $('.employeeList').each(function (i) {
        // this is freezing the browser for a few seconds, the masking is not showing
        $('#employeeList option').clone().appendTo(this);  
    });


});

一般に、任意のミリ秒数で settimeout を使用することは、単純なケースでは機能するソリューションですが、複雑なコードに複数の settimout がある場合、同期の問題が発生する可能性があります。

于 2012-05-31T20:24:29.780 に答える