Javascript 回调中的setTimout()不工作,为什么?
我想知道为什么setimoutfun,时间在这里不起作用: 上下文:这显示一条消息并将其隐藏,我想让它等待2秒钟,但如果我按照下面的操作,它通常不会隐藏,我会在没有setimeout的情况下这样做Javascript 回调中的setTimout()不工作,为什么?,javascript,jquery,settimeout,Javascript,Jquery,Settimeout,我想知道为什么setimoutfun,时间在这里不起作用: 上下文:这显示一条消息并将其隐藏,我想让它等待2秒钟,但如果我按照下面的操作,它通常不会隐藏,我会在没有setimeout的情况下这样做 function mostrar_msj(msj){ $('#notificaciones').text(msj); $('#notificaciones').animate({ top:$(window).scrollTop()+"px" }, {
function mostrar_msj(msj){
$('#notificaciones').text(msj);
$('#notificaciones').animate({
top:$(window).scrollTop()+"px"
},
{
queue: false,
duration: 350
});
$("#notificaciones").slideDown(1000, setTimeout('cerrar()',2000));
}
function cerrar(){
$("#notificaciones").fadeOut(2000);
}
我只是感到困惑,这里:?当您使用jQuery时,更容易使用: 动画函数将自动排队 但要回答你的实际问题: 您没有正确设置回调。这个
$("#notificaciones").slideDown(1000, setTimeout('cerrar()',2000));
将setTimeout的返回值设置为slideDown的回调。适当的回调将是
$("#notificaciones").slideDown(1000, function() {
setTimeout('cerrar()',2000);
});
但这并不能解释为什么cerrar没有被称为settimeout。这就引出了第二点:
如果将字符串传递给setTimeout,则将在全局范围内对其求值。如果您在ready处理程序中有这段代码,那么cerrar不在全局范围内,因此JavaScript找不到它
因此,不鼓励传递字符串。您应该传递一个函数引用:
setTimeout(cerrar, 2000);
您正在引用一个函数调用,而您应该只引用该函数:
...setTimeout(cerrar,2000)
它不起作用,因为您不了解如何使用回调。以下是正确的代码:
function mostrar_msj(msj) {
$('#notificaciones').text(msj);
$('#notificaciones').animate({
top: $(window).scrollTop() + "px"
}, {
queue: false,
duration: 350
});
$("#notificaciones").slideDown(1000, function() {
setTimeout(function() {
$("#notificaciones").fadeOut(2000);
}, 2000)
});
}
尝试将cerrar作为函数指针传递:
setTimeout(cerrar, 2000)
请参阅:尝试以下操作:
$("#notificaciones").slideDown(1000, function() { setTimeout('cerrar()',2000) });
如果您已经在使用jQuery,我强烈建议不要使用setTimeout。下面是另一种方法,可以以更干净、更像jQuery的方式实现相同的目标:
function mostrar_msj(msj){
$('#notificaciones').text(msj);
$('#notificaciones').animate({top:$(window).scrollTop()+"px" },{queue: false, duration: 350});
$("#notificaciones").slideDown(1000).delay(2000).fadeOut(2000);
}
delay函数以超时的毫秒数作为参数,并将在超时后继续执行排队/链接jQuery操作。您应该能够使用delay方法以这种方式执行此操作
这并不是对您问题的回答,但在这种情况下,使用jQuery的延迟可能会更好?如果您希望通知在完成slideDown后淡出,只需使用匿名函数作为slideDown的回调。@Thift,不是。然而,由于与eval..slideDown1000,setTimeout'cerrar',2000相同的原因,不鼓励使用它;setTimeout的返回值是超时id的整数,不是有效的回调。。。
function mostrar_msj(msj){
$('#notificaciones').text(msj);
$('#notificaciones').animate({top:$(window).scrollTop()+"px" },{queue: false, duration: 350});
$("#notificaciones").slideDown(1000).delay(2000).fadeOut(2000);
}
function mostrar_msj(msj){
$('#notificaciones')
.text(msj)
.animate({top:$(window).scrollTop()+"px" },{queue: false, duration: 350})
.slideDown(1000)
.delay(2000)
.fadeOut(2000);
}