setTimout () в обратном вызове не работает, почему? - PullRequest
0 голосов
/ 24 марта 2011

Я хотел бы знать, почему 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 ]

8 голосов
/ 24 марта 2011

Поскольку вы используете 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);
    
2 голосов
/ 24 марта 2011

Это не работает, потому что вы не понимали, как использовать обратные вызовы.Вот правильный код:

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 голос
/ 24 марта 2011

Попробуйте это:

$("#notificaciones").slideDown(1000, function() { setTimeout('cerrar()',2000) });
0 голосов
/ 24 марта 2011

Вы должны быть в состоянии сделать это, используя delay метод

function mostrar_msj(msj){
    $('#notificaciones')
        .text(msj)
        .animate({top:$(window).scrollTop()+"px" },{queue: false, duration: 350})  
        .slideDown(1000)
        .delay(2000)
        .fadeOut(2000);
}
0 голосов
/ 24 марта 2011

Я настоятельно рекомендую не использовать 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 голосов
/ 24 марта 2011

Попробуйте передать cerrar в качестве указателя на функцию:

setTimeout(cerrar, 2000)

см .: JQuery, setTimeout не работает

0 голосов
/ 24 марта 2011

Вы ссылаетесь на вызов функции, когда вам нужно просто сослаться на функцию:

...setTimeout(cerrar,2000)
...