@zstark/custom-event

自定义事件

Usage no npm install needed!

<script type="module">
  import zstarkCustomEvent from 'https://cdn.skypack.dev/@zstark/custom-event';
</script>

README

@zstark/custom-event

Build Status

自定义事件.

📰 Example

import { EventAbs, SensorAbs } from '@zstark/custom-event'

interface TrackClickParams {
  type: string;
  params: object;
}

class TrackClickEvent extends EventAbs<TrackClickParams> {
  public static readonly type: string = 'track-click'
}

class TrackClick extends SensorAbs<TrackClickEvent> {
  public attach() {
    document.addEventListener('click', this.handleClick.bind(this))
  }
  public detach() {
    document.removeEventListener('click', this.handleClick.bind(this))
  }

  protected handleClick(e: Event) {
    const target = e.target
    if (target && target instanceof Element) {
      const trackParamsStr = target.getAttribute('track-click')

      if (trackParamsStr == null) {
        console.error(`<<< track-click attribute error. target:`, target)
        return
      }

      let trackParamsParse: TrackClickParams | string = ''

      try {
        // to TrackClickParams
        trackParamsParse = JSON.parse(trackParamsStr)
      } catch (error) { /* empty... */ }

      let trackType: string
      let trackParams: object

      if (typeof trackParamsParse === 'string') {
        trackType = trackParamsParse
        trackParams = {}
      } else {
        trackType = trackParamsParse.type
        trackParams = trackParamsParse.params
      }

      this.trigger(this.containers[0], new TrackClickEvent({
        type: trackType,
        params: trackParams,
      }))
    }
  }
}

const instance = new TrackClick(document.body)
// 注册事件
instance.on(e => {
  // do something...
  console.log('e:', e.detail.type, e.detail.params)
})
// 添加事件
instance.attach()