2011-03-23 46 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); 
} 
相關問題