@@ -6,39 +6,40 @@ import { indexOf } from "./misc"
66// Lightweight event framework. on/off also work on DOM nodes,
77// registering native DOM handlers.
88
9+ const noHandlers = [ ]
10+
911export let on = function ( emitter , type , f ) {
10- if ( emitter . addEventListener )
12+ if ( emitter . addEventListener ) {
1113 emitter . addEventListener ( type , f , false )
12- else if ( emitter . attachEvent )
14+ } else if ( emitter . attachEvent ) {
1315 emitter . attachEvent ( "on" + type , f )
14- else {
16+ } else {
1517 let map = emitter . _handlers || ( emitter . _handlers = { } )
16- let arr = map [ type ] || ( map [ type ] = [ ] )
17- arr . push ( f )
18+ map [ type ] = ( map [ type ] || noHandlers ) . concat ( f )
1819 }
1920}
2021
21- let noHandlers = [ ]
22- export function getHandlers ( emitter , type , copy ) {
23- let arr = emitter . _handlers && emitter . _handlers [ type ]
24- if ( copy ) return arr && arr . length > 0 ? arr . slice ( ) : noHandlers
25- else return arr || noHandlers
22+ export function getHandlers ( emitter , type ) {
23+ return emitter . _handlers && emitter . _handlers [ type ] || noHandlers
2624}
2725
2826export function off ( emitter , type , f ) {
29- if ( emitter . removeEventListener )
27+ if ( emitter . removeEventListener ) {
3028 emitter . removeEventListener ( type , f , false )
31- else if ( emitter . detachEvent )
29+ } else if ( emitter . detachEvent ) {
3230 emitter . detachEvent ( "on" + type , f )
33- else {
34- let handlers = getHandlers ( emitter , type , false )
35- for ( let i = 0 ; i < handlers . length ; ++ i )
36- if ( handlers [ i ] == f ) { handlers . splice ( i , 1 ) ; break }
31+ } else {
32+ let map = emitter . _handlers , arr = map && map [ type ]
33+ if ( arr ) {
34+ let index = indexOf ( arr , f )
35+ if ( index > - 1 )
36+ map [ type ] = arr . slice ( 0 , index ) . concat ( arr . slice ( index + 1 ) )
37+ }
3738 }
3839}
3940
4041export function signal ( emitter , type /*, values...*/ ) {
41- let handlers = getHandlers ( emitter , type , true )
42+ let handlers = getHandlers ( emitter , type )
4243 if ( ! handlers . length ) return
4344 let args = Array . prototype . slice . call ( arguments , 2 )
4445 for ( let i = 0 ; i < handlers . length ; ++ i ) handlers [ i ] . apply ( null , args )
0 commit comments