gpt4 book ai didi

javascript - 函数完成时执行代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:25:13 26 4
gpt4 key购买 nike

我的代码中有一个函数可以为多个元素设置动画。我想要做的是执行一系列代码,但仅在此函数完成后。

比如说我有这个:

executeMyAnimationFunction();

// Execute this code AFTER executeMyAnimationFunction() has completed
alert('test');

到目前为止,我已经尝试过使用 setTimeout,但这似乎不是很可靠。我也尝试过使用 .promise() 但这似乎也没有正确执行:

$(executeMyAnimationFunction()).promise().done(function () {
alert('test');
});

不过我承认我用错了。在 the demo在 jquery 站点上,似乎 promise() 正在被动画化的元素上使用。我试过这样做:

$('#myAnimatedElement').promise().done(function () {
alert('test');
});

而且它似乎在某些情况下有效,但在其他情况下却无效。我想知道这是否是使用 promise() 的可靠方法?

基本上,我现在对如何做到这一点感到困惑。我想要做的就是等到一个函数完全执行(该函数只是为一组元素设置动画),然后继续执行我的代码。

有没有我缺少的使用 jquery/javascript 的简单方法?

谢谢

编辑:为了更详细地展示我的问题,这里是我正在使用的确切代码:

<script>
$(function () {

$(window).bind('hashchange', function (e) {
if ($(':animated').length) {
return false;
}

var section = $.param.fragment();
var current = $('#content').children(':visible').attr('id');

$('a').removeClass('active');

// If this is the first load of the page, then animate in the initial content
if (section === '') {
if (current === 'reception') {
animateContentIn("reception");
}
else {
$('a[href="#' + section + '"]').addClass('active');

// Animate out existing content
animateContentOut(current);

setTimeout(function () {
animateContentIn("reception");
}, 1000);
}
}
else {
// Otherwise find the current page content and animate out
animateContentOut(current);

setTimeout(function () {
animateContentIn(section);
}, 1000);
}
})

// Since the event is only triggered when the hash changes, we need to trigger
// the event now, to handle the hash the page may have loaded with.
$(window).trigger('hashchange');
});

function animateContentIn(activePage) {
// Now animate in the new content
switch (activePage) {
case "floorspace":
animateFloorspaceElementsIn();
break;
case "reception":
animateReceptionElementsIn();
break;
}
}

function animateContentOut(currentPage) {
// Now animate in the new content
switch (currentPage) {
case "floorspace":
animateFloorspaceElementsOut();
break;
case "reception":
animateReceptionElementsOut();
break;
}
}

function animateReceptionElementsIn() {
$('#reception').show();

$('#reception .title').animate({
bottom: 520
}, 400);

$('#reception .tile1').animate({
bottom: 504
}, 600);

$('#reception .tile2').animate({
bottom: 504
}, 700);

$('#reception .hero').animate({
bottom: 40
}, 1000);

$('#reception .content1').animate({
bottom: 8
}, 400);

$('#reception .content2').animate({
bottom: 8
}, 500);
}

function animateReceptionElementsOut() {
$('#reception .title').animate({
bottom: -56
}, 400);

$('#reception .tile1').animate({
bottom: -136
}, 600);

$('#reception .tile2').animate({
bottom: -152
}, 700);

$('#reception .hero').animate({
bottom: -464
}, 1000, function () {
$('#reception').hide();
});

$('#reception .content1').animate({
bottom: -112
}, 400);

$('#reception .content2').animate({
bottom: -104
}, 500);
}

function animateFloorspaceElementsIn() {
$('#floorspace').show();

$('#floorspace .title').animate({
bottom: 520
}, 400);

$('#floorspace .tile1').animate({
bottom: 504
}, 600);

$('#floorspace .tile2').animate({
bottom: 504
}, 700);

$('#floorspace .hero').animate({
bottom: 40
}, 1000);

$('#floorspace .content1').animate({
bottom: 8
}, 400);

$('#floorspace .content2').animate({
bottom: 8
}, 500);
}

function animateFloorspaceElementsOut() {
$('#floorspace .title').animate({
bottom: -56
}, 400);

$('#floorspace .tile1').animate({
bottom: -136
}, 600);

$('#floorspace .tile2').animate({
bottom: -152
}, 700);

$('#floorspace .hero').animate({
bottom: -464
}, 1000, function () {
$('#floorspace').hide();
});

$('#floorspace .content1').animate({
bottom: -112
}, 400);

$('#floorspace .content2').animate({
bottom: -104
}, 500);
}
</script>
</head>
<body>
<div id="vert-wrapper">
<div id="wrapper">
<aside id="sidebar">
<nav id="navigation">
<ul>
<li><a href="#">Building</a></li>
<li><a href="#reception">Reception</a></li>
<li><a href="#floorspace">Floor Space</a></li>
<li><a href="#">Views</a></li>
<li><a href="#">Terraces</a></li>
<li><a href="#">Profile</a></li>
</ul>
<ul>
<li><a href="#">Specification</a></li>
<li><a href="#">Plans</a></li>
<li><a href="#">Location</a></li>
<li><a href="#">Ten Storeys</a></li>
<li><a href="#">Gallery</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
</aside>
<div id="content">
<article id="reception">
<h1 class="title">
<img src="/images/reception/title.png" alt="Edge" />
</h1>
<img src="/images/reception/1.jpg" alt="" class="tile1" />
<img src="/images/reception/2.jpg" alt="" class="tile2" />
<img src="/images/reception/hero.jpg" alt="" class="hero" />
<img src="/images/reception/content1.jpg" alt="" class="content1" />
<img src="/images/reception/content2.jpg" alt="" class="content2" />
</article>
<article id="floorspace">
<h1 class="title">
<img src="/images/floorspace/title.png" alt="Space" />
</h1>
<img src="/images/floorspace/1.jpg" alt="" class="tile1" />
<img src="/images/floorspace/2.jpg" alt="" class="tile2" />
<img src="/images/floorspace/hero.jpg" alt="" class="hero" />
<img src="/images/floorspace/content1.jpg" alt="" class="content1" />
<img src="/images/floorspace/content2.jpg" alt="" class="content2" />
</article>
</div>
</div>
</div>
</body>

现在我上面的代码确实可以工作,但是我觉得它不是很干净,而且似乎没有 100% 的时间正确执行。

基本上,我遇到的难题是我希望能够在 animateContentOut() 完成后执行 animateContentIn()。我设法做到这一点的唯一方法是将 animateContentIn() 函数延迟到执行最长动画所需的时间 - 在本例中为 1000 毫秒。

有没有更简洁、更高效的写法??

最佳答案

function someRandomFunction(){
// This will be executed after myFirstFunction
}

function myFirstFunction(callbackFunction){
// Do some stuff
alert(1);
// Do something slow here

// Callback when done:
callbackFunction(some, input);
}
// Usage:
myFirstFunction( someRandomFunction ); // with existing function
myFirstFunction( function(){ alert(1);} ); // anonymous

注意:可以使用匿名函数
小演示:http://jsfiddle.net/zcp82/2/

另一个有很好信息的主题:Create a custom callback in JavaScript

关于javascript - 函数完成时执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18641626/

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