2011-03-23 44 views
0

我想知道为什么setimout(fun(),time)不在这里工作:setTimout()在回调不起作用,为什么?

上下文:这显示一条消息并隐藏它,我想使它等待2秒,但如果我做如下它不会隐藏(通常我做没有

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); 
} 

我只是困惑,这里的setimeout():

+0

这不是一个回答你的问题,但你可能会更好过使用jQuery的'delay'在这种情况下。 – 2011-03-23 21:28:38

+0

你想达到什么目的?如果您希望#notificaciones在完成slideDown之后淡出,只需使用匿名函数作为slideDown的回调。 – Matijs 2011-03-23 21:28:52

回答

8

当你正在使用jQuery,越容易使用delay()

$("#notificaciones").slideDown(1000).delay(2000).fadeOut(2000); 

动画功能自动排队。


但是,为了回答您的实际问题:

  1. 你没有正确设置回调。这

    $("#notificaciones").slideDown(1000, setTimeout('cerrar()',2000)); 
    

    将设置返回值的setTimeout作为回调slideDown。一个适当的回调是

    $("#notificaciones").slideDown(1000, function() { 
        setTimeout('cerrar()',2000); 
    }); 
    

    但是这并不能解释为什么cerrar不称为显然setTimout调用。这给我们带来了第二点:

  2. 如果您将字符串传递给setTimeout,那么它将在全局范围内进行评估。如果您在ready处理程序中有这段代码,则cerrar在全局范围内为而不是,因此无法通过JavaScript找到。

    因此,不鼓励传递字符串。你应该通过函数引用来代替:

    setTimeout(cerrar, 2000); 
    
+0

这对我来说是最简单的!但感谢你们所有人! – 2011-03-23 21:35:48

0

你引用一个函数调用时,你应该只是参考的功能:

...setTimeout(cerrar,2000) 
+0

他的setTimeout调用也是错误的 – ThiefMaster 2011-03-23 21:27:38

+0

@小偷,不,它不是。但是,出于与eval相同的原因,这是不鼓励的。 – 2011-03-23 21:29:51

+0

'.slideDown(1000,setTimeout('cerrar()',2000));'setTimeout的返回值是一个整数(超时ID),不是有效的回调... – ThiefMaster 2011-03-23 23:14:49

2

,因为你没有它不工作了解如何使用回调。下面是正确的代码:

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) 
    }); 
} 
1

试试这个:

$("#notificaciones").slideDown(1000, function() { setTimeout('cerrar()',2000) }); 
0

我强烈建议不要使用的setTimeout( )如果你已经在使用jQuery。这里是另一种方式,你可以完成同样的目标,在一个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); 
} 

延时函数采用MS的数量为超时作为参数,并将继续执行排队/链接的jQuery超时后的操作。

0

你应该能够做这种方式,使用delay方法

function mostrar_msj(msj){ 
    $('#notificaciones') 
     .text(msj) 
     .animate({top:$(window).scrollTop()+"px" },{queue: false, duration: 350}) 
     .slideDown(1000) 
     .delay(2000) 
     .fadeOut(2000); 
} 
相关问题