'a'
mh-two-thousand-and-two
2024-04-12 44d2c92345cd156a59fc327b3060292a282d2893
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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)
}