У меня есть страница с примерно 300 div
, я переключаю их css, чтобы они были либо на 100%, либо на 200 пикселей. Моя функция работала, когда было только 10 или около того div, но теперь их так много, моя функция, похоже, падает.
Может ли кто-нибудь объяснить, почему это происходит или "улучшить" мою текущую функцию?
$('.grid').click(function () {
$('.vacancy').animate({ opacity: 0 }, 500, function () {
$(".vacancy").switchClass("listview", "gridview", 100);
$(".vacancy").stop().animate({ opacity: 1 }, 500);
$('a.gridView').removeClass('grid-active');
$('a.listView').addClass('list-active');
});
return false;
});
$('.list').click(function () {
$('.vacancy').animate({ opacity: 0 }, 500, function () {
$(".vacancy").switchClass("gridview", "listview", 100);
$(".vacancy").stop().animate({ opacity: 1 }, 500);
$('a.gridView').removeClass('grid-active');
$('a.listView').addClass('list-active');
});
return false;
});
Функция обратного вызова запускается для каждого анимированного элемента.
Если у вас есть .vacancy
, обратный вызов будет выполняться 300 раз. Каждый раз, когда выполняется обратный вызов, $(".vacancy").switchClass()
будет вызываться для 300 элементов. 300 x 300... много.
Вы можете начать с использования this
в обратном вызове:
$('.grid').click(function () {
$('.vacancy').animate({ opacity: 0 }, 500, function () {
$(this).switchClass("listview", "gridview", 100);
$(this).stop().animate({ opacity: 1 }, 500);
$('a.gridView').removeClass('grid-active');
$('a.listView').addClass('list-active');
});
return false;
});
Вам понадобится другой метод, чтобы уменьшить количество раз, когда вызываются две другие строки, но без html я не могу сказать, каким будет решение.
Здесь скрипка с демонстрацией: http://jsfiddle.net/jkcY3/
$.fn.logMe = function() {
return this.each(function() {
console.log('logMe called', this);
});
};
$('.vacancy').animate({ opacity: 0 }, 500, function() {
$('.vacancy').logMe();
});
Если бы у меня было 300 div, я бы получил 90000 вызовов logMe()
;