мобильный Chrome запускает событие изменения размера при прокрутке

79

Я использую мобильный браузер Chrome на galaxy s4, android 4.2.2, и по какой-то причине каждый раз, когда я прокручиваю страницу вниз, он запускает событие изменения размера, подтвержденное масштабированием изображений из слайд-шоу jquery.cycle2.

Есть идеи, почему это может происходить?

Коби Брайант
источник
1
В итоге возникла проблема с событием изменения размера, но поскольку высота моего элемента была установлена ​​на 100% от области просмотра, она пересчитывалась при прокрутке.
KobeBryant

Ответы:

48

Из любопытства я пытался воспроизвести это, и если я прав, это вызвано хромированной панелью навигации.

Когда вы прокручиваете вниз и хром скрывает панель навигации браузера, он производит изменение размера окна, но это правильно, потому что после этого у нас будет больший размер окна из-за свободного места, которое осталось в навигационной панели браузера.

Статья по теме: https://developers.google.com/web/updates/2016/12/url-bar-resizing

АльбертоФдзМ
источник
3
Независимо от того, является ли это предполагаемым поведением или нет, мы не хотим, чтобы он запускал функцию изменения размера. Итак, каково здесь решение, не идя по маршруту длинного кода, предложенного другими ответами?
Studocwho
Я добавил ссылку на свой ответ, в которой содержится дополнительная информация о том, как бороться с таким поведением в Chrome для мобильных устройств.
AlbertoFdzM 06
Самый простой подход - сравнить высоту и ширину после запуска слушателя области просмотра. Если изменилась только высота, скорее всего, внутренняя панель инструментов браузера влияет на высоту области просмотра. Если есть случай, когда пользователь будет влиять на размеры области просмотра только по высоте, вы можете пойти дальше и проанализировать расстояние и время, чтобы определить, что это ввод пользователя или системный ввод, который изменяет область просмотра.
MarsAndBack
72

Звучит странно, но я видел это в других браузерах. Вы можете обойти это так.

var width = $(window).width(), height = $(window).height();

то в обработчике события изменения размера вы можете это сделать.

if($(window).width() != width || $(window).height() != height){
  //Do something
}

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

CWitty
источник
5
Спас мой день! Мне нужно только проверить ширину
Юрий Кварцяный
14
Проблема вызвана тем, что полоса прокрутки скрывается или отображается, что приводит к изменению высоты экрана и, следовательно, запуску $(window).resize(). Я предложил отредактировать.
Sander Koedood
3
Просто хотел добавить, что мы также наблюдали подобное поведение с iOS Safari.
Крис Краузе
4
так как высота, которая меняет, условие if должно проверять только изменение ширины. Также условие не срабатывает, пока не изменится ширина и высота. что не всегда так, но почти все изменения размера экрана связаны с изменением ширины, поэтому я предлагаю не использовать часть высоты. if($(window).width() != width){ }
Имран Бугио,
7
это должно быть || вместо &&
Майсам Тораби
5

Не знаю, интересно ли это, но мое решение:)

var document_width, document_height;

$(document).ready(function()
{
	document_width=$(document).width(); document_height=$(document).height();
    // Do something
}

$(window).resize(function()
{
    if(document_width!=$(document).width() || document_height!=$(document).height()) 
    {
        document_width=$(document).width(); document_height=$(document).height();
        // Do something
    }
}	

Андрисом
источник
2
Я думаю, вам следует использовать $ (window) .height (), а не $ (document) .height (), а width.
Тарек Эль-Маллах
1

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

Я столкнулся с этой проблемой в Chrome на Android при разработке адаптивного веб-сайта. При изменении размера окна я хочу скрыть меню (из-за того, что некоторые элементы дизайна требуют правильного позиционирования), но поведение Chrome для Android, вызывающее событие изменения размера при прокрутке, сделало это несколько сложным.

Переключение на использование onOrientationChange не было вариантом, поскольку это отзывчивый сайт, на настольном ПК нет изменения ориентации, но мне все еще нужен код для работы как на обычных ПК, планшетах и ​​смартфонах.

Я мог бы начать обнюхивать браузер и тому подобное, но до сих пор мне удавалось этого избежать ..

Я попытался реализовать решение, предложенное CWitty, но поскольку прокрутка вверх или вниз фактически вызывает изменение высоты, которое тоже не работает.

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

Андерс Гардебринг
источник
1
Я предлагаю не проверять высоту и проверять только ширину.
Берти
Принятый ответ по-прежнему применим; Вам решать, продолжить логику в соответствии с вашими потребностями. В конце концов, вы сами это обнаружили, и это должен быть просто комментарий под принятым ответом.
MarsAndBack
1

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

Алан Эспине
источник
0

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

Чтобы исправить это, используйте свойство onOrientationChange и window.orientation. См. Соответствующий ответ: здесь

Braden
источник
Неправильно. Этот вопрос касается события изменения размера, которое неожиданно запускается в мобильном браузере.
user2867288
5
На самом деле это не обязательно неправильно. использование onOrientationChange - законный обходной путь, поскольку на мобильном устройстве именно тогда вы, скорее всего, увидите срабатывание события изменения размера экрана. Ответ хорош. Я не поддерживаю его просто потому, что есть еще один случай, когда он не поймает - и это когда хромоты браузера появляются / исчезают, вызывая события изменения размера (что является моей проблемой ATM). В противном случае это было бы прекрасным решением.
dudewad 06
Предположим, вы должны уловить события изменения размера, чтобы настроить элементы на экране; вы открываете инструменты разработчика, и все работает отлично с изменением размера окна, вы даже можете прокручивать вверх-вниз! Теперь вы решаете открыть страницу на планшете, вы прокручиваете вверх-вниз, и все заново настраивается, давая землетрясения на вашем экране! Вам по-прежнему нужно обрабатывать события изменения размера окна на своем ПК! Итак, это неправильный ответ!
Centurian
Я использовал window.resize для отслеживания изменения ориентации. Таким образом столкнулся с этой проблемой. Это отличная идея.
AMNBandara
В ответе или даже в связанном ответе нет подходящего образца кода, а внешние ссылки мертвы. В любом случае, вопрос OP касается базовой прокрутки без изменения ориентации, когда событие изменения размера запускается независимо от ориентации. Простая проверка изменения высоты - наиболее эффективный универсальный способ. onOrientationChangeпригодится в другом месте ..
MarsAndBack
0

Оказывается, есть много вещей, которые могут срабатывать resizeв различных мобильных браузерах.

Я знаю, что ссылка на внешний ресурс не идеальна, но в QuirksMode есть читаемая таблица, которую я не хочу дублировать (или поддерживать) здесь: http://www.quirksmode.org/dom/events/resize_mobile.html

Просто чтобы привести пример, который нам приводил: очевидно, во многих браузерах открытие мягкой клавиатуры запускает событие.

dbreaux
источник