web-dev-qa-db-fra.com

JavaScript - Intervalle jQuery

J'utilise JavaScript avec jQuery. J'ai le script suivant pour alerter hi toutes les 30 secondes.

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

Je veux alerter hi lorsque la page se charge (lorsque le document/page est complètement chargé) et toutes les 30 secondes par la suite (comme hi (0s) - hi (30s ) - hi (années 60) .. etc). Mais ma solution fonctionne sur deux instances. Un sur DOM prêt et l'autre en boucle. Existe-t-il un moyen de faire de même en une seule fois?

Vous pouvez voir mon violon ici.

11
blasteralfred Ψ

Vous pouvez utiliser setTimeout à la place et faire replanifier le rappel lui-même.

$(function() {
    sayHi();

    function sayHi() {
       setTimeout(sayHi,30000);
       alert('hi');
    }
});
18
tvanfosson

Enveloppez votre code dans une fonction. Ensuite, passez la fonction comme premier argument à setInterval et appelez la fonction:

$(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();
});
9
Rob W

Eh bien, il y a probablement un moyen de le faire en un seul appel ..

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

Une autre solution serait d'utiliser arguments.callee, mais comme il est désormais obsolète, il n'est généralement pas recommandé de l'utiliser.

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

Non, ce n'est pas possible avec setInterval. Vous pouvez utiliser setTimeout par exemple:

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

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

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

    heythere();

});

Si vous voulez qu'il ne s'exécute qu'une seule fois après 30 secondes, vous cherchez à utiliser setTimeout pas setInterval.

1
daryl