gpt4 book ai didi

javascript - 最小化 jquery.append 繁重站点的 DOM 访问

转载 作者:行者123 更新时间:2023-11-28 07:10:20 27 4
gpt4 key购买 nike

这里有一些代码,代表了我编写网站的一般风格:

!function(){
window.ResultsGrid = Class.extend(function(){

this.constructor = function($container, options){
this.items = [];
this.$container = $($container);
this.options = $.extend({}, defaultOptions, options);

this.$grid = $(
'<div class="results-grid">\
<ul></ul>\
</div>'
)
.css("margin", -this.options.spacing / 2);

this.$list = this.$grid.find("ul");

this.$container.append(this.$grid);
};


this.setItems = function(datas) {
this.$grid.addClass("display-none");
this.clear();
for (var k in datas) this.addItem(datas[k]);
this.$grid.removeClass("display-none");
};

this.addItem = function(data) {
var width = this.options.columnWidth;
var height = this.options.rowHeight;
var padding = this.options.spacing / 2;
if (this.options.columns > 0) width = (this.$container.width() - this.options.columns * this.options.spacing) / this.options.columns;
if (this.options.rows > 0) height = (this.$container.height() - this.options.rows * this.options.spacing) / this.options.rows;
if (this.options.ratio > 0) height = width / this.options.ratio;
var item = new (this.options.class)(this.$list, {
data: data,
type: this.options.type,
width: width,
height: height,
padding: padding
});
this.items.push(item);
};

this.clear = function() {
for (var k in this.items) this.items[k].destroy();
this.items.length = 0;
};

this.destroy = function() {
this.clear();
this.$grid.find("*").off();
this.$grid.remove();
}
});

var defaultOptions = {
class: ResultsItem.Game,
type: ResultsItem.Game.COMPACT,
columns:1,
rows:0,
spacing: 10,
rowHeight: 80,
ratio: 0,
columnWidth: 0
};

}();

这是我用于项目列表的东西,它只是一个基类,所以它看起来毫无意义。在我的主页上,我有一些“结果网格”,总共大约有 100 个项目需要添加。这些项目中的每一个都会对其代表的 jquery 对象调用append、addClass、css 等大约5 次,因此在渲染之前需要进行大量的HTML 调整。问题是,有相当明显的时间延迟,因为我刚刚意识到我通过为每个项目调用 jquery.append 等方法来访问 DOM 不必要的次数。

显而易见的解决方案是通过连接每个项目的 html 字符串来为每个 ResultsGrid 执行一个大追加,但我想知道这和我当前的方法之间是否有一个中间立场,它的性能也一样,否则我会重写大量代码。

我喜欢从 $("") 开始并一点一点地追加,但显然这在性能方面并不是很好,因为它会不断地重新计算东西,但我不需要知道 $("") 的宽度、高度和位置一切的每一步。理想情况下,我想告诉它不要对 DOM 做任何事情,直到我告诉它这样做。如果没有办法用 jquery 来做到这一点,那么我想要一个允许我做到这一点的库。我简要了解了 js 模板库,但它们看起来不太吸引人。尤其是 Angular 。

最佳答案

我不知道你想要做什么,但是,据我了解,你可以尝试使用 jquery 的 $.detach() 函数。

this.setItems = function(datas) {
//store the parent of this grid
this.parent = this.$grid.parent();
this.$grid.detach();
this.$grid.addClass("display-none");
this.clear();

//here you add your html/etc to the grid
for (var k in datas) this.addItem(datas[k]);

//reattach the grid to the parent
this.parent.append(this.$grid);
this.$grid.removeClass("display-none");
};

对分离元素进行 DOM 操作应该更快,并为您提供一个像您所想的中间解决方案。这是一个性能提示,您可以在 here 中找到,以及其他一些有用的。

关于javascript - 最小化 jquery.append 繁重站点的 DOM 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31369760/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com