循环函数会导致它在 javascript 中无响应

Looping the Function cause it unresponsive in javascript

本文关键字:javascript 响应 函数 循环      更新时间:2023-09-26

这是我为雪花尝试的代码。一切似乎都很好,但是一旦脚本无响应的一段时间意味着(它会减慢浏览器Firefox的速度(。我不确定为什么会发生这种情况。我怎样才能让它响应不会导致浏览器。这是小提琴

我怎样才能使它成为不会导致任何的响应式脚本。!我想我在循环 javascript 函数时犯了一个错误:(任何建议都会很棒。

谢谢

Javascript:

// window.setInterval(generateSnow, 0);
var windowHeight = jQuery(document).height();
var windowWidth = jQuery(window).width();
function generateSnow() {
    for (i = 0; i < 4; i++) {
        var snowTop = Math.floor(Math.random() * (windowHeight));
        snowTop = 0;
        var snowLeft = Math.floor(Math.random() * (windowWidth - 2));
        var imageSize = Math.floor(Math.random() * 20);
        jQuery('body').append(
            jQuery('<div />')
                .addClass('snow')
                .css('top', snowTop)
                .css('left', snowLeft)
                .css('position', 'absolute')
                .html('*')
        );
    }
}

function snowFalling() {
    jQuery('.snow').each(function(key, value) {
        if (parseInt(jQuery(this).css('top')) > windowHeight - 80) {
            jQuery(this).remove();
        }
        var fallingSpeed = Math.floor(Math.random() * 5 + 1);
        var movingDirection = Math.floor(Math.random() * 2);
        var currentTop = parseInt(jQuery(this).css('top'));
        var currentLeft = parseInt(jQuery(this).css('left'));
        jQuery(this).css('top', currentTop + fallingSpeed);
        if (movingDirection === 0) {
            jQuery(this).css('bottom', currentLeft + fallingSpeed);
        } else {
            jQuery(this).css('bottom', currentLeft + -(fallingSpeed));
        }
    });
}
window.setInterval(snowFalling, 15);
window.setInterval(generateSnow, 1000);

您在运行时在页面上添加和删除大量元素,使浏览器频繁刷新该页面的结构。

该方法是:

  1. 在性能方面你能做的最糟糕的事情
  2. 可能会让浏览器在
  3. 生成、删除、生成、删除、生成、删除、删除后瘫倒在地......

使用此配置,移动浏览器可能会在 2 秒后冻结。

我建议在一开始就预生成所有 DIV,重用它们并使用 CSS 动画或 jQuery animate(( 来完成您要做的事情。

正如@ZathrusWriter提到的,你应该重用你的雪花元素,这样内存就不会膨胀。

创建一堆雪花后浏览器开始变慢的原因是因为 JavaScript 使用garbage collector管理内存。因此,释放内存的速度比为新雪花分配内存的速度要慢得多。理想情况下,您希望为所有雪花分配一次内存。

基本上,在任何给定时间为屏幕上您想要的雪花数量创建元素。将它们全部放在屏幕上随机位置开始。然后,一旦雪花离开屏幕或隐形,该雪花就可以再次使用。因此,您将它移回顶部(可能在另一个随机位置(,并使其再次像雪花一样落下(而不是删除它并创建一个新的(。

这距离创建粒子发射器只有一步之遥。