setInterval不会被触发

时间:2013-07-05 05:43:33

标签: javascript jquery

以下是我用来定期运行函数的函数。我用这个函数来改变身体的背景。但由于某种原因它不会被解雇。请帮我这个代码。

setInterval(uiImageChanger(),1);

    function uiImageChanger(){
        var currentTime = new Date().getHours();
        var images = ['image1.jpg','image2.jpg'];

        if( currentTime > 00 && currentTime <= 12){
            $('body').css('background-image', "url(" + randomImagePicker(images ,'breakfast') + ")");
        }else if( currentTime > 12 && currentTime <= 16){
            $('body').css('background-image', "url(" + randomImagePicker(images ,'lunch') + ")");
        }else if( currentTime > 16 && currentTime <= 00){
            $('body').css('background-image', "url(" + randomImagePicker(images ,'dinner') + ")");
        }
    }

    function randomImagePicker(imgArray,time){
        if(time == 'breakfast'){
            return "../images/main_image/breakfast/" + imgArray[Math.floor(Math.random() * imgArray.length)];
        }else if(time == 'lunch'){
            return "../images/main_image/lunch/" + imgArray[Math.floor(Math.random() * imgArray.length)];
        }else if(time == 'dinner'){
            return "../images/main_image/dinner/" + imgArray[Math.floor(Math.random() * imgArray.length)];
        }
    }

谢谢。

4 个答案:

答案 0 :(得分:5)

从setInterval函数参数中删除parens。现在,这将调用该函数并将函数的返回值设置为setInterval的引用,此处为undefined,因为您不返回任何内容。所以基本上你没有设置间隔,所以除了在设置setInterval时第一次执行时没有任何反应。

更改

setInterval(uiImageChanger(),1); // This will invoke the function immediately.

setInterval(uiImageChanger,1); // You want to set the reference of the function to setInterval.

答案 1 :(得分:4)

您必须将指针传递给函数而不执行该函数。

setInterval(uiImageChanger,1);

答案 2 :(得分:1)

有多种方法可以使用setInterval定义要执行的函数。 其中一种方法是使用函数引用,其示例由#mohkhan给出。 但是,您也可以执行以下操作

    setInterval(function(){
           // code comes here.
    }, time_in_mills);

另外我看到你已经提到函数执行的值为1.这意味着每1毫秒执行一次函数,这根本不是一个好习惯。以毫秒为单位给出一个实际的时间,以便您有足够的时间执行代码。

答案 3 :(得分:1)

您已经获得了有关setInterval()问题的几个答案。我想在代码中指出其他几个问题。

首先,此测试将始终失败:

else if( currentTime > 16 && currentTime <= 00)

毕竟,如果一个数字是> 16它也不能是&lt; = 0。

此外,您可能会收到警告:00是一个不推荐使用的八进制常量。当然,八进制零与十进制零的值相同,但要注意无意的八进制常量:避免使用前导零。

代码中有很多重复。您可以轻松删除所有这些重复,以使代码更易于维护。考虑这种方法:

// Return a random integer >= 0 and < n
function randomInt( n ) {
    return Math.floor( Math.random() * n );
}

// Return a random element from an array
function randomElement( array ) {
    return array[ randomInt(array.length) ];
}

function uiImageChanger(){
    var hour = new Date().getHours();
    var meal =
        hour <= 12 ? 'breakfast' :
        hour <= 16 ? 'lunch' :
        'dinner';
    var images = [ 'image1.jpg', 'image2.jpg' ];
    $('body').css(
        'background-image',
        'url(../images/main_image/' + meal +
            '/' + randomElement(images) + ')'
    );
}