Этот вопрос касается последовательности выполнения обратного вызова обозревателя касания, прокрутки и пересечения.
У меня есть простое мобильное веб-приложение, которое имеет прокручиваемый вид списка, где каждый элемент имеет высоту 100px, и у меня есть пересечениеОбозреватель помещается в область просмотра, но с верхним полем -100px (rootMargin: "-100px 0px 0px 0px"
).
Это делается таким образом, чтобы мой элемент списка можно было наблюдать, как только он прокручивается вверх.
Наблюдатель пересечения выглядит следующим образом:
const io = new IntersectionObserver(viewportBottomObserverCallback, {
root: null,
rootMargin: "-100px 0px 0px 0px",
threshold: [0, 1]
})
У меня есть обработчик сенсорного перемещения, обработчик прокрутки и обратный вызов наблюдателя пересечения.
Теперь, как только я коснусь и проведу пальцем вверх, я вижуповедение при выполнении этих обработчиков / обратных вызовов.Сначала вызывается onTouchMove
, затем вызывается onScroll
и наконец вызывается viewportBottomObserverCallback
.Это всегда так?Этот вопрос важен, потому что, если я знаю, что эти события DOM всегда вызываются в этой последовательности, тогда мой код станет очень детерминированным.Как правило, это не относится к любым другим событиям DOM.
Для лучшей наглядности я прилагаю скриншот профилировщика моего chrome.Часть, выделенная синим цветом, является моим обратным вызовом наблюдателя пересечения.
![enter image description here](https://i.stack.imgur.com/sRSqA.png)
РЕДАКТИРОВАТЬ:
Я тестирую это на Chrome в адаптивном режиме с устройствомiPhone 6/7 / 8.
Еще один вопрос: происходит ли вычисление и организация очередей задач (наблюдатель пересечения) в цикл событий только после выполнения update layer tree
, в частности, эта задача - https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo?