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,并使用 jqgrid saveRow 函数。我认为这可能会导致问题,但不能 100% 确定。

它甚至会在我的对话框中阻止动画 gif 的渲染,所以至少可以这么说:)

我正在做类似的事情

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

在我的 onSave

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

而且......现在我已经解决了...... jqgrid同步默认阻止保存调用:/

将 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 回答