如何强制javascript在移动到下一行之前执行一行?
我有几个过滤器可以显示或隐藏表中的表行,然后检查是否没有可见的行,然后向表中添加一条消息,说明不存在行 这就是我试图做到的,但失败得很惨,也许我不知道JS执行行的方式,也许总是异步的 HTML 我的意思是它执行它,但不进行更改,例如,在执行if语句之前,它不会隐藏任何行如何强制javascript在移动到下一行之前执行一行?,javascript,jquery,Javascript,Jquery,我有几个过滤器可以显示或隐藏表中的表行,然后检查是否没有可见的行,然后向表中添加一条消息,说明不存在行 这就是我试图做到的,但失败得很惨,也许我不知道JS执行行的方式,也许总是异步的 HTML 我的意思是它执行它,但不进行更改,例如,在执行if语句之前,它不会隐藏任何行 请注意,我在不同的地方使用了checkfurtexists,所以我想将它分开。JavaScript和DOM的操作是单线程的。浏览器的工作原理是将项目放置在队列中,然后一个接一个地执行它们。当您更新DOM时,实际发生的是它将更新它
请注意,我在不同的地方使用了
checkfurtexists
,所以我想将它分开。JavaScript和DOM的操作是单线程的。浏览器的工作原理是将项目放置在队列中,然后一个接一个地执行它们。当您更新DOM时,实际发生的是它将更新它的请求放在队列的末尾,因此它将在JavaScript运行完成后发生。在这种情况下,您需要做的是强制第二个函数转到这个队列的末尾,这样它就可以在DOM操作发生后运行。可以通过将对函数的调用包装为零超时来实现这一点:
window.setTimeout(CheckFruitExists, 0);
这将导致它被添加到执行队列的末尾,现在应该在DOM更新发生后运行
更新:
根据我的评论,将考虑动画循环中的元素:
在隐藏某个元素的动画中,该元素在动画结束之前都视为可见。在显示元素的动画过程中,该元素在动画开始时被视为可见
这意味着当运行
checkfurtexists
函数时,该元素仍将处于动画状态,并将被视为可见,而不管它是隐藏还是显示。请尝试删除动画,看看这是否解决了问题(您可能仍需要如上所述使用setTimeout
fix)。如果确实如此,并且您仍然希望使用动画,则需要调用hide
和show
的动画完整回调函数中的checkfurtexists
。HTML最终如何呈现到页面?我从来没有听说过标签。你如何确认执行流程?@Vishwanath使用开发人员工具检查了它,提到了已经有问题的:-)你能共享一个plunker吗…@JyotiPuri plunker?不幸的是,这不起作用,我添加了一个断点,在检查行是否隐藏之前它不会隐藏行:'(它们最终会被隐藏吗?即隐藏它们的代码真的有效吗?不,它们不会马上被隐藏,它们只会在我让代码流动时被隐藏好-所以它确实有效。尝试使用1ms超时而不是基于0的超时,可能是浏览器看到了0,只是跳过了超时,而不是将其添加到末尾。)E QuealeA-另一件事是jQuery动画。jQuery会考虑到隐藏动画已经完成的事情,并且当动画开始时,可能是if语句永远不会小于1。
function ToggleFruits(elm) {
$target = $('#fruitTable tr[data-status="' + elm.id + '"]').filter(function () {
var crates = $("#crateTable tr .selected").parent().map(function () {
return $(this).data("crateID");
}).get();
return crates.indexOf($(this).data("crateID")) >= 0;
});
if (elm.checked) {
$target.show("down");
}
else {
$('#fruitTable tr[data-status="' + elm.id + '"]').hide("up");
}
CheckFruitExists();
}
function CheckFruitExists() {
$("#NoFilteredFruits").hide();
$("#fruitTable").show();
if ($("#fruitTable tr:visible").length < 1) {
$("#NoFilteredFruits").show();
$("#fruitTable").hide();
}
}
if ($("#fruitTable tr:visible").length < 1)
else {
$('#fruitTable tr[data-status="' + elm.id + '"]').hide("up");
}
window.setTimeout(CheckFruitExists, 0);