javascript - jQuery 样式重应用效率

标签 javascript jquery html css

这个问题部分依赖于对 jQuery 内部工作原理的了解。

假设我有一个垂直溢出的页面,允许用户向下滚动,我的 JS 中有以下代码:

$(document).scroll(function() {
    var y = $(document).scrollTop();
    if (y > 500) {
        $("body").css("background-color", "red");
    }
    else {
        $("body").css("background-color", "blue");
    }
});

这工作得很好。但是,它可以像这样修改:

var isRed = false;
$(document).scroll(function() {
    var y = $(document).scrollTop();
    if (y > 500) {
        if (!isRed) {
             $("body").css("background-color", "red");
             isRed = true;
        }
    }
    else {
        if (isRed) {
             $("body").css("background-color", "blue");
             isRed = false;
        }
    }
});

有理由选择第二段代码而不是第一段代码吗?如果我使用第一段代码,jQuery 会在每次触发滚动事件时一遍又一遍地应用样式吗?

我已经习惯了 React 的工作方式,只更新每次渲染时发生变化的内容。 jQuery 是否包含这样的功能?

这两段代码完成同样的事情。附加的 isRed 条件使第二个版本的代码更加冗长和复杂,但它可能会大大提高效率。它提供任何这样的好处吗?如果是这样,那么使用它而不是第一个是有意义的。

最佳答案

Is there a reason to choose the second bit of code over the first one?

是的,如果您遇到滚动性能问题。否则,是否重新应用样式都没有关系。

Were I to use the first bit of code, would jQuery apply the style over and over again every time scroll event fired?

在每个滚动事件中,当您执行 $(body).css("background-color", "red") 时,jQuery 需要:

  1. 创建一个新对象

  2. 确定您传递的字符串是一个选择器,而不是 HTML

  3. 检查选择器是否包含 jQuery 扩展

  4. 查询选择器的 DOM

  5. 构建结果的单项数组

  6. 有效地循环遍历单项数组:

    element.style.backgroundColor = "red";
    

如果颜色与已经存在的颜色匹配,浏览器可能会忽略它。

如果您想在不使代码更复杂的情况下为 jQuery 省去一些麻烦,请为其提供 document.body 以供其使用,这样它就可以跳过第 2-4 步。您还可以稍微简化代码:

$(document).scroll(function() {
    var y = $(document).scrollTop();
    $(document.body).css("background-color", y > 500 ? "red" : "blue");
});

或者如果您确实想完全优化调用:

(function() { // To avoid making `lastColor` a global
    var lastColor;
    $(document).scroll(function() {
        var y = $(document).scrollTop();
        var color = y > 500 ? "red" : "blue";
        if (color !== lastColor) {
            lastColor = color;
            document.body.style.color = color;
        }
    });
})();

请注意,您不能将 colordocument.body.style.color 进行比较,它们可能(通常)采用不同的格式。

关于javascript - jQuery 样式重应用效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45414111/

相关文章:

javascript - 如何嵌入实时跟踪网页livefromspace.com

javascript - 强制浏览器下载具有相同 src 的多个脚本标签

javascript - 仅当 div 包含某些特定单词时才隐藏它

javascript - 从html调用.js文件中的函数?

javascript - JQuery 自动完成 - Http 基本身份验证

javascript - 如何查找具有特定类名的类内的控件

javascript - 加载后淡出整个网站.gif

javascript - Fancybox 表单 ajax 发布关闭提交

javascript - Apollo useQuery Hook 无法使用 writeQuery() 方法从缓存获取更新。没有看到错误

javascript - innerhtml提取dom中相邻元素的方法