自定义KeyboardEvent不会冒泡

时间:2019-09-13 20:11:50

标签: javascript dom-events event-bubbling

由于某种原因,我的自定义"LastPause", (long) (time(NULL) - mem->lastpause), 不会冒泡。 我参加处理按住键:

KeyboardEvent

然后,我可以使用document.addEventListener('DOMContentLoaded', function () { var isPressed = false; var startTimeStamp; document.addEventListener('keydown', function (e) { if (!isPressed) { startTimeStamp = e.timeStamp; isPressed = true; } }); document.addEventListener('keyup', function (e) { isPressed = false; var eventDuration = e.timeStamp - startTimeStamp; var _e = new KeyboardEvent('keyheld', { bubbles: true, cancelBubble: false, cancelable: true, char: e.char, charCode: e.charCode, key: e.key, keyCode: e.keyCode, which: e.which, shiftKey: e.shiftKey, ctrlKey: e.ctrlKey, altKey: e.altKey, metaKey: e.metaKey }); Object.defineProperty(_e, 'detail', { value: { duration: eventDuration }, enumerable: true }); document.dispatchEvent(_e); }); }); 附带的侦听器来处理keyheld事件。尽管如此,附加到任何东西(在 body 下面)的侦听器根本不会触发:

document

即使提供document.addEventListener('DOMContentLoaded', function () { document.body.addEventListener('keyheld', function (e) { console.log('KEY HELD: ', e.detail.duration, e); }); }); 作为true的第三个参数,上面的代码也不起作用,即使是陌生人,在捕获而不是冒泡时也应触发监听器。

这可能是什么问题?

1 个答案:

答案 0 :(得分:0)

调用document.dispatchEvent(event)时,事件is dispatched with its target set to document是DOM层次结构中的顶级节点,如in an illustration here所示。

该事件通常会bubble到目标元素的父级,但是当目标是document时,就没有父级(document.parentNode === null)。出于相同的原因,尝试在身体上注册捕获侦听器无效。

您可能希望将其分发到原始事件的目标:e.target.dispatchEvent(_e)