回调中的setTimeout()不起作用,为什么?

时间:2011-03-23 21:21:50

标签: javascript jquery settimeout

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

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

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

我只是困惑,这里:?

7 个答案:

答案 0 :(得分: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);
    

答案 1 :(得分: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)
    });
}

答案 2 :(得分:1)

试试这个:

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

答案 3 :(得分:0)

当您应该引用该函数时,您正在引用函数调用:

...setTimeout(cerrar,2000)

答案 4 :(得分:0)

尝试将cerrar作为函数指针传递:

setTimeout(cerrar, 2000)

请参阅:JQuery, setTimeout not working

答案 5 :(得分:0)

如果您已经在使用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函数将超时的MS数作为参数,并在超时后继续执行排队/链接的jQuery操作。

答案 6 :(得分:0)

您应该可以使用delay方法

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