Ускорение пустого jQuery () или replaceWith () Функции, Когда Контакт с Большими Элементами DOM

Если вы не используете блок ({}) в качестве тела функции стрелки , тело должно быть выражением :

ArrowFunction:
    ArrowParameters[no LineTerminator here] => ConciseBody

ConciseBody:
    [lookahead ≠ { ] AssignmentExpression
    { FunctionBody }

Но throw - это утверждение , а не выражение.


В теории

() => throw x;

эквивалентно

() => { return throw x; }

, что также недействительно.

7
задан Levi Hackwith 12 June 2009 в 17:17
поделиться

3 ответа

jQuery empty () занимает много времени в вашей таблице, потому что он выполняет действительно колоссальный объем работы с содержимым очищенного элемента в интересах предотвращения памяти утечки. Если вы можете смириться с этим риском, вы можете пропустить задействованную логику и просто выполнить ту часть, которая избавляется от содержимого таблицы, например:

    while ( table.firstChild )
        table.removeChild( table.firstChild );

или

    table.children().remove();
8
ответ дан 7 December 2019 в 03:20
поделиться

Недавно у меня были очень большие таблицы данных, которые занимали от 15 секунд до минуты обработки при внесении изменений из-за всех выполняемых манипуляций с DOM. Я снизил его до <1 секунды во всех браузерах, кроме IE (в IE8 это занимает 5-10 секунд).

Наибольший прирост скорости, который я обнаружил, заключался в удалении родительского элемента, с которым я работал, из DOM, внесении в него моих изменений, а затем повторной вставке его обратно в DOM (в моем случае tbody ).

Здесь вы можете увидеть две соответствующие строки кода, которые дали мне огромное увеличение производительности (с использованием Mootools, но могут быть перенесены на jQuery).

update_table : function(rows) {
    var self = this;
    this.body = this.body.dispose();  //<------REMOVED HERE
    rows.each(function(row) {
        var active = row.retrieve('active');
        self.options.data_classes.each(function(hide, name) {
            if (row.retrieve(name) == true && hide == true) {
                active = false;
            }
        });
        row.setStyle('display', (active ? '' : 'none'));
        row.store('active', active);
        row.inject(self.body);   //<--------CHANGES TO TBODY DONE HERE
    })
    this.body.inject(this.table);  //<-----RE-INSERTED HERE
    this.rows = rows;
    this.zebra();
    this.cells = this._update_cells();
    this.fireEvent('update');
},
2
ответ дан 7 December 2019 в 03:20
поделиться

Нужно ли вам заново заселить все сразу, или вы можете сделать это с помощью chunks на setTimeout ()? Я понимаю, что это, вероятно, займет еще больше времени, но это 'Для пользователя многого стоит увидеть, а не очевидная блокировка.

0
ответ дан 7 December 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: