2

元の質問には 2 つの問題があるようです。1) スリープ機能は、HTML 要求などの長時間実行される操作を適切にシミュレートしませんでした。2) IE、少なくとも v8 と v9 では、Firefox のように表示が正しく更新されないようです。IE に UI の更新を強制的に処理させる方法を知っている人はいますか? 以下は Firefox で正常に動作しますが、一時停止を強制するアラートを挿入しない限り、IE は実行中のカウントの表示を最後まで更新しません。50 個のアイテムがあり、バッチ サイズが 10 の場合、実行中のカウントを表示する HTML に 10、20、30、40、50 を表示する必要がありました。IE では、最後に 10 から 50 にジャンプしますが、Firefox は正しく更新されます。

while (done == false) {
    var url = 'myLongRunningOperation.com/doSomething.html&LastID='+lastPriorIndex;
    $.ajax({
    type: 'GET',
    url: url,
    dataType: 'json',
    success: function(data) { 
        soFar += data.Succeeded + data.Failed;
        $('#numCompleted').val(soFar).show();
        LastPriorIndex= data.LastID;
        if (soFar >= totalNumberOFDocs) {
        done = true;
        }
    },
    data: {},
    async: false
    });
}

JQuery UI モーダル ダイアログをステータス ダイアログとして使用しようとしています。最初に表示し、次に実行時間の長い操作が完了して HTML に追加するときに更新メッセージを処理します。ただし、ダイアログは最後まで表示されず、すべてのメッセージが表示されます。ダイアログを表示した直後にアラートを入れると表示されますが、操作がすべて完了した後、メッセージの更新がすべて一度に表示されます。アラートによってダイアログが表示されるため、メッセージキューをチェックして更新する機能が必要なだけだと思っています。あるいは、スリープをシミュレートする際の問題は、ログ実行操作をシミュレートする私の方法です。

    $(function() {
        $("#dialog2").dialog({
            bgiframe: false
            ,height: 140
            ,modal: true
            ,autoOpen: false
        });

    });
    function TestModalUpdate2() {
        $('#dialog2').dialog("open");
        //alert('foo'); //if this alert is present the dialog shows before the doSomething calls execute but wont update till all of them are done
        $('#dialog2').show();
        var i
        for(i = 0; i < 5; i++) {
            doSomething($('#dialog2'));
            $('#dialog2').show();
        }
    }

    function doSomething(obj1) {
        wait(1000);
        obj1.html(obj1.html()+"<p>new line</p>")
                //alert('this will also cause the dialog to update in between doSomethings')
    }
    function wait(msecs) {
        var start = new Date().getTime();
        var cur = start
        while(cur - start < msecs) {
            cur = new Date().getTime();
        }
    } 
<input type="button" id="Test2" onclick="TestModalUpdate2();" value="Test2"/>
4

2 に答える 2

0

これに加えて、同じ問題がありますが、jqgridも使用しており、jqgridsaveRow関数を使用しています。これが問題の原因である可能性があると思いますが、100%確実ではありません。

それは私のダイアログでのアニメーションGIFのレンダリングさえもブロックするので、控えめに言っても面白いです:)

私はこれに似た何かをしています

$("#WOTaskList").jqGrid('saveRow', rowArray[rowIndex], onSave, null, null, null, onSaveError)

そして私のonSaveで

$(".waitUIText").html("<span>Saved " + nSavedRows + " of " + nEditeddRows + "</span>");

そして...今私はそれを解決しました...jqgridsyncronousはデフォルトでsave呼び出しをブロックします:/

ajaxRowOptions:{async:true}をjqgridのデフォルトの初期化に追加しました。ダイアログは期待どおりに更新されています。

于 2012-04-26T05:20:43.950 に答える
0

同期モードでの操作が面倒になる可能性があることをさらに調査した後、動作する再帰バージョンに変換しました。

function processBatch() {
    var url = 'DoSomethingLongRunning.html&StartingIndex='+startingIndex+'&BatchSize='+batchSize;
    $.getJSON(url 
        ,function(data) { 
            soFar1 += data.Succeeded + data.Failed;
            $('#numCompleted').val(soFar1).show();
            startingIndex = data.LastID;
            if (soFar1 < totalNumberOfDocs) {
                processBatch();
            }
        }
    );  
}
于 2012-05-02T18:56:21.960 に答える