Я предлагаю два улучшения:
- Кэш
DOM References
- Работа за вашим столом в автономном режиме
Пример
function prepareTable() {
var groupIndex = 0;
var $mytable = $('#row'),
$parent = $mytable.parent();
$mytable = $mytable.detach();
$mytable.find('tr').each(function(index) {
var $this = $(this);
var group = $this.attr('id', 'node-'+index).removeClass("odd event").find('td :hidden').attr('value');
// if it is a group, add special styles to row and remember row index
if (group == 'true') {
groupIndex = index;
$this.addClass('odd').find("td:first")
.mouseenter(function() {
$this.parent().addClass("swGroupLink");
})
.mouseleave(function() {
$this.parent().removeClass("swGroupLink");
});
} else {
// make all following rows to children of the previous group found
$this.addClass('even child-of-node-' + groupIndex);
}
});
$parent.append($mytable);
}
Я добавил переменную $this
, которая кэширует $(this)
в вашем цикле .each()
. Я также добавил $mytable
и $parent
. $mytable
хранит элемент #row
, а $parent
сохраняет родительский узел из #row
. Это потому, что я удаляю весь элемент из DOM, выполняю работу и снова присоединяю его к родителю.
Тестовая среда: http://www.jsfiddle.net/2C6fB/4/
Если это все еще слишком медленно, у вас есть другие варианты здесь. Во-первых, посмотрите, можете ли вы разбить петлю на более мелкие части. Вы можете оптимизировать это, как много, используя asychronous
обратные вызовы, например, setTimeout
. Это может быть сложным делом, и мне нужно было бы знать ваш код более подробно, но в целом вы можете просто заключить весь цикл в отдельные функции setTimeout()
. Пример -> http://www.jsfiddle.net/2C6fB/5/
Это гарантирует, что браузер не будет "зависать" во время работы. Но, конечно, это заняло немного больше времени, чтобы завершить всю задачу.