У меня есть функция jquery, которая добавляет тег в первую строку таблицы. Я попытался использовать append, но его не работает, поэтому я получил решение, которое очень медленно, и оно каким-то образом дает ошибку. "Скрипт на этой странице приводит к медленному запуску Internet Explorer..."
Функция - это
jQuery.fn.fixGridView = function () {
"use strict";
// var start = +new Date(); // log start timestamp
if (jQuery(this).is('table') && this.find('thead').length === 0) {
var theadv = "<thead><tr>" + this.find('tbody tr:first').html(); +"</tr></thead>";
this.find('tbody tr:first').remove();
var htmlv = this.html();
this.html(theadv + htmlv);
}
//var end = +new Date(); // log end timestamp
// var diff = end - start;
// alert(diff);
return this;
};
Может ли кто-нибудь помочь мне сделать этот код быстрее?
EDIT: Я должен использовать IE... это требование (ie8). Edit2: Я создал js скрипку: http://jsfiddle.net/4xLzL/
Чтобы повысить производительность рендеринга, вы должны понимать, что манипуляции с DOM (включая перепланировки и перерисовки) являются дорогостоящими операциями. Ваш код в настоящее время повторно создает всю таблицу с добавлением <thead>
большая часть содержимого <tbody>
остается неизменной. Этот массивный "перерисовка" таблицы очень неэффективен. Особенно, когда в IE 8, где таблицы рендеринга являются слишком медленными, вам необходимо как можно меньше изменить DOM.
Я реорганизовал вашу логику, чтобы свести к минимуму количество выполняемых запросов, чтобы найти элементы, сохранив их в переменной, которую нужно повторно использовать. Также удалил вызов .html('...')
который повторно отображает таблицу, но вместо этого использовал .prepend()
чтобы добавить <thead>
в <table>
в качестве первого дочернего .prepend()
.
jQuery.fn.fixGridView = function () {
"use strict";
var start = +new Date(); // log start timestamp
if (this.is('table') && this.children('thead').length === 0) {
var firstRow = this.children('tbody').children('tr:first');
var thead = "<thead><tr>" + firstRow.html() + "</tr></thead>";
firstRow.remove();
this.prepend(thead);
}
var end = +new Date(); // log end timestamp
var diff = end - start;
alert(diff);
return this;
};
$(document).ready(function () {
$('table[id*="gvCategories"]').fixGridView();
});
Идите и протестируйте его в IE8: http://jsfiddle.net/amyamy86/4xLzL/7/
Проблема заключается не в плагине, а в селекторе. Вам нужны только таблицы, поэтому измените свой селектор следующим образом.
$('table [id*="gvCategories"]').fixGridView();
Я также обновил скрипку.