Javascript 代码不';你跑得不整齐吗?对DOM的更新是否同时发生?

Javascript 代码不';你跑得不整齐吗?对DOM的更新是否同时发生?,javascript,jquery,jsxgraph,Javascript,Jquery,Jsxgraph,我在按顺序运行代码时遇到了一些问题。基本上,我有一个隐藏元素的函数,控制台记录一条消息,然后运行另一个函数,对DOM进行缓慢而大规模的更改 理想情况下,隐藏首先发出用户响应的信号,然后他们可以在一切刷新时处理几秒钟的延迟。但是现在,控制台首先被记录,然后所有的更改在几秒钟后立即发生。因此,隐藏与更新一起发生 如果有什么不同,update函数会创建并销毁几个div元素,然后开始创建JSXGraphs并更新这些图上的函数、点等 check_answer(answer_input) { if (t

我在按顺序运行代码时遇到了一些问题。基本上,我有一个隐藏元素的函数,控制台记录一条消息,然后运行另一个函数,对DOM进行缓慢而大规模的更改

理想情况下,隐藏首先发出用户响应的信号,然后他们可以在一切刷新时处理几秒钟的延迟。但是现在,控制台首先被记录,然后所有的更改在几秒钟后立即发生。因此,隐藏与更新一起发生

如果有什么不同,update函数会创建并销毁几个div元素,然后开始创建JSXGraphs并更新这些图上的函数、点等

check_answer(answer_input) {
  if (this.ans == answer_input) {
    $("#answer-card-section").hide();
    console.log("CORRECT!");

    current_question.update();
    return true;
  }
  else {
    return false;
  }
}

谢谢

在JS中执行长时间运行的函数时,呈现UI的调用可能会被阻止。在某些情况下,它还可以防止前面的操作明显地更新DOM,这就是您在这里看到的

简单的解决方法是将
update()
调用放置在一个具有短延迟的超时内。这将允许
hide()
首先更新DOM。试试这个:

function check_answer(answer_input) {
  if (this.ans == answer_input) {
    $("#answer-card-section").hide();

    setTimeout(function() {
      current_question.update();
    }, 25);
    return true;
  }
  else {
    return false;
  }
}

似乎您需要在所有
hide
-操作完成后执行回调函数。在jQuery中实现这一点的一种方法是使用
$.when().done

function check_answer(answer_input) {
  if (this.ans == answer_input) {
    $.when( $("#answer-card-section").hide() ).done(function() {
      current_question.update();
    });
    return true;
  } else {
    return false;
  }
}

但是请注意,一般来说,此函数的返回将在
当前的\u question.update()
完成之前进行。

谢谢,这很有效,但我想知道这是否是一种好的做法。是否有强制更新DOM的函数?没有。这不是一个很好的实践,坦率地说,有点代码味道。我建议重构
update()
函数,使其不是一个密集的过程。你是如何做到这一点的,我们无法真正帮助你,虽然现在必须这样做,但我只有一个页面有这么多的信息,所以这不是太糟糕。但在使用它的同时,我找到了一些方法来优化我的更大的函数,所以希望我可以完全避免它。它只是。。。有点困扰我。这不会改变任何事情,因为
hide()
不是异步调用。