2011-09-25 9 views
10

Używam JavaScript z jQuery. Mam następujący skrypt do ostrzeżenia hi co 30 sekund.JavaScript - interwał jQuery

$(document).ready(function() { 
    alert("hi"); 
setInterval(function() { 
    alert("hi"); 
}, 30000); 
}); 

Chcę ostrzec hi po załadowaniu strony (gdy dokument/strona dostaje całkowicie załadowany) i na każdym odstępie 30 sekund później (jak hi (0s) - hi (30s) - hi (60s) .. itp). Ale moje rozwiązanie działa na dwóch instancjach. Jeden na DOM gotowy, a drugi w pętli. Czy jest jakiś sposób, aby zrobić to samo w jednym przypadku?

Możesz zobaczyć moje skrzypce here.

+0

Na czym polega problem? Twój jsFiddle ostrzega początkowo, a następnie co 30 sekund dokładnie tak, jak określa kod. setInterval nie wywołuje swojej funkcji, dopóki nie upłynie czas. Jeśli chcesz, aby był wykonywany na początku, po prostu wywołaj go tak, jak zrobiłeś. Jeśli jest to bardziej skomplikowana logika, którą chcesz wywołać w obu miejscach, po prostu umieść ją w nazwanej funkcji, którą możesz wywołać w obu miejscach. – jfriend00

Odpowiedz

18

Zamiast tego można użyć funkcji setTimeout i zmienić harmonogram wywołania zwrotnego.

$(function() { 
    sayHi(); 

    function sayHi() { 
     setTimeout(sayHi,30000); 
     alert('hi'); 
    } 
}); 
+0

Dlaczego po prostu nie użyć setInterval? – user2019515

+0

@ user2019515 - Zrozumiałem, że OP chciał jednego wywołania funkcji. '$ (function() {sayHi(); setInterval (sayHi, 30000); funkcja sayHi() {alert ('hi');});' również będzie działać, ale ma oddzielne instancje funkcji. – tvanfosson

9

Zawiń swój kod w funkcję. Następnie przekazać funkcję jako pierwszy argument do setInterval i wywołać funkcję:

$(document).ready(function() { 
    //Definition of the function (non-global, because of the previous line) 
    function hi(){ 
     alert("hi"); 
    } 

    //set an interval 
    setInterval(hi, 30000); 

    //Call the function 
    hi(); 
}); 
1

Nie, nie jest to możliwe z setInterval. Można użyć setTimeout na przykład:

function foo() { 
    alert('hi'); 
    setTimeout(foo, 30000); 
} 

$(function() { 
    foo(); 
}); 
1
$(function() { 

    function heythere() { 
     alert('hi'); 
     setTimeout(heythere,30000); 
    } 

    heythere(); 

}); 

Jeśli chcesz go uruchomić tylko raz po 30 sekundach, szukasz używać setTimeout nie setInterval.

3

Cóż, prawdopodobnie istnieje sposób to zrobić tylko w jednym zaproszeniu ..

setInterval(
    (function x() { 
     alert('hi'); 
     return x; 
    })(), 30000); 

Innym rozwiązaniem byłoby wykorzystanie arguments.callee, ale jak to jest obecnie przestarzała, to na ogół nie zaleca się Użyj tego.

setInterval(
    (function() { 
     alert('hi'); 
     return arguments.callee; 
    })(), 30000);