ExtendEventDispatcher.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import * as THREE from "../../libs/three.js/build/three.module.js";
  2. export class ExtendEventDispatcher extends THREE.EventDispatcher {
  3. constructor () {
  4. super();
  5. }
  6. addEventListener(type, listener, importance=0){ //add importance
  7. if ( this._listeners === undefined ) this._listeners = {};
  8. const listeners = this._listeners;
  9. if ( listeners[ type ] === undefined ) {
  10. listeners[ type ] = [];
  11. }
  12. if ( !listeners[ type ].some(e=>e.listener == listener ) ) {
  13. //listeners[ type ].push( listener );
  14. listeners[type].push({ listener, importance});
  15. listeners[type] = listeners[type].sort((e,a)=> a.importance - e.importance)//add
  16. }
  17. }
  18. hasEventListener(type, listener){
  19. if ( this._listeners === undefined ) return false;
  20. const listeners = this._listeners;
  21. return listeners[ type ] !== undefined && listeners[ type ].some(e=>e.listener == listener )
  22. }
  23. removeEventListener(type, listener){
  24. if ( this._listeners === undefined ) return;
  25. const listeners = this._listeners;
  26. const listenerArray = listeners[ type ];
  27. if ( listenerArray !== undefined ) {
  28. /* const index = listenerArray.indexOf( listener );
  29. if ( index !== - 1 ) {
  30. listenerArray.splice( index, 1 );
  31. } */
  32. let item = listenerArray.find(e=>e.listener == listener)
  33. item && listenerArray.splice(listenerArray.indexOf(item), 1);
  34. }
  35. }
  36. removeEventListeners(type){ //add
  37. if(this._listeners && this._listeners[type] !== undefined){
  38. delete this._listeners[type];
  39. }
  40. }
  41. removeAllListeners(){ //add
  42. this._listeners = {};
  43. }
  44. dispatchEvent(event){
  45. if(typeof event == 'string'){//add
  46. event = {type:event}
  47. }
  48. if ( this._listeners === undefined ) return;
  49. const listeners = this._listeners;
  50. const listenerArray = listeners[ event.type ];
  51. if ( listenerArray !== undefined ) {
  52. event.target = this;
  53. // Make a copy, in case listeners are removed while iterating.
  54. for(let {listener} of listenerArray.slice(0)){
  55. let result = listener.call(this, event); //add stopContinue
  56. if(result && result.stopContinue){
  57. break
  58. }
  59. }
  60. }
  61. }
  62. traverse(callback){
  63. let result = callback( this );
  64. if(result && result.stopContinue){//xzw add
  65. return
  66. }
  67. const children = this.children;
  68. for ( let i = 0, l = children.length; i < l; i ++ ) {
  69. children[ i ].traverse( callback );
  70. }
  71. }
  72. };