summaryrefslogtreecommitdiffstats
path: root/src/EventTarget.js
blob: bc7a09cb56bfe7292bae0fc97536b03b17e69603 (plain)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import Base from './Base.js'
import { on, off, dispatch } from './event.js'
import { registerMethods } from './methods.js'

export default class EventTarget extends Base {
  constructor ({ events = {} } = {}) {
    super()
    this.events = events
  }

  addEventListener () {}

  // Bind given event to listener
  on (event, listener, binding, options) {
    on(this, event, listener, binding, options)
    return this
  }

  // Unbind event from listener
  off (event, listener) {
    off(this, event, listener)
    return this
  }

  dispatch (event, data) {
    return dispatch(this, event, data)
  }

  dispatchEvent (event) {
    const bag = this.getEventHolder().events
    if (!bag) return true

    const events = bag[event.type]

    for (let i in events) {
      for (let j in events[i]) {
        events[i][j](event)
      }
    }

    return !event.defaultPrevented
  }

  // Fire given event
  fire (event, data) {
    this.dispatch(event, data)
    return this
  }

  getEventHolder () {
    return this
  }

  getEventTarget () {
    return this
  }

  removeEventListener () {}
}

// Add events to elements
const methods = [ 'click',
  'dblclick',
  'mousedown',
  'mouseup',
  'mouseover',
  'mouseout',
  'mousemove',
  'mouseenter',
  'mouseleave',
  'touchstart',
  'touchmove',
  'touchleave',
  'touchend',
  'touchcancel' ].reduce(function (last, event) {
  // add event to Element
  const fn = function (f) {
    if (f === null) {
      off(this, event)
    } else {
      on(this, event, f)
    }
    return this
  }

  last[event] = fn
  return last
}, {})

registerMethods('Element', methods)