gpt4 book ai didi

javascript - 如何等到jquery效果循环完成后再执行函数

转载 作者:行者123 更新时间:2023-11-30 09:42:31 25 4
gpt4 key购买 nike

编辑:这里接受的答案:How to get jQuery to wait until an effect is finished?没有解决我的问题,因为回调函数是在 jquery ui 效果完成之前执行的。此外,该线程上还有另一个答案,它引用了promise(),但这只是答案的一部分,并且缺少很多信息。

我试图等到 jquery 效果循环完全完成动画,然后执行回调函数。

但是回调函数似乎是在最后一个jquery效果启动后立即执行的,而不是等待动画完成。

我想知道如何使用循环中所有元素的 jquery drop 效果来等待元素被隐藏,并且只有在元素完全隐藏后才会运行回调函数。

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
</head>
<body>
<button id="execute-button">Execute</button>
<div id="messagebox"></div>
<div id="1" style="background-color:blue;display:none;height:33%;width:100%;"></div>
<div id="2" style="background-color:green;display:none;height:33%;width:100%;"></div>
<div id="3" style="background-color:red;display:none;height:34%;width:100%;"></div>
<div id="4" style="background-color:brown;height:33%;width:100%;"></div>
<div id="5" style="background-color:black;height:33%;width:100%;"></div>
<div id="6" style="background-color:gray;height:34%;width:100%;"></div>
<script>
$(document).ready(function(){

function hideElements(callback){
//hide elements
var hideDivs = ["#4","#5","#6"];
for(i = 0; i < hideDivs.length; i++){
//alert("hiding...");
$(""+hideDivs[i]).hide("drop",{direction:"left"},5000);
//alert(divs[i]);
}
callback();
};

function showElements(){
//show elements
var showDivs = ["#1","#2","#3"];
//alert(JSON.stringify(divs));
for(i = 0; i < showDivs.length; i++){
//alert("showing...");
$(""+showDivs[i]).show("drop",{direction:"right"},1000);
//alert(divs[i]);
}
}


hideElements(showElements());

});


$(document).on("click","#execute-button", function(){
//$("#messagebox").html("test");
$("#1").show("#1");
});
</script>
</body>
</html>

最佳答案

在 jQuery 中,如果您在 jQuery 集合上使用 .promise(),它将返回一个 promise ,当集合中的所有元素完成其动画时,该 promise 将得到解决。因此,您应该能够在每个元素上触发 .hide() 动画,然后在集合上执行 .promise() ,当该 promise 解决时,您可以然后做其他动画。

这是一个工作片段示例:

// returns a promise that resolves when all animations started here are done
function showHide() {
var items = $("#4, #5, #6");
return items.slideUp(2000).promise().then(function() {
// this runs when all animations in the items collection are done
return items.slideDown(2000).promise();
});
}

$("#go").click(function() {
showHide().then(function() {
console.log("animation done");
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


<div>
<button id="go">Run</button>
</div>

<div style="height: 300px;">
<div id="4" style="background-color:brown;height:33%;width:100%;"></div>
<div id="5" style="background-color:black;height:33%;width:100%;"></div>
<div id="6" style="background-color:gray;height:34%;width:100%;"></div>
</div>


当然,如果所有第一组动画都具有相同的计时,则可以使用 jQuery 动画链接(其中给定对象的动画进入队列,后续动画在开始之前等待前一个动画完成) :

// returns a promise that resolves when all animations started here are done
function showHide() {
return $("#4, #5, #6").slideUp(2000).slideDown(2000).promise();
}

关于javascript - 如何等到jquery效果循环完成后再执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40497401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com