import createCallbacks from 'uni-helpers/callbacks'
|
import {
|
checkInWindows
|
} from 'uni-helpers/windows'
|
import {
|
getCurrentPageVm
|
} from '../../platform'
|
|
const createIntersectionObserverCallbacks = createCallbacks('requestComponentObserver')
|
|
const defaultOptions = {
|
thresholds: [0],
|
initialRatio: 0,
|
observeAll: false
|
}
|
|
class ServiceIntersectionObserver {
|
constructor (component, options) {
|
this.pageId = component.$page && component.$page.id
|
this.component = component._$id || component // app-plus 平台传输_$id
|
this.options = Object.assign({}, defaultOptions, options)
|
}
|
|
_makeRootMargin (margins = {}) {
|
this.options.rootMargin = ['top', 'right', 'bottom', 'left'].map(name => `${Number(margins[name]) || 0}px`).join(
|
' ')
|
}
|
|
relativeTo (selector, margins) {
|
this.options.relativeToSelector = selector
|
this._makeRootMargin(margins)
|
return this
|
}
|
|
relativeToViewport (margins) {
|
this.options.relativeToSelector = null
|
this._makeRootMargin(margins)
|
return this
|
}
|
|
observe (selector, callback) {
|
if (typeof callback !== 'function') {
|
return
|
}
|
this.options.selector = selector
|
|
this.reqId = createIntersectionObserverCallbacks.push(callback)
|
|
UniServiceJSBridge.publishHandler('requestComponentObserver', {
|
reqId: this.reqId,
|
component: this.component,
|
options: this.options
|
}, checkInWindows(this.component) ? this.component : this.pageId)
|
}
|
|
disconnect () {
|
UniServiceJSBridge.publishHandler('destroyComponentObserver', {
|
reqId: this.reqId
|
}, checkInWindows(this.component) ? this.component : this.pageId)
|
}
|
}
|
|
export function createIntersectionObserver (context, options) {
|
if (!context._isVue) {
|
options = context
|
context = null
|
}
|
if (context) {
|
return new ServiceIntersectionObserver(context, options)
|
}
|
return new ServiceIntersectionObserver(getCurrentPageVm('createIntersectionObserver'), options)
|
}
|