MCPcopy Create free account
hub / github.com/TanStack/virtual / observeElementOffset

Function observeElementOffset

packages/virtual-core/src/index.ts:141–190  ·  view source on GitHub ↗
(
  instance: Virtualizer<T, any>,
  cb: ObserveOffsetCallBack,
)

Source from the content-addressed store, hash-verified

139type ObserveOffsetCallBack = (offset: number, isScrolling: boolean) => void
140
141export const observeElementOffset = <T extends Element>(
142 instance: Virtualizer<T, any>,
143 cb: ObserveOffsetCallBack,
144) => {
145 const element = instance.scrollElement
146 if (!element) {
147 return
148 }
149 const targetWindow = instance.targetWindow
150 if (!targetWindow) {
151 return
152 }
153
154 let offset = 0
155 const fallback =
156 instance.options.useScrollendEvent && supportsScrollend
157 ? () => undefined
158 : debounce(
159 targetWindow,
160 () => {
161 cb(offset, false)
162 },
163 instance.options.isScrollingResetDelay,
164 )
165
166 const createHandler = (isScrolling: boolean) => () => {
167 const { horizontal, isRtl } = instance.options
168 offset = horizontal
169 ? element['scrollLeft'] * ((isRtl && -1) || 1)
170 : element['scrollTop']
171 fallback()
172 cb(offset, isScrolling)
173 }
174 const handler = createHandler(true)
175 const endHandler = createHandler(false)
176 endHandler()
177
178 element.addEventListener('scroll', handler, addEventListenerOptions)
179 const registerScrollendEvent =
180 instance.options.useScrollendEvent && supportsScrollend
181 if (registerScrollendEvent) {
182 element.addEventListener('scrollend', endHandler, addEventListenerOptions)
183 }
184 return () => {
185 element.removeEventListener('scroll', handler)
186 if (registerScrollendEvent) {
187 element.removeEventListener('scrollend', endHandler)
188 }
189 }
190}
191
192export const observeWindowOffset = (
193 instance: Virtualizer<Window, any>,

Callers

nothing calls this directly

Calls 2

debounceFunction · 0.90
createHandlerFunction · 0.85

Tested by

no test coverage detected