Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.09.2016, 10:11
Аспирант
Отправить личное сообщение для alecto Посмотреть профиль Найти все сообщения от alecto
 
Регистрация: 12.11.2014
Сообщений: 84

Оптимальность решения: присвоение переменных внутри функции 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();
из этой функции и сделать переменную глобальной - высота элемента может не вычисляться в случаях, если изображение внутри карусели не успело загрузиться, а так же при ресайзе страницы.

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

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

Последний раз редактировалось alecto, 21.09.2016 в 10:17.
Ответить с цитированием
  #2 (permalink)  
Старый 21.09.2016, 13:27
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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

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

- будет доступно везде
Ответить с цитированием
  #3 (permalink)  
Старый 21.09.2016, 17:33
Аспирант
Отправить личное сообщение для alecto Посмотреть профиль Найти все сообщения от alecto
 
Регистрация: 12.11.2014
Сообщений: 84

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

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');
	});
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
О видимости функции внутри другой функции, рекурсивный вызов DanK Node.JS 1 24.08.2016 20:32
Как и где задать цикл? Blondinka Events/DOM/Window 2 10.06.2014 15:29
Использование $(this) внутри функции Dorian_bs Общие вопросы Javascript 6 21.11.2011 11:10
изменение значения глобальной переменной внутри функции mgmarket Серверные языки и технологии 14 13.09.2011 00:56
Область видимости внутри функции YISHIMITSY Общие вопросы Javascript 1 25.08.2010 06:50