cotomy 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -92,8 +92,8 @@ The View layer provides thin wrappers around DOM elements and window events.
92
92
  - `rect(): { top, left, width, height }`
93
93
  - `innerRect()` — Subtracts padding
94
94
  - Events
95
- - Generic: `on(event, handler, options?)`, `off(event, handler?, options?)`, `once(event, handler, options?)`, `trigger(event[, Event])` — `trigger` emits bubbling events by default and can be customized by passing an `Event`
96
- - Delegation: `onSubTree(event, selector, handler, options?)`
95
+ - Generic: `on(eventOrEvents, handler, options?)`, `off(eventOrEvents, handler?, options?)`, `once(eventOrEvents, handler, options?)`, `trigger(event[, Event])` — `eventOrEvents` accepts either a single event name or an array for batch registration/removal. `trigger` emits bubbling events by default and can be customized by passing an `Event`.
96
+ - Delegation: `onSubTree(eventOrEvents, selector, handler, options?)` — `eventOrEvents` can also be an array for listening to multiple delegated events at once.
97
97
  - Mouse: `click`, `dblclick`, `mouseover`, `mouseout`, `mousedown`, `mouseup`, `mousemove`, `mouseenter`, `mouseleave`
98
98
  - Keyboard: `keydown`, `keyup`, `keypress`
99
99
  - Inputs: `change`, `input`
@@ -137,7 +137,7 @@ document.body.appendChild(panel.element);
137
137
  - `append(element: CotomyElement)`
138
138
  - `moveNext(focused: CotomyElement, shift = false)` — Move focus to next/previous focusable
139
139
  - Window events
140
- - `on(event, handler)` / `off(event, handler?)` / `trigger(event[, Event])` — CotomyWindow’s `trigger` also bubbles by default and accepts an `Event` to override the behavior
140
+ - `on(eventOrEvents, handler)` / `off(eventOrEvents, handler?)` / `trigger(event[, Event])` — `eventOrEvents` accepts a single event name or an array. CotomyWindow’s `trigger` also bubbles by default and accepts an `Event` to override the behavior.
141
141
  - `load(handler)` / `ready(handler)`
142
142
  - `resize([handler])` / `scroll([handler])` / `changeLayout([handler])` / `pageshow([handler])`
143
143
  - Window state
@@ -1468,8 +1468,11 @@ class CotomyElement {
1468
1468
  return this;
1469
1469
  }
1470
1470
  on(event, handle, options) {
1471
- const entry = new HandlerEntry(handle, undefined, options);
1472
- EventRegistry.instance.on(event, this, entry);
1471
+ const events = Array.isArray(event) ? event : [event];
1472
+ events.forEach(eventName => {
1473
+ const entry = new HandlerEntry(handle, undefined, options);
1474
+ EventRegistry.instance.on(eventName, this, entry);
1475
+ });
1473
1476
  return this;
1474
1477
  }
1475
1478
  onSubTree(event, selector, handle, options) {
@@ -1479,25 +1482,34 @@ class CotomyElement {
1479
1482
  return handle(e);
1480
1483
  }
1481
1484
  };
1482
- const entry = new HandlerEntry(handle, delegate, options);
1483
- EventRegistry.instance.on(event, this, entry);
1485
+ const events = Array.isArray(event) ? event : [event];
1486
+ events.forEach(eventName => {
1487
+ const entry = new HandlerEntry(handle, delegate, options);
1488
+ EventRegistry.instance.on(eventName, this, entry);
1489
+ });
1484
1490
  return this;
1485
1491
  }
1486
1492
  once(event, handle, options) {
1487
1493
  const mergedOptions = { ...(options ?? {}), once: true };
1488
- const entry = new HandlerEntry(handle, undefined, mergedOptions);
1489
1494
  this.off(event, handle, mergedOptions);
1490
- EventRegistry.instance.on(event, this, entry);
1495
+ const events = Array.isArray(event) ? event : [event];
1496
+ events.forEach(eventName => {
1497
+ const entry = new HandlerEntry(handle, undefined, mergedOptions);
1498
+ EventRegistry.instance.on(eventName, this, entry);
1499
+ });
1491
1500
  return this;
1492
1501
  }
1493
1502
  off(event, handle, options) {
1494
- if (handle) {
1495
- const entry = new HandlerEntry(handle, undefined, options);
1496
- EventRegistry.instance.off(event, this, entry);
1497
- }
1498
- else {
1499
- EventRegistry.instance.off(event, this);
1500
- }
1503
+ const events = Array.isArray(event) ? event : [event];
1504
+ events.forEach(eventName => {
1505
+ if (handle) {
1506
+ const entry = new HandlerEntry(handle, undefined, options);
1507
+ EventRegistry.instance.off(eventName, this, entry);
1508
+ }
1509
+ else {
1510
+ EventRegistry.instance.off(eventName, this);
1511
+ }
1512
+ });
1501
1513
  return this;
1502
1514
  }
1503
1515
  click(handle) {
@@ -1902,22 +1914,34 @@ class CotomyWindow {
1902
1914
  window.dispatchEvent(e ?? new Event(event, { bubbles: true }));
1903
1915
  }
1904
1916
  on(event, handle) {
1905
- if (!this._eventHandlers[event])
1906
- this._eventHandlers[event] = [];
1907
- this._eventHandlers[event].push(handle);
1908
- window.addEventListener(event, handle);
1917
+ const events = Array.isArray(event) ? event : [event];
1918
+ events.forEach(eventName => {
1919
+ if (!this._eventHandlers[eventName])
1920
+ this._eventHandlers[eventName] = [];
1921
+ this._eventHandlers[eventName].push(handle);
1922
+ window.addEventListener(eventName, handle);
1923
+ });
1909
1924
  }
1910
1925
  off(event, handle) {
1911
- if (handle) {
1912
- window.removeEventListener(event, handle);
1913
- this._eventHandlers[event] = this._eventHandlers[event]?.filter(h => h !== handle) ?? [];
1914
- }
1915
- else {
1916
- for (const h of this._eventHandlers[event] ?? []) {
1917
- window.removeEventListener(event, h);
1926
+ const events = Array.isArray(event) ? event : [event];
1927
+ events.forEach(eventName => {
1928
+ if (handle) {
1929
+ window.removeEventListener(eventName, handle);
1930
+ const handlers = this._eventHandlers[eventName]?.filter(h => h !== handle) ?? [];
1931
+ if (handlers.length > 0) {
1932
+ this._eventHandlers[eventName] = handlers;
1933
+ }
1934
+ else {
1935
+ delete this._eventHandlers[eventName];
1936
+ }
1918
1937
  }
1919
- delete this._eventHandlers[event];
1920
- }
1938
+ else {
1939
+ for (const h of this._eventHandlers[eventName] ?? []) {
1940
+ window.removeEventListener(eventName, h);
1941
+ }
1942
+ delete this._eventHandlers[eventName];
1943
+ }
1944
+ });
1921
1945
  }
1922
1946
  load(handle) {
1923
1947
  this.on("load", handle);