Skip to content

Commit 89eaf9c

Browse files
committed
events: support event handlers
1 parent e0586d0 commit 89eaf9c

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

lib/internal/event_target.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -445,10 +445,27 @@ function emitUnhandledRejectionOrErr(that, err, event) {
445445
process.emit('error', err, event);
446446
}
447447

448-
// EventEmitter-ish API:
449-
448+
function defineEventHandler(emitter, name) {
449+
// 8.1.5.1 Event handlers - basically `on[eventName]` attributes
450+
let eventHandlerValue = undefined;
451+
Object.defineProperty(emitter, `on${name}`, {
452+
get() {
453+
return eventHandlerValue;
454+
},
455+
set(value) {
456+
if (eventHandlerValue) {
457+
emitter.removeEventListener(name, eventHandlerValue);
458+
}
459+
if (typeof value === 'function') {
460+
emitter.addEventListener(name, value);
461+
}
462+
eventHandlerValue = value;
463+
}
464+
});
465+
}
450466
module.exports = {
451467
Event,
452468
EventTarget,
453469
NodeEventTarget,
470+
defineEventHandler,
454471
};

test/parallel/test-eventtarget.js

Lines changed: 33 additions & 0 deletions
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,4 +439,36 @@ ok(EventTarget);
438439
strictEqual(target.toString(), '[object EventTarget]');
439440
const event = new Event('');
440441
strictEqual(event.toString(), '[object Event]');
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+
let fn = common.mustNotCall(() => count++);
470+
target.onfoo = fn;
471+
strictEqual(target.onfoo, fn);
472+
target.onfoo = null;
473+
target.dispatchEvent(new Event('foo'));
441474
}

0 commit comments

Comments
 (0)