0

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

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

如果有任何不同,更新函数会创建和销毁几个 div 元素,然后开始创建 JSXGraph 并更新这些图上的函数、点等。

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

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

谢谢!

4

2 回答 2

1

在 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;
  }
}
于 2019-06-11T18:34:01.207 回答
0

似乎您需要在所有 -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;
  }
}

但是要注意,一般来说这个函数的返回会在current_question.update()完成之前发生。

于 2019-06-11T19:44:03.793 回答