1
1
import { getConfig } from './config'
2
2
import { getWindowFromNode } from './helpers'
3
3
import { eventMap , eventAliasMap } from './event-map'
4
+ import { beforeFn } from './life-cycle'
5
+ const NodeEventMap = new Map ( )
4
6
5
- function fireEvent ( element , event ) {
7
+ function fireEvent (
8
+ element ,
9
+ event ,
10
+ cond = ( ) => {
11
+ return true
12
+ } ,
13
+ before ,
14
+ ) {
6
15
return getConfig ( ) . eventWrapper ( ( ) => {
7
16
if ( ! event ) {
8
17
throw new Error (
@@ -14,7 +23,21 @@ function fireEvent(element, event) {
14
23
`Unable to fire a "${ event . type } " event - please provide a DOM element.` ,
15
24
)
16
25
}
17
- return element . dispatchEvent ( event )
26
+ const CloneConditionValue = NodeEventMap . get ( element )
27
+ const condition = beforeFn ( CloneConditionValue , event , before )
28
+ if ( cond && typeof cond == 'function' ) {
29
+ if ( cond ( condition ) ) {
30
+ element . dispatchEvent ( event )
31
+ }
32
+ }
33
+ if ( event . defaultPrevented ) {
34
+ condition . defaultprevented = true
35
+ }
36
+ NodeEventMap . set ( element , condition )
37
+ if ( event . cancelable && event . defaultPrevented ) {
38
+ return false
39
+ }
40
+ return true
18
41
} )
19
42
}
20
43
@@ -93,12 +116,14 @@ function createEvent(
93
116
}
94
117
95
118
Object . keys ( eventMap ) . forEach ( key => {
96
- const { EventType, defaultInit} = eventMap [ key ]
119
+ const { EventType, defaultInit, cond , before } = eventMap [ key ]
97
120
const eventName = key . toLowerCase ( )
98
121
99
122
createEvent [ key ] = ( node , init ) =>
100
123
createEvent ( eventName , node , init , { EventType, defaultInit} )
101
- fireEvent [ key ] = ( node , init ) => fireEvent ( node , createEvent [ key ] ( node , init ) )
124
+ fireEvent [ key ] = ( node , init ) => {
125
+ return fireEvent ( node , createEvent [ key ] ( node , init ) , cond , before )
126
+ }
102
127
} )
103
128
104
129
// function written after some investigation here:
0 commit comments