Дождитесь окончания оплавления после запроса Полный экран - PullRequest
0 голосов
/ 31 мая 2019

Ладно, ребята, вот сложный вопрос для всех вас, волшебники ...

Я работаю над иммерсивным веб-приложением, которое отменяет стандартную сенсорную прокрутку на мобильных устройствах.Содержимое разделено на страницы, которые используют 100% области просмотра, и навигация осуществляется путем пролистывания вверх и вниз между страниц .

При первом пролистывании я вызываю requestFullscreen() на body элемент, который, конечно, вызывает перекомпоновку при изменении размера области просмотра.Проблема в том, что я также хочу, чтобы этот первый свайп вызывал пользовательское поведение прокрутки, но я использую Element.nextElementSibling.scrollIntoView({ block : start, behavior : 'smooth' }), и до завершения перекомпоновки верхний край следующей страницы (HTMLSectionElement) уже виден, поэтому прокрутка не отображается.

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

Сначала я попытался вызвать эффект прокрутки изнутри resolve исполнителя Promise, возвращаемого requestFullscreen, но это не помогло.Это обещание разрешается очень рано в потоке выполнения.

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

Наконец, я попытался из окна resize обработчик событий, но это срабатывает до того, как произойдет перекомпоновка.Я также добавил сюда requestIdleCallback, но это не имело никакого значения.

Так что мой вопрос ... Есть ли надежный способ обнаружить конец операции перекомпоновки? Или, в качестве альтернативы ... есть ли у кого-нибудь лучший план B, чем отказ от использования scrollIntoView и кодирование моего собственного эффекта прокрутки в обработчике изменения размера окна.

1 Ответ

0 голосов
/ 04 июня 2019

В случае, если кто-то хотел бы знать, я справился с этой ситуацией, запустив свой эффект прокрутки из прослушивателя событий изменения размера окна через прокси-функцию debounce .Он по-прежнему использует setTimeout, но постоянно сбрасывает счетчик, чтобы гарантировать, что прокрутка произойдет после того, как все события изменения размера будут запущены (4 в случае Chrome).

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

Надеюсь, однажды у нас будет событие ReflowEndEvent или нечто подобное, что мыможно слушать.

...