2013-03-27 2 views
0

У меня есть две функции javascript и оба работают над событием click. Для каждой функции я использовал свойство set time out. Проблема в том, что если вызывается первая функция и вторая функция называется, оба тайм-аута активируются вместе. Есть ли способ отключить таймер одной функции, если она включена.Как очистить тайм-аут в функции javascript

SCRIPT:

function overall(){ 
    $(".one").show(); 
    $(".two").hide(); 
    $(".three").hide(); 
    $(".four").hide(); 
    setTimeout(overall,1000);  
    } 

function mobile(){ 
    $(".one").hide(); 
    $(".two").show(); 
    $(".three").hide(); 
    $(".four").hide(); 
    setTimeout(mobile,1000);   
    } 

Если это сценарий, что я должен делать? потому что обе функции будут активированы, и я не знаю, как отключить тайм-аут, когда один включен.

+0

Вы можете проверить, был ли установлен тайм-аут? – jsedano

+0

вы не отслеживаете таймер, вы должны назначить возврат 'setTimeout' переменной вне сферы действия функции. – Emissary

+0

Можете ли вы привести мне пример? –

ответ

3

setTimeout возвращает значение («ручка таймера»), которое является числом, отличным от 0. Вы можете отменить таймер, передав это значение clearTimeout до истечения таймаута.

Таким образом, вы можете помнить дескриптор таймера для одного или обоих таймеров, которые вы запланировали (в зависимости от того, что вам нужно), и когда что-то происходит, что заставляет вас отменить один из этих таймеров, вызовите clearTimeout с соответствующим ручка.


Вы попросили пример. Так как это все-таки совершенно непонятно мне, что вы хотите отменить, когда я возьму догадку: Вы хотите позвонить в overall отменить любой отложенный вызов mobile и наоборот:

// Variables to hold the timers 
var overallTimer = 0, 
    mobileTimer = 0; 

function overall(){ 
    // If a pending call to mobile exists, cancel it 
    if (mobileTimer) { 
     clearTimeout(mobileTimer); 
     mobileTimer = 0; 
    } 
    $(".one").show(); 
    $(".two").hide(); 
    $(".three").hide(); 
    $(".four").hide(); 
    // Schedule a call to ourselves, remember the timer handle 
    overallTimer = setTimeout(overall,1000);  
    } 

function mobile(){ 
    // If a pending call to overall exists, cancel it 
    if (overallTimer) { 
     clearTimeout(overallTimer); 
     overallTimer = 0; 
    } 
    $(".one").hide(); 
    $(".two").show(); 
    $(".three").hide(); 
    $(".four").hide(); 
    // Schedule a call to ourselves, remember the timer handle 
    mobileTimer = setTimeout(mobile,1000);  
    } 

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

function overall(){ 
    // If a pending call to mobile exists, cancel it 
    if (mobile.timer) { 
     clearTimeout(mobile.timer); 
     mobile.timer = 0; 
    } 
    $(".one").show(); 
    $(".two").hide(); 
    $(".three").hide(); 
    $(".four").hide(); 
    // Schedule a call to ourselves, remember the timer handle 
    timer = setTimeout(overall,1000);  
    } 
overall.timer = 0; 

function mobile(){ 
    // If a pending call to overall exists, cancel it 
    if (overall.timer) { 
     clearTimeout(overall.timer); 
     overall.timer = 0; 
    } 
    $(".one").hide(); 
    $(".two").show(); 
    $(".three").hide(); 
    $(".four").hide(); 
    // Schedule a call to ourselves, remember the timer handle 
    mobile.timer = setTimeout(mobile,1000);  
    } 
mobile.timer = 0; 
+0

Пожалуйста, проверьте измененный код, чтобы увидеть сценарий. –

+0

@jibindcruz: он не меняет ответа. Помните дескриптор (возвращаемое значение 'setTimeout') и используйте' clearTimeout', если вы хотите отменить этот таймер. –

+0

Можете ли вы привести мне пример того, как это сделать? –

Смежные вопросы