event.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { Dict } from '@medici/types';
  2. import { SDK } from './sdk';
  3. // import { getGlobalObject } from '@medici/utils';
  4. // export
  5. // const global = getGlobalObject<Window>();
  6. // const eventSelect = "[class*='umami--']";
  7. export class Eventer {
  8. protected _sdk: SDK;
  9. private _identifier: string;
  10. private _eventSelect: string;
  11. private eventClassValidate: RegExp;
  12. private listeners: Dict<any> = {};
  13. constructor(_sdk: SDK) {
  14. this._sdk = _sdk;
  15. this._identifier = 'mdc';
  16. this._eventSelect = `[class*='${this._identifier}--']`;
  17. this.eventClassValidate = /^mdc--([a-z]+)--([\w]+[\w-]*)$/;
  18. }
  19. updateIdentifier(identifier: string): void {
  20. this._identifier = identifier;
  21. this.eventClassValidate = new RegExp('^' + identifier + '--([a-z]+)--([w]+[w-]*)$');
  22. }
  23. get eventSelect(): string {
  24. return this._eventSelect;
  25. }
  26. initElementCssEvents(node: HTMLElement): void {
  27. const elements = node.querySelectorAll(this.eventSelect);
  28. console.log('initElementCssEvents-elements', elements);
  29. Array.prototype.forEach.call(elements, this.addCssEvent.bind(this));
  30. }
  31. addCssEvent(element: HTMLElement): void {
  32. (element.getAttribute('class') || '').split(' ').forEach((className) => {
  33. if (!this.eventClassValidate.test(className)) return;
  34. console.log('有效Node', element);
  35. const [, event, name] = className.split('--');
  36. console.log('addCssEvent', event, name);
  37. const listener = this.listeners[className]
  38. ? this.listeners[className]
  39. : (this.listeners[className] = () => {
  40. console.log('trackEvent', event, name);
  41. if (element.tagName === 'A') {
  42. this._sdk.trackEvent(name, event);
  43. } else {
  44. this._sdk.trackEvent(name, event);
  45. }
  46. });
  47. // console.log('listener', listener);
  48. element.addEventListener(event, listener, true);
  49. });
  50. }
  51. }