Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Оптимальность решения: присвоение переменных внутри функции SCROLL (https://javascript.ru/forum/jquery/65033-optimalnost-resheniya-prisvoenie-peremennykh-vnutri-funkcii-scroll.html)

alecto 21.09.2016 10:11

Оптимальность решения: присвоение переменных внутри функции SCROLL
 
Нужно узнать высоту карусели в шапке для добавления класса в определенной точке прокрутки страницы.
Высота карусели находится в зависимости от ширины изображения, которое занимает 100% ширины самой карусели.

Сделал следующий скриптик:
$(window).scroll(function(){
    var sticky = $('.navbar-default');
    var carouselHeight = $('#horizontalCarousel').height();
    var scroll = $(window).scrollTop();

		if (scroll >= carouselHeight) sticky.addClass('navbar-fixed-top');
		else sticky.removeClass('navbar-fixed-top');
	});


Он работает, но возникает вопрос по оптимальности такого решения.
Получается, что при прокрутке каждый раз дергается DOM дерево, выбирается элемент по ID и переменной присваивается его высота элемента.
Если вынести
var carouselHeight = $('#horizontalCarousel').height();
из этой функции и сделать переменную глобальной - высота элемента может не вычисляться в случаях, если изображение внутри карусели не успело загрузиться, а так же при ресайзе страницы.

т.е. было бы идеально вычислять размер глобально, когда изображение внутри карусели загружено, обновлять высоту при изменении размера окна.
но, если я присваиваю переменную внутри другой функции - она недоступна в нужном месте.

В связи с этим вопрос: как оптимизировать имеющееся решение?

Dilettante_Pro 21.09.2016 13:27

alecto,
Объявите переменную глобально,
var carouselHeight;

а вычисляйте внутри обработчика по ресайзу и пр.
carouselHeight = $('#horizontalCarousel').height();

- будет доступно везде

alecto 21.09.2016 17:33

спасибо, вроде получилось.

var t_carouselHeight = 0;

  $(window).resize(function(){
    t_carouselHeight = $('#horizontalCarousel').height() + 80;
  });

	$(window).scroll(function(){
    var t_scroll = $(window).scrollTop();

    if (t_carouselHeight == 0) 
      t_carouselHeight = $('#horizontalCarousel').height() + 80;

		if (t_scroll >= t_carouselHeight) t_sticky.addClass('navbar-colored');
  		else t_sticky.removeClass('navbar-colored');
	});


Часовой пояс GMT +3, время: 07:58.