有什么方法可以修复/重构这个 jQuery 脚本,使其消耗更少的内存并运行得更快吗? (我使用的是1.6.2)

发布于 2024-11-27 12:25:26 字数 1296 浏览 3 评论 0原文

我是 jQuery 的新手,我正在用它制作幻灯片轮播,我不知道我是否错过了这里的某些内容,所以请看一下我的脚本:

function gotoItem(main, hidden, con, speed, state) {
con.css('display', 'none');
switch(state) {
    case 'next' :
    main.children(':first').appendTo(hidden).css('left','0px');
    hidden.children(':first').appendTo(main).css('left', '730px');
    lmove = '-=120px';
    middle = 3;
    end = 6;
    break
    case 'prev' :
    main.children(':last').prependTo(hidden).css('left', '0px');
    hidden.children(':last').prependTo(main).css('left', '-230px');
    lmove = '+=120px';
    middle = 3;
    end = 6;
    break;
}

main.children().each(function(i) {
    if(i==end) {
        $(this).stop().animate({
        left: lmove
        }, speed, function() {
        con.css('display', 'block');
        });
    } else {
        if(i==middle) {
            $(this).stop().animate({
            left: lmove,
            opacity : 1
            }, speed);
        } else {
            $(this).stop().animate({
            left: lmove,
            opacity : 0.3
            }, speed);
        }
    }
    });
}

实际上代码没有任何问题,但当我发现它时,它真的让我烦恼发现脚本已经消耗了大量内存(每次函数运行大约 100kb),更不用说 cpu 上下波动了大约 20-30%(我使用的是单核笔记本电脑,我的浏览器是 Chrome 12)。我用Firefox测试了一下,结果基本是一样的。那么,有什么建议吗?我应该如何重写脚本,以便它可以更快/更少内存泄漏?或者也许我对剧本无能为力?先感谢您

I'm new to jQuery, I was making a slide carousel with it and I don't know if I miss something here so please take a look at my script:

function gotoItem(main, hidden, con, speed, state) {
con.css('display', 'none');
switch(state) {
    case 'next' :
    main.children(':first').appendTo(hidden).css('left','0px');
    hidden.children(':first').appendTo(main).css('left', '730px');
    lmove = '-=120px';
    middle = 3;
    end = 6;
    break
    case 'prev' :
    main.children(':last').prependTo(hidden).css('left', '0px');
    hidden.children(':last').prependTo(main).css('left', '-230px');
    lmove = '+=120px';
    middle = 3;
    end = 6;
    break;
}

main.children().each(function(i) {
    if(i==end) {
        $(this).stop().animate({
        left: lmove
        }, speed, function() {
        con.css('display', 'block');
        });
    } else {
        if(i==middle) {
            $(this).stop().animate({
            left: lmove,
            opacity : 1
            }, speed);
        } else {
            $(this).stop().animate({
            left: lmove,
            opacity : 0.3
            }, speed);
        }
    }
    });
}

Actually there's nothing wrong with the code but it really bugged me when I found out that the script has eaten up a lot of memory (about 100kb everytime the function runs), and not to mention the cpu's been up and down about 20-30 percent (I'm using single-core laptop and my browser is Chrome 12). I've been testing it with Firefox and the result is basically the same. So, any suggestion? How should I rewrite the script so that it can go faster/less memory leaks? Or maybe there's nothing more I can do with the script? Thank you in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

陈甜 2024-12-04 12:25:26

为 left 属性设置动画总是消耗内存。您可以使用指定了 overflow:hidden; 的覆盖 div,然后使用 .scrollLeft() 为幻灯片设置动画。

请参阅 jQuery for Designers - Fun with Overflows

这已经将我们带到了另一个点,您可以在其中节省资源。您最初加载内容并将其放在看不见的地方,而不是浏览器随后必须渲染的附加和前置项目。这显然是性能与加载时间的决定,并且可能不会对您的整体性能产生太大影响,但一般来说,如果您的目标是低端机器,则应避免大量 Dom 操作。

animating the left property is always memory consuming. You could rather use an overlying div with overflow:hidden; specified, and then use .scrollLeft() to animate the slides.

Refer to jQuery for Designers - Fun with overflows

This already takes us to another point, where you can save resources. Instead of appending and prepending items the browser has to render afterwards, you initially load the content and just place it out of sight. This is clearly a decision of performance vs. load times and might not be that impressive on your overall performance, but generally speaking, heavy Dom Manipulation is to be avoided if you target lower-end machines.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文