|
import Emitter from '../emitter'; |
|
import define from '../define'; |
|
import * as is from '../is'; |
|
import Selector from '../selector'; |
|
|
|
let emitterOptions = { |
|
qualifierCompare: function( selector1, selector2 ){ |
|
if( selector1 == null || selector2 == null ){ |
|
return selector1 == null && selector2 == null; |
|
} else { |
|
return selector1.sameText( selector2 ); |
|
} |
|
}, |
|
eventMatches: function( ele, listener, eventObj ){ |
|
let selector = listener.qualifier; |
|
|
|
if( selector != null ){ |
|
return ele !== eventObj.target && is.element( eventObj.target ) && selector.matches( eventObj.target ); |
|
} |
|
|
|
return true; |
|
}, |
|
addEventFields: function( ele, evt ){ |
|
evt.cy = ele.cy(); |
|
evt.target = ele; |
|
}, |
|
callbackContext: function( ele, listener, eventObj ){ |
|
return listener.qualifier != null ? eventObj.target : ele; |
|
}, |
|
beforeEmit: function( context, listener ){ |
|
if( listener.conf && listener.conf.once ){ |
|
listener.conf.onceCollection.removeListener( listener.event, listener.qualifier, listener.callback ); |
|
} |
|
}, |
|
bubble: function(){ |
|
return true; |
|
}, |
|
parent: function( ele ){ |
|
return ele.isChild() ? ele.parent() : ele.cy(); |
|
} |
|
}; |
|
|
|
let argSelector = function( arg ){ |
|
if( is.string(arg) ){ |
|
return new Selector( arg ); |
|
} else { |
|
return arg; |
|
} |
|
}; |
|
|
|
let elesfn = ({ |
|
createEmitter: function(){ |
|
for( let i = 0; i < this.length; i++ ){ |
|
let ele = this[i]; |
|
let _p = ele._private; |
|
|
|
if( !_p.emitter ){ |
|
_p.emitter = new Emitter( emitterOptions, ele ); |
|
} |
|
} |
|
|
|
return this; |
|
}, |
|
|
|
emitter: function(){ |
|
return this._private.emitter; |
|
}, |
|
|
|
on: function( events, selector, callback ){ |
|
let argSel = argSelector(selector); |
|
|
|
for( let i = 0; i < this.length; i++ ){ |
|
let ele = this[i]; |
|
|
|
ele.emitter().on( events, argSel, callback ); |
|
} |
|
|
|
return this; |
|
}, |
|
|
|
removeListener: function( events, selector, callback ){ |
|
let argSel = argSelector(selector); |
|
|
|
for( let i = 0; i < this.length; i++ ){ |
|
let ele = this[i]; |
|
|
|
ele.emitter().removeListener( events, argSel, callback ); |
|
} |
|
|
|
return this; |
|
}, |
|
|
|
removeAllListeners: function(){ |
|
for( let i = 0; i < this.length; i++ ){ |
|
let ele = this[i]; |
|
|
|
ele.emitter().removeAllListeners(); |
|
} |
|
|
|
return this; |
|
}, |
|
|
|
one: function( events, selector, callback ){ |
|
let argSel = argSelector(selector); |
|
|
|
for( let i = 0; i < this.length; i++ ){ |
|
let ele = this[i]; |
|
|
|
ele.emitter().one( events, argSel, callback ); |
|
} |
|
|
|
return this; |
|
}, |
|
|
|
once: function( events, selector, callback ){ |
|
let argSel = argSelector(selector); |
|
|
|
for( let i = 0; i < this.length; i++ ){ |
|
let ele = this[i]; |
|
|
|
ele.emitter().on( events, argSel, callback, { |
|
once: true, |
|
onceCollection: this |
|
} ); |
|
} |
|
}, |
|
|
|
emit: function( events, extraParams ){ |
|
for( let i = 0; i < this.length; i++ ){ |
|
let ele = this[i]; |
|
|
|
ele.emitter().emit( events, extraParams ); |
|
} |
|
|
|
return this; |
|
}, |
|
|
|
emitAndNotify: function( event, extraParams ){ |
|
if( this.length === 0 ){ return; } |
|
|
|
|
|
this.cy().notify( event, this ); |
|
|
|
this.emit( event, extraParams ); |
|
|
|
return this; |
|
} |
|
}); |
|
|
|
define.eventAliasesOn( elesfn ); |
|
|
|
export default elesfn; |
|
|