Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.11.2016, 14:24
Новичок на форуме
Отправить личное сообщение для Север3 Посмотреть профиль Найти все сообщения от Север3
 
Регистрация: 02.12.2015
Сообщений: 6

Глобальная проблема с событием resize
Привет академикам ECMAScript!!
Резиновая страница сайта. При изменение размера окна, соответственно меняются элементы страницы, в том числе и с помощью Javascript. Используемые события resize и load. С load всё просто. А вот resize есть глобальная проблема. Можно привязываться только к размерам окна!! Привязываться, к примеру, к координатам элементов или к их размерам получившимся в результате изменения окна, можно, но получается слегка коряво. А иногда и не слегка. Поскольку сначала срабатывает скрипт назначенный на событие, а потом только меняются элементы.
Заметил когда хотел изменить стили кнопок.
Когда кнопки размещаются одна над другой добавлял пространство между ними.
resize срабатывает несколько раз при изменении окна и проблему сразу не заметил. А вот когда заметил, то сильно приуныл, поскольку похоже, что она в принципе нерешаемая. И концепция проектирования резиновых страниц по событию может строится только на размерах окна. Что порой бывает очень неудобно и громоздко.
Определить окончание перестройки DOM после resize и потом только запустить функцию похоже невозможно.
Если кто, что подскажет, буду крайне признателен.
Ответить с цитированием
  #2 (permalink)  
Старый 16.11.2016, 14:49
Аватар для Coriolan161
Профессор
Отправить личное сообщение для Coriolan161 Посмотреть профиль Найти все сообщения от Coriolan161
 
Регистрация: 21.11.2015
Сообщений: 440

Север3,
Короче прикол в том, чтобы сохранить старую координату (ну или че там тебе нужно) и внутри обработки resize окна достать новое значение и проверить со старым
Ответить с цитированием
  #3 (permalink)  
Старый 16.11.2016, 14:56
Новичок на форуме
Отправить личное сообщение для Север3 Посмотреть профиль Найти все сообщения от Север3
 
Регистрация: 02.12.2015
Сообщений: 6

К сожалению этот прикол не сработает. Внутри resize новое только размеры окна. Всё остальное старое. А вот как его тормознуть, до того как появятся новые значения неизвестно.
Ответить с цитированием
  #4 (permalink)  
Старый 16.11.2016, 15:32
Аватар для Coriolan161
Профессор
Отправить личное сообщение для Coriolan161 Посмотреть профиль Найти все сообщения от Coriolan161
 
Регистрация: 21.11.2015
Сообщений: 440

Север3,
Блин я тебе говорю при загрузке окна положить в глобальные переменные твои размеры и в листенере ресайза окна достать из стилей новые размеры и сравнить со старыми, если изменились то перезаписать старые на новые и применить
Ответить с цитированием
  #5 (permalink)  
Старый 16.11.2016, 16:01
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Coriolan161,
Пока меня немного отвлекли, ты высказал мои мысли...
с небольшими уточнениями - проверка чуть попозже

var oldWidth = 0,
            oldHeight = 0,
            newWidth = 0,
            newHeight = 0;
        $(window).on('resize', function () {
            newWidth = $(window).width();
            newHeight = $(window).height();
  
            setTimeout(function () {
                if (newWidth == oldWidth && newHeight == oldHeight) {
                    oldHeight = 0;
                    oldWidth = 0;
                    alert("Можно перекомпоновывать");
                }
            }, 1000);
            oldWidth = newWidth;
            oldHeight = newHeight;
        });

Почему-то тестовый пример не хочет здесь работать... Наверное, resize не добирается до демо-окна. Как отдельная страничка - работает.

Последний раз редактировалось Dilettante_Pro, 16.11.2016 в 16:08.
Ответить с цитированием
  #6 (permalink)  
Старый 16.11.2016, 17:00
Новичок на форуме
Отправить личное сообщение для Север3 Посмотреть профиль Найти все сообщения от Север3
 
Регистрация: 02.12.2015
Сообщений: 6

C setTimeout мысль понятна. Но setTimeout неприемлем. Время не установить. Слишком большой интервал, всё прыгает. Маленький нестабильно и тоже всё прыгает. Нужно писать функцию отключения setTimeout на время изменения окна. Но тогда не увидеть динамически изменяемый вид страницы. В общем очень грубый костыль.

в листенере ресайза окна достать из стилей новые размеры - тут непонятное слово "листенер".

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

Для проверки можно поставить арлет например на размер дива, и если после перезагрузки страницы и ресайз они разные тогда всё получилось. Но только не рукой двигать, а сворачивать или разворачивать экран. Иначе ресайз сработает несколько раз и нчего не будет понятно. Поскольку очевидно, что повторное срабатывание обновиляет значения.
Ответить с цитированием
  #7 (permalink)  
Старый 16.11.2016, 17:06
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Север3,
Листенер - это и есть $(window).on('resize', function () {
Ответить с цитированием
  #8 (permalink)  
Старый 16.11.2016, 17:57
Новичок на форуме
Отправить личное сообщение для Север3 Посмотреть профиль Найти все сообщения от Север3
 
Регистрация: 02.12.2015
Сообщений: 6

$(window).on('resize', function () { - здесь старые значения. Новые применятся только на следующем ресайзе.
С помощью CSS динамическую таблицу из 6 - ти столбцовой в 3-х столбцовую не переделать.
Ответить с цитированием
  #9 (permalink)  
Старый 16.11.2016, 18:46
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Север3,
Сообщение от Север3
$(window).on('resize', function () { - здесь старые значения. Новые применятся только на следующем ресайзе
Именно поэтому я и применил setTimeout. А обнуление - для предотвращения запоздалых повторных срабатываний.
А вообще, конечно, CSS
Ответить с цитированием
  #10 (permalink)  
Старый 17.11.2016, 10:48
Новичок на форуме
Отправить личное сообщение для Север3 Посмотреть профиль Найти все сообщения от Север3
 
Регистрация: 02.12.2015
Сообщений: 6

В общем, всех завёл за корягу, всем приношу извинения, даже даунов раздавателю. resize работает как и положено выдаёт все изменения которые произошли при его применении. Моя ошибка. Приятно, что столько людей отозвалось. Хотя не одного правильного ответа не было. Правильный ответ: херню городишь, проверь код. Ошибка следующая, мало ли кому пригодится, при реализации поведения блоков при плавном изменении размера экрана, нельзя использовать дискретные единицы, например "рх", только %. Вернее можно, но тогда при определении поведения объектов уже внутри этих блоков будут люфты. Т. е. объекты перестроятся на экране, но изменение свойств, привязанных к этой перестройке, произойдёт если размер экрана превысит некую величину.
На этом тему закрываю.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема закрытия созданного окна событием OnMouseOut(). Потеря фокуса Impressive Общие вопросы Javascript 1 15.03.2015 05:37
Проблема с событием toggle() haacki jQuery 5 09.02.2014 17:28
Проблема с событием onerror fr0st1k Events/DOM/Window 2 02.07.2012 23:22
Проблема с событием клика Garik Events/DOM/Window 2 28.06.2011 16:28
проблема с событием click. morfie jQuery 1 14.10.2010 04:33