mirror of
https://github.com/nodejs/node.git
synced 2026-11-09 15:11:11 -05:00
events: support event handlers
PR-URL: https://github.com/nodejs/node/pull/34015 Reviewed-By: Denys Otrishko <shishugi@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
This commit is contained in:
1 parent
9d324f0441
commit
e8f4ac7dad
2 files changed
+53
-2
No files matched your search
@@ -479,10 +479,27 @@ function emitUnhandledRejectionOrErr(that, err, event) {
|
||||
process.emit('error', err, event);
|
||||
}
|
||||
|
||||
// EventEmitter-ish API:
|
||||
|
||||
function defineEventHandler(emitter, name) {
|
||||
// 8.1.5.1 Event handlers - basically `on[eventName]` attributes
|
||||
let eventHandlerValue;
|
||||
Object.defineProperty(emitter, `on${name}`, {
|
||||
get() {
|
||||
return eventHandlerValue;
|
||||
},
|
||||
set(value) {
|
||||
if (eventHandlerValue) {
|
||||
emitter.removeEventListener(name, eventHandlerValue);
|
||||
}
|
||||
if (typeof value === 'function') {
|
||||
emitter.addEventListener(name, value);
|
||||
}
|
||||
eventHandlerValue = value;
|
||||
}
|
||||
});
|
||||
}
|
||||
module.exports = {
|
||||
Event,
|
||||
EventTarget,
|
||||
NodeEventTarget,
|
||||
defineEventHandler,
|
||||
};
|
||||
@@ -6,6 +6,7 @@ const {
|
||||
Event,
|
||||
EventTarget,
|
||||
NodeEventTarget,
|
||||
defineEventHandler
|
||||
} = require('internal/event_target');
|
||||
|
||||
const {
|
||||
@@ -438,6 +439,39 @@ ok(EventTarget);
|
||||
const event = new Event('');
|
||||
strictEqual(event.toString(), '[object Event]');
|
||||
}
|
||||
{
|
||||
const target = new EventTarget();
|
||||
defineEventHandler(target, 'foo');
|
||||
target.onfoo = common.mustCall();
|
||||
target.dispatchEvent(new Event('foo'));
|
||||
}
|
||||
{
|
||||
const target = new EventTarget();
|
||||
defineEventHandler(target, 'foo');
|
||||
let count = 0;
|
||||
target.onfoo = () => count++;
|
||||
target.onfoo = common.mustCall(() => count++);
|
||||
target.dispatchEvent(new Event('foo'));
|
||||
strictEqual(count, 1);
|
||||
}
|
||||
{
|
||||
const target = new EventTarget();
|
||||
defineEventHandler(target, 'foo');
|
||||
let count = 0;
|
||||
target.addEventListener('foo', () => count++);
|
||||
target.onfoo = common.mustCall(() => count++);
|
||||
target.dispatchEvent(new Event('foo'));
|
||||
strictEqual(count, 2);
|
||||
}
|
||||
{
|
||||
const target = new EventTarget();
|
||||
defineEventHandler(target, 'foo');
|
||||
const fn = common.mustNotCall();
|
||||
target.onfoo = fn;
|
||||
strictEqual(target.onfoo, fn);
|
||||
target.onfoo = null;
|
||||
target.dispatchEvent(new Event('foo'));
|
||||
}
|
||||
|
||||
{
|
||||
// `this` value of dispatchEvent
|
||||
|
||||
Reference in new issue
Block a user