2011-09-25 16 views
10

Estoy usando JavaScript con jQuery. Tengo la siguiente secuencia de comandos para alertar hi cada 30 segundos.JavaScript - jQuery interval

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

Quiero alertar hi cuando se carga la página (cuando el documento/página se ha cargado completamente) y en cada intervalo de 30 segundos después (como hi (0s) - hi (30s) - hi (60s) .. etc.) Pero mi solución funciona en dos instancias. Uno en DOM listo y el otro en un bucle. ¿Hay alguna manera de hacer lo mismo en una sola instancia?

Puedes ver mi violín here.

+0

¿Cuál es el problema? Sus alertas jsFiddle inicialmente y cada 30 segundos a partir de entonces exactamente como especifica el código. setInterval no llama su función hasta que transcurra el tiempo. Si quieres que se ejecute inicialmente, entonces simplemente llámalo como lo hiciste. Si es una pieza lógica más complicada que desea llamar en ambos lugares, simplemente colóquela en una función con nombre que puede llamar a ambos lugares. – jfriend00

Respuesta

18

Puede usar setTimeout en su lugar y hacer que la devolución de llamada se reprograme.

$(function() { 
    sayHi(); 

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

¿Por qué no usar setInterval? – user2019515

+0

@ user2019515 - Comprendí que el OP quería una sola invocación de la función. '$ (function() {sayHi(); setInterval (sayHi, 30000); function sayHi() {alert ('hi');});' también funcionaría pero tiene instancias separadas de la función. – tvanfosson

9

Envuelva su código en una función. A continuación, pasar a la función como primer argumento para setInterval, y llamar a la función:

$(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, eso no es posible con setInterval. Se podría utilizar setTimeout por ejemplo:

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

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

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

    heythere(); 

}); 

Si usted quiere que sólo se ejecutan una vez después de 30 segundos, que busca utilizar setTimeout no setInterval.

3

Bueno, probablemente hay una manera de hacerlo en una sola llamada ..

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

Otra solución sería utilizar arguments.callee, pero ya que ahora es obsoleto, por lo general no se recomienda usarlo

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