From 1d39973fee264b47c3bfebfe6e5b591f503c3e8c Mon Sep 17 00:00:00 2001 From: Oliver Hader <oliver@typo3.org> Date: Fri, 17 Apr 2020 12:21:06 +0200 Subject: [PATCH] [TASK] Pass targetElement explicitly for RegularEvent.delegateTo Arrow functions keep using their own `thisArg` on invocation. To be able to avoid unscoped `function()` call and still retrieving `targetElement` it is passed explicitly as 2nd callback argument. Resolves: #91084 Releases: master Change-Id: I3f1087713827605ac8b59f18eb4a59becd67e460 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64209 Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de> Tested-by: TYPO3com <noreply@typo3.com> Tested-by: Oliver Hader <oliver.hader@typo3.org> Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de> Reviewed-by: Oliver Hader <oliver.hader@typo3.org> --- .../Resources/Public/TypeScript/Event/EventInterface.ts | 6 +++++- .../core/Resources/Public/TypeScript/Event/RegularEvent.ts | 2 +- .../core/Resources/Public/JavaScript/Event/RegularEvent.js | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/EventInterface.ts b/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/EventInterface.ts index 34204cad8525..63cada62f6dc 100644 --- a/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/EventInterface.ts +++ b/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/EventInterface.ts @@ -11,7 +11,11 @@ * The TYPO3 project - inspiring people to share! */ -export type Listener = Function & EventListenerOrEventListenerObject; +export type Listener = Function & (EventListenerWithTarget | EventListener | EventListenerObject); + +export interface EventListenerWithTarget { + (evt: Event, target?: Element): void; +} export interface EventInterface { bindTo(element: EventTarget): void; diff --git a/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/RegularEvent.ts b/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/RegularEvent.ts index 4eba02c7eed9..7000a0740750 100644 --- a/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/RegularEvent.ts +++ b/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/RegularEvent.ts @@ -33,7 +33,7 @@ class RegularEvent implements EventInterface { element.addEventListener(this.eventName, (e: Event): void => { for (let targetElement: Node = <Element>e.target; targetElement && targetElement !== this.boundElement; targetElement = targetElement.parentNode) { if ((<HTMLElement>targetElement).matches(selector)) { - this.callback.call(targetElement, e); + this.callback.call(targetElement, e, targetElement); break; } } diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Event/RegularEvent.js b/typo3/sysext/core/Resources/Public/JavaScript/Event/RegularEvent.js index 1af7ed3457ed..4020843ddc5f 100644 --- a/typo3/sysext/core/Resources/Public/JavaScript/Event/RegularEvent.js +++ b/typo3/sysext/core/Resources/Public/JavaScript/Event/RegularEvent.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -define(["require","exports"],(function(e,t){"use strict";return class{constructor(e,t){this.eventName=e,this.callback=t}bindTo(e){this.boundElement=e,e.addEventListener(this.eventName,this.callback)}delegateTo(e,t){this.boundElement=e,e.addEventListener(this.eventName,e=>{for(let n=e.target;n&&n!==this.boundElement;n=n.parentNode)if(n.matches(t)){this.callback.call(n,e);break}},!1)}release(){this.boundElement.removeEventListener(this.eventName,this.callback)}}})); \ No newline at end of file +define(["require","exports"],(function(e,t){"use strict";return class{constructor(e,t){this.eventName=e,this.callback=t}bindTo(e){this.boundElement=e,e.addEventListener(this.eventName,this.callback)}delegateTo(e,t){this.boundElement=e,e.addEventListener(this.eventName,e=>{for(let n=e.target;n&&n!==this.boundElement;n=n.parentNode)if(n.matches(t)){this.callback.call(n,e,n);break}},!1)}release(){this.boundElement.removeEventListener(this.eventName,this.callback)}}})); \ No newline at end of file -- GitLab