Javascript 回调中的setTimout()不工作,为什么?

Javascript 回调中的setTimout()不工作,为什么?,javascript,jquery,settimeout,Javascript,Jquery,Settimeout,我想知道为什么setimoutfun,时间在这里不起作用: 上下文:这显示一条消息并将其隐藏,我想让它等待2秒钟,但如果我按照下面的操作,它通常不会隐藏,我会在没有setimeout的情况下这样做 function mostrar_msj(msj){ $('#notificaciones').text(msj); $('#notificaciones').animate({ top:$(window).scrollTop()+"px" }, {

我想知道为什么setimoutfun,时间在这里不起作用:

上下文:这显示一条消息并将其隐藏,我想让它等待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);
}

我只是感到困惑,这里:?

当您使用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);
}