Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.09.2013, 00:41
Интересующийся
Отправить личное сообщение для grego Посмотреть профиль Найти все сообщения от grego
 
Регистрация: 09.01.2012
Сообщений: 26

Тормозит раскрытие блока в chrome
Доброго вечера!

Столкнулся с проблемой при написании самодельного разворачиваемого блока на JS. Суть функции банальна - постепенное увеличение высоты div (id = 'legend-bar') с нуля при первом нажатии на кнопку, и соотв-но уменьшение при втором.
Привожу код, который этим управляет:
legendButton.addEventListener("click", function () {

        var height = legendBar.offsetHeight, //здесь запоминаем начальное значение высоты нашего блока
            expand = function () { 

                var i = 0,
                    pxls = 'px';
                /*ниже создаем таймер, который отрабатывает каждые 10 мс для обеспечения плавности
                   На каждом шаге таймера приращиваем высоту на 5 пикселей.*/
                var cntrExpand = setInterval(function () { 
                    document.getElementById('legend-bar').style.height = i + pxls;
                    i += 5;

                    if (i > 100) {
                        console.log("ending expand");
                        clearInterval(cntrExpand);
                    }

                }, 10);


            },
            gripe = function () {

                var i = 0,
                    pxls = 'px';
                //здесь аналогично, только уже происходит уменьшение
                var cntrGripe = setInterval(function () {
                    document.getElementById('legend-bar').style.height = height + pxls;
                    height -= 5;

                    if (height < i) {
                        clearInterval(cntrGripe);
                    }

                }, 10);

            };
        //здесь происходит вызов функции в зав-ти от четного/нечетного значения счетчика (1 по дефолту)
        if (legendCounter % 2 !== 0) {
            expand();
        } else {
            gripe();
        }

        legendCounter++;

    }, false);


Собственно проблема заключается в том, что из 4-х браузеров - Хром, ФФ, опера, ие 9 - ужасно тормозит в хроме при разворачивании/сворачивании, в остальных отрабатывает нормально, почему - не понимаю.

Кто-нибудь может подсказать почему данный код нагружает браузер?
Может быть привести какие-то дополнительные данные?
Ответить с цитированием
  #2 (permalink)  
Старый 12.09.2013, 10:37
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от grego
почему данный код нагружает браузер?
Потестируй примеры
http://learn.javascript.ru/settimeou...таймера
В своих браузерах...
Одинаково работают?
Ответить с цитированием
  #3 (permalink)  
Старый 12.09.2013, 11:06
Интересующийся
Отправить личное сообщение для grego Посмотреть профиль Найти все сообщения от grego
 
Регистрация: 09.01.2012
Сообщений: 26

Ну, визуально - вроде да) Но вот в хроме эти примеры отрабатывают нормально, в отличии от того кода, который я привел.
Ответить с цитированием
  #4 (permalink)  
Старый 12.09.2013, 11:12
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от grego
в хроме эти примеры отрабатывают нормально, в отличии от того кода, который я привел
Тогда делай работающий тестовый пример, посмотрим как он будет работать...
Ответить с цитированием
  #5 (permalink)  
Старый 12.09.2013, 22:54
Интересующийся
Отправить личное сообщение для grego Посмотреть профиль Найти все сообщения от grego
 
Регистрация: 09.01.2012
Сообщений: 26

Ну собственно вот - http://learn.javascript.ru/play/P1xOTb

Повырезал все ненужное при этом оставил стили (возможно их высчитывание как-то влияет), для воспроизведения нужно кликнуть на кнопку information. Попробовал еще раз в 4-х браузерах: хром 29, ие 9, опера 11.10 и файрфокс 20 - в хроме тормозит сильно, затем следует опера - в ней уже работает гораздо лучше, но "рывки" анимации все равно ощутимы, затем файрфокс - в нем тормозит при первом открытии, скрытии, затем все ок, ну и лучше всего как ни странно - в ие 9, там работает нормально.

Заметил любопытную особенность - если удалить из хтмл-кода таблицу полностью, то слайдер отрабатывает быстро во всех браузерах, но таблица нужна, поэтому прошу подсказать другие варианты решения проблемы)
Ответить с цитированием
  #6 (permalink)  
Старый 13.09.2013, 08:36
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от grego
если удалить из хтмл-кода таблицу полностью, то слайдер отрабатывает быстро во всех браузерах
Мало того! Он притормаживает сильнее при каждом добавлении новой строки в ту таблицу.
Т.е. когда строка одна - работает нормально.
А вот потом при каждом добавлении все медленнее и медленнее...
Ответить с цитированием
  #7 (permalink)  
Старый 13.09.2013, 08:49
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от grego
прошу подсказать другие варианты решения проблемы
Пробовал вот так

window.onload = function () {
    //GLOBAL VARIABLES
    var legendButton = document.getElementById('legend-bar-button'),
        legendBar = document.getElementById('legend-bar'),
        legendCounter = 1;
    legendButton.addEventListener("click", function () {
        if (legendCounter % 2 !== 0) {
            $('#legend-bar').stop().slideDown();
        } else {
            $('#legend-bar').stop().slideUp();
        }
        legendCounter++;
    }, false);
};

Хром так же подводит...
Ответить с цитированием
  #8 (permalink)  
Старый 13.09.2013, 08:51
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

grego, похоже ты собрал все эти особенности...
http://learn.javascript.ru/settimeou...тывания
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Плавное раскрытие и сворачивание блока StyLLeR jQuery 6 07.07.2014 16:00
слайд панели tadjik1 Элементы интерфейса 22 02.04.2012 17:13
Получить размеры рабочей области окна в Chrome unclechu Events/DOM/Window 1 13.09.2011 02:37
Два блока div разъезжаются при скроллинге окна браузера. call007 jQuery 0 03.04.2011 16:21
JavaScript на Яндекс.Фотки - почему тормозит браузеры? ZavFirefox Javascript под браузер 23 27.09.2009 19:24