Skip to content

Commit 91b6c09

Browse files
benjamingrcodebytere
authored andcommitted
events: support event handlers
PR-URL: #34015 Reviewed-By: Denys Otrishko <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]>
1 parent b392fdd commit 91b6c09

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

lib/internal/event_target.js

+19-2
Original file line numberDiff line numberDiff line change
@@ -479,10 +479,27 @@ function emitUnhandledRejectionOrErr(that, err, event) {
479479
process.emit('error', err, event);
480480
}
481481

482-
// EventEmitter-ish API:
483-
482+
function defineEventHandler(emitter, name) {
483+
// 8.1.5.1 Event handlers - basically `on[eventName]` attributes
484+
let eventHandlerValue;
485+
Object.defineProperty(emitter, `on${name}`, {
486+
get() {
487+
return eventHandlerValue;
488+
},
489+
set(value) {
490+
if (eventHandlerValue) {
491+
emitter.removeEventListener(name, eventHandlerValue);
492+
}
493+
if (typeof value === 'function') {
494+
emitter.addEventListener(name, value);
495+
}
496+
eventHandlerValue = value;
497+
}
498+
});
499+
}
484500
module.exports = {
485501
Event,
486502
EventTarget,
487503
NodeEventTarget,
504+
defineEventHandler,
488505
};

test/parallel/test-eventtarget.js

+34
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const {
66
Event,
77
EventTarget,
88
NodeEventTarget,
9+
defineEventHandler
910
} = require('internal/event_target');
1011

1112
const {
@@ -438,6 +439,39 @@ ok(EventTarget);
438439
const event = new Event('');
439440
strictEqual(event.toString(), '[object Event]');
440441
}
442+
{
443+
const target = new EventTarget();
444+
defineEventHandler(target, 'foo');
445+
target.onfoo = common.mustCall();
446+
target.dispatchEvent(new Event('foo'));
447+
}
448+
{
449+
const target = new EventTarget();
450+
defineEventHandler(target, 'foo');
451+
let count = 0;
452+
target.onfoo = () => count++;
453+
target.onfoo = common.mustCall(() => count++);
454+
target.dispatchEvent(new Event('foo'));
455+
strictEqual(count, 1);
456+
}
457+
{
458+
const target = new EventTarget();
459+
defineEventHandler(target, 'foo');
460+
let count = 0;
461+
target.addEventListener('foo', () => count++);
462+
target.onfoo = common.mustCall(() => count++);
463+
target.dispatchEvent(new Event('foo'));
464+
strictEqual(count, 2);
465+
}
466+
{
467+
const target = new EventTarget();
468+
defineEventHandler(target, 'foo');
469+
const fn = common.mustNotCall();
470+
target.onfoo = fn;
471+
strictEqual(target.onfoo, fn);
472+
target.onfoo = null;
473+
target.dispatchEvent(new Event('foo'));
474+
}
441475

442476
{
443477
// `this` value of dispatchEvent

0 commit comments

Comments
 (0)