设置设置间隔函数正在运行并导致浏览器崩溃

Setting setInterval function is running and crashing the browser.

本文关键字:设置 浏览器 崩溃 函数 运行      更新时间:2023-09-26

我有一个几乎可以工作的函数。

它查找类为 .hex 的元素,然后运行一个介于 5 和 13 之间的随机数,然后将这些 .hex 项附加到文档正文中。

然后我有一个延迟,六边形慢慢淡入和淡出。

我想做的是在循环中创建它,以便它们不断淡入淡出。

我已经注释掉了代码,这应该按照我的理解工作,但目前没有。

我所做的只是将所有代码包装在一个名为 initHex() 的新函数中,然后在代码之后,我使用 setInterval 每 12 秒(目前)运行一次函数。

我可以在控制台中看到函数运行,然后开始非常快速地循环,数字急剧增加,并且很快它停止浏览器响应。

我想知道该函数是否包裹了太多代码。

这个想法是,希望当前函数仍在运行(淡出六边形),因为新的函数正在淡入。

我假设在函数结束时,我还需要一些东西来删除现有的十六进制元素,这样它们就不会继续添加到文档中。我确实试过这个。

这是函数:

 //function initHex() {
    $rndNum = Math.floor(Math.random() * 8) + 5;
    var e = $('.hex');
        for (var i = 0; i < $rndNum ; i++) {
        $docHeight = $(window).height();
        $docHeight = Math.random() * $docHeight * 2;
        $docWidth = $(window).width();
        $docWidth = Math.random() * $docWidth;
        $rndOpacity = Math.random();
        $rndSpeed = Math.floor(Math.random() * 2000) + 2000;
        e.each(function(){
            $(this).css({
                position:   'absolute',
                top:        $docHeight,
                left:       $docWidth - 195,
                opacity:    $rndOpacity
            });
            e.clone().prependTo('body').delay(e.length*800).fadeIn($rndSpeed).delay(1000).fadeOut($rndSpeed*2);
            console.log($rndNum, $rndOpacity, $rndSpeed);
        });
    }
//}
 //setInterval(initHex, 12000);

在运行六边形后删除它们方面,我尝试过:

 e.clone().prependTo('body').delay(e.length*800).fadeIn($rndSpeed).delay(1000).fadeOut($rndSpeed*2.5, function(){
      e.remove();
 });

这是小提琴:http://jsfiddle.net/lharby/j5bSz/尽情分叉。

蒂亚

我已经重新设计了你的代码。你犯了一些错误,是的,你每次都尝试用类 hex 克隆整堆元素,但数组没有方法克隆。

试试这个:

function initHex() {
    var $rndNum = Math.floor(Math.random() * 8) + 5;
    for (var i = 0; i < $rndNum ; i++) {
        var $docHeight = $(window).height()
          , $top = Math.random() * $docHeight * 2
          , $docWidth = $(window).width()
          , $left = Math.random() * $docWidth - 195
          , $rndOpacity = Math.random()
          , $rndSpeed = Math.floor(Math.random() * 2000) + 2000;
        $('<div></div>').addClass('hex').css({
            position:   'absolute',
            top:        $top,
            left:       $left,
            opacity:    $rndOpacity
        }).prependTo('body').delay(1000).fadeIn($rndSpeed).delay(1000).fadeOut($rndSpeed*2, function(){
           this.remove();
        });
    }
}
setInterval(initHex, 12000);

还有一件事,这段代码仍然没有优化,但我试图尽可能多地保存你的代码,让你更清楚。

http://jsfiddle.net/andbas/DZSJT/1/