如何使用具有多个延迟的 when() 来使效果非并发运行
How can I use when() with multiple deferred to make effects run nonconcurrently?
我正在编写一些简单的UI代码,以便在按下按钮时重新排列布局。
我有一个带有三个表单字段的搜索栏,一个"搜索"按钮,一些文本和一个徽标。按下"搜索"后,按钮、徽标和文本淡出,带有文本字段的栏使用 jquery.animate()
滑到页面顶部,徽标和搜索按钮被赋予不同的 CSS 以重新定位它们,然后在新位置淡入。
我正在尝试使用此JQuery文档使用deferred.done()
我从以下内容开始:
var fades = function () {
$("#centerSearchText").fadeOut();
$("#headerImage").fadeOut();
$("#searchButton").fadeOut();
}
$.when( fades() ).done(function () {
var positionUpdate = function() {
$("#headerImage").css({ "left": "12px", "margin-left": "12px", "margin-top": "12px", "float": "left" });
$("#searchButton").appendTo("#search_input_table tr:first")
$("#header").animate({
top: "0px",
marginTop: "0px",
}, 500);
}
$.when(cssUpdate()).done(function () {
$("#headerImage").fadeIn();
$("#searchButton").fadeIn();
});
});
。这不起作用,因为每个函数都同时运行。我意识到我没有正确按照示例返回延迟对象,如链接示例中所示,如下所示:
var effect = function() {
return $( "div" ).fadeIn( 800 ).delay( 1200 ).fadeOut();
};
但是,我需要在完成三个fadeOuts()
时返回,而不仅仅是一个。所以我将我的代码更新为以下内容:
var fades = function () {
return $.when($("#centerSearchText").fadeOut(), $("#headerImage").fadeOut(), $("#searchbtn").fadeOut()).done()
}
$.when( fades() ).done(function () {
var cssUpdate = function() {
return $.when($("#headerImage").css({ "left": "12px", "margin-left": "12px", "margin-top": "12px", "float": "left" }),
$("#searchbtn").appendTo("#search_input_table tr:first"),
$("#header").animate({
top: "0px",
marginTop: "0px",
}, 500)).done();
}
$.when(cssUpdate()).done(function () {
$("#headerImage").fadeIn();
$("#searchbtn").fadeIn();
});
});
。其中 UI 元素不再同时运行其效果,因为在初始淡出后未访问任何代码。
谁能启发我我在这里做错了什么?我确定我在某处误解了when()
和done()
的使用,但我无法找到使用多个延迟对象的出色文档来与我的代码进行比较。
您可以使用延迟:
var deferred1 = $.Deferred();
var deferred2 = $.Deferred();
var deferred3 = $.Deferred();
$("#centerSearchText").fadeOut(1000, function() { deferred1.resolve(); } );
$("#headerImage").fadeOut(1000, function() { deferred2.resolve(); } );
$("#searchButton").fadeOut(1000, function() { deferred3.resolve(); } );
$.when(deferred1, deferred2, deferred3).done(function() {
return when($("#headerImage").css({ "left": "12px", "margin-left": "12px", "margin-top": "12px", "float": "left" }),
$("#searchbtn").appendTo("#search_input_table tr:first"),
$("#header").animate({
top: "0px",
marginTop: "0px",
}, 500)).done();
}
$.when(cssUpdate()).done(function () {
$("#headerImage").fadeIn();
$("#searchbtn").fadeIn();
});
http://api.jquery.com/category/deferred-object/
有时在
动画结束时使用函数调用更容易:
$("#header").animate(
{
top: "0px",
marginTop: "0px",
}, 500, function()
{
// call next animation function here, it will be called upon completion
});
鉴于您对所有三个元素都使用未经修改的.fadeOut()
动画,更好的方法是将 promise 推送到数组中,并使用 $.when()
评估数组,例如:
// Define vars
var fades = [],
cssUpdates = [],
positionUpdate = function() {
$("#headerImage").css({ "left": "12px", "margin-left": "12px", "margin-top": "12px", "float": "left" });
$("#searchButton").appendTo("#search_input_table tr:first")
$("#header").animate({
top: "0px",
marginTop: "0px",
}, 500);
},
cssUpdate = function() {
return when($("#headerImage").css({ "left": "12px", "margin-left": "12px", "margin-top": "12px", "float": "left" }),
$("#searchbtn").appendTo("#search_input_table tr:first"),
$("#header").animate({
top: "0px",
marginTop: "0px",
}, 500)).done();
}
// Fade out
$("#centerSearchText, #headerImage, #searchButton").fadeOut(function() {
var d = new $.Deferred();
fades.push(d.resolve());
});
// Listen to fadeOut completion
$.when.apply($, fades).then(function() {
$.when(cssUpdate()).then(function() {
$("#headerImage, #searchbtn").fadeIn();
})
});
相关文章:
- 如何使用phaser使html5游戏在移动设备浏览器上运行
- 使用压缩的JavaScript文件(不是运行时压缩)
- Javascript运行php文件,然后下载文件
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- 我已经创建了一个jquery转盘,并使用if条件来运行和停止转盘
- Angularjs代码未在匿名函数中运行
- jquery设置为使用参数运行
- 如何根据时间运行不同的脚本
- Meteor方法在客户端返回null,在客户端运行的相同方法返回正确的值
- 将文本框链接到由按钮运行的javascript公式
- 为什么不是't运行此Javascript的Chrome
- ng应用程序使脚本无限运行
- 如何在运行时在angular 2中加载外部js脚本
- AJAX服务器端处理可以并发运行
- npm install支持并发运行吗?
- 如何并发运行mongo脚本
- 角度1.2.15运行并发循环
- Ajax并发调用一个接一个地运行
- 如何使用具有多个延迟的 when() 来使效果非并发运行
- 以小并发批方式运行承诺(一次不超过X个)