2011-08-11 60 views
3

內我有這個message();功能:的setInterval和clearInterval相同的功能

function message(kind, text){ 
    if(fadeOutDelay != undefined){ 
     clearInterval(fadeOutDelay); 
    } 
    $("#message").show(); 
    $("#message").attr('class',kind); 
    $('#message').text(text); 
    var fadeOutDelay = setInterval(function(){ 
     $("#message").fadeOut(2000); 
    },10000); 
} 

的問題是,我試圖清除間隔時,該功能重新運行,以防止最新消息的衰落。我希望能夠持續發出消息,並且如果它們彼此間隔10秒,則淡出不會發生。基本上,如果有一個setInterval發生在這個功能正在運行我想取消它的時間。

+0

爲什麼要每隔10秒'fadeOut'?有什麼事情會在10秒內發生,什麼會重新顯示元素?你確定你不想'setTimeout'? –

+0

這些只是更好的提醒,給用戶一些反饋意見沒有典型的'警報();'。我只是想讓它顯示然後消失。 – ThomasReggi

回答

7

fadeOutDelay是不是在其他函數調用的範圍。你可以使用一個全局變量來代替:

var fadeOutDelay; 
function message(kind, text){ 
    if(fadeOutDelay != undefined){ 
     clearInterval(fadeOutDelay); 
    } 
    $("#message").show(); 
    $("#message").attr('class',kind); 
    $('#message').text(text); 
    fadeOutDelay = setInterval(function(){ 
     $("#message").fadeOut(2000); 
    },10000); 
} 
1

試試這個

var fadeOutDelay = null; 
function message(kind, text){ 

    if(fadeOutDelay){ 
     clearInterval(fadeOutDelay); 
     fadeOutDelay = null; 
    } 

    $("#message").show(); 
    $("#message").attr('class',kind); 
    $('#message').text(text); 
    fadeOutDelay = setInterval(function(){ 
     $("#message").fadeOut(2000); 
    },10000); 
} 
+0

您需要從內部變量刪除'var'。 –

+0

@kingjiv - 謝謝:) – ShankarSangoli

2

如果我明白你的問題正確的話,我想你只需要設置你的fadeOutDelay變種全球性的。此函數的範圍之外被宣佈

var fadeOutDelay; //global var. 

function message(kind, text){ 
    if(fadeOutDelay != undefined){ 
     clearInterval(fadeOutDelay); 
    } 
    $("#message").show(); 
    $("#message").attr('class',kind); 
    $('#message').text(text); 
    fadeOutDelay = setInterval(function(){ 
     $("#message").fadeOut(2000); 
    },10000); 
} 
1

fadeOutDelay變量的需求:

var fadeOutDelay = null; 

function message(kind, text){ 
    if(fadeOutDelay) { 
     clearInterval(fadeOutDelay); 
    } 
    $("#message").show(); 
    $("#message").attr('class',kind); 
    $('#message').text(text); 
    fadeOutDelay = setInterval(
     function() { $("#message").fadeOut(2000); }, 
     10000 
    ); 
} 
1

這裏有一個方法,沒有全局變量來做到這一點。

而且,我想你想使用的setTimeout,而不是setInterval的,因爲你只希望計時器每封郵件觸發一次被顯示。

我也重新排序的初始操作的消息對象上,這樣數據和類你展示它之前被設置在一個局部變量救過jQuery對象,而不是一遍一遍運行的選擇。

function message(kind, text){ 
    var m = $('#message'); 
    m.text(text); 
    m.attr('class', kind); 
    m.show(); 
    var timer = m.data("timer");   // get previous timer value 
    if (timer) { 
     clearTimeout(timer);    // clear timer, if still running 
    } 
    timer = setTimeout(function() { 
     m.fadeOut(2000); 
     m.data("timer", null);  // clear stored timer 
    },10000); 
    m.data("timer", timer);   // store timer as data on the object 
}