jQuery:文本没有在递归函数内部更新

时间:2017-01-26 12:09:12

标签: javascript jquery

我是jQuery的新手,我一直在玩它。我有一个名为result的UI元素,一旦结果到达就会更新,这样就完美了。但是,这个结果来自一系列的计算。
现在我希望UI元素在每次计算后更新以显示某种进度。但是,如果我在我用于计算的递归函数中设置UI元素的值,它不会更新它。 这是代码:

function getRes(val) {
  if(val === finalVal)
    return;
  // do something 
  $("#result").text(someVal); //This doesn't work
  getRes(val+1);
}

$("#resbtn").on('click', function(){
  getRes(0);
  $("#result").text(res);  //This works
});

为什么会这样?

2 个答案:

答案 0 :(得分:0)

您需要欺骗浏览器刷新DOM。见Why is setTimeout(fn, 0) sometimes useful?

function getRes(val) {
    if(val === finalVal)
    return;
    // do something

    setTimeout(function() {
        $("#result").text(someVal); //This doesn't work
        getRes(val+1);
    }, 0);
}

$("#resbtn").on('click', function(){
    getRes(0);
    $("#result").text(res);  //This works
});

答案 1 :(得分:0)

您的代码运行正常。我登录到另一个div,每次传入你的递归函数:



var finalVal = 100;
var someVal;

function resetLogs() {
  $("#log").html('<h3>Logs</h3>');
}

function getRes(val) {
  if(val === finalVal)
    return;
  // do something 
  someVal = "Loading : "+val+'%';
  $("#log").append(someVal+'<br>');
  $("#result").text(someVal);
  getRes(val+1);
}

$("#resbtn").on('click', function(){
  resetLogs()
  getRes(0);
  $("#result").text("FINAL");
});

$("#resbtn2").on('click', function(){
  resetLogs()
  getRes(0);
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result">initial content</div>
<button id="resbtn">With 'final'</button> <button id="resbtn2">Without final!</button>

<div id="log">
  <h3>Logs</h3>
</div>
&#13;
&#13;
&#13;

问题可能是您通过递归功能如此之快,以至于显示的数据没有足够的时间正确显示,并且很快被最终值替换以显示(此处& #34;最终&#34; 字符串)