2011-09-25 5 views
10

Sto usando JavaScript con jQuery. Ho il seguente script per avvisare hi ogni 30 secondi.JavaScript - intervallo jQuery

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

voglio avvisare hi al caricamento della pagina (quando il documento/pagina viene completamente caricata) e su ogni intervallo di 30 secondi dopo (come hi (0s) - hi (30s) - hi ('60) .. eccetera). Ma la mia soluzione funziona su due istanze. Uno su DOM ready e l'altro in loop. C'è un modo per fare lo stesso in una singola istanza?

È possibile vedere il mio violino here.

+0

Qual è il problema? Il tuo jsFiddle avverte inizialmente e ogni 30 secondi successivamente esattamente come il codice specifica. setInterval non chiama la sua funzione fino allo scadere del tempo. Se vuoi che venga eseguito inizialmente, allora lo chiami come hai fatto tu. Se si tratta di una logica più complicata che si desidera chiamare in entrambe le posizioni, è sufficiente inserirla in una funzione con nome che sia possibile chiamare entrambi. – jfriend00

risposta

18

È possibile utilizzare setTimeout invece e riprogrammare il callback stesso.

$(function() { 
    sayHi(); 

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

Perché non usare solo setInterval? – user2019515

+0

@ user2019515 - Ho capito che l'OP voleva una singola chiamata della funzione. '$ (function() {sayHi(); setInterval (sayHi, 30000); function sayHi() {alert ('hi');});' Funzionerebbe anche ma ha istanze separate della funzione. – tvanfosson

9

Avvolgere il codice in una funzione. Quindi, passare la funzione come primo argomento a setInterval, e chiamare la funzione:

$(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

No, questo non è possibile con setInterval. Si potrebbe utilizzare setTimeout per esempio:

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

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

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

    heythere(); 

}); 

Se si vuole eseguire una sola volta dopo 30 secondi, si sta cercando di usare setTimeout non setInterval.

3

Beh, probabilmente è un modo di farlo in una sola chiamata ..

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

Un'altra soluzione sarebbe quella di utilizzare arguments.callee, ma come è ormai deprecato, non è generalmente consigliato usalo

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