javascript - 自定义 KeyboardEvent 不冒泡

标签 javascript dom-events event-bubbling

出于某种原因,我的自定义 KeyboardEvent 没有冒泡。 我负责处理持有的 key :

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);
  });
});

然后我可以使用附加到 document 的监听器处理 keyheld 事件。尽管如此,附加到任何其他东西(下面是 body)的监听器根本不会触发:

document.addEventListener('DOMContentLoaded', function () {
    document.body.addEventListener('keyheld', function (e) {
      console.log('KEY HELD: ', e.detail.duration, e);
    });
});

上面的代码不起作用,更奇怪的是,即使将 true 作为 addEventListener() 的第三个参数提供,它应该在捕获而不是冒泡时触发监听器.

这里可能出了什么问题?

最佳答案

当您调用 document.dispatchEvent(event) 时,事件 is dispatched with its target set to document,这是DOM层次结构中的顶级节点,可以看出in an illustration here .

事件通常会 bubble到目标元素的父元素,但是当目标是 document 时,没有父元素 (document.parentNode === null)。出于同样的原因,尝试在 body 上注册一个捕获监听器是行不通的。

您可能想分派(dispatch)到原始事件的目标:e.target.dispatchEvent(_e)

关于javascript - 自定义 KeyboardEvent 不冒泡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57929826/

相关文章:

cordova - PhoneGap Build 应用程序不会触发与电池相关的事件

javascript - Vanilla JavaScript - 仅选择 'this' 具有事件冒泡的特定元素

javascript - 检测事件是否由用户触发,而不是以编程方式触发

javascript - 在事件冒泡阶段删除祖先

javascript - 设置为 null 后标题仍然显示

Javascript 数组搜索

javascript - zIndex 位置为 :relative: not working chrome and safari

javascript - 如何在 jQuery 数组中找到 indexOf 元素?

javascript - Backbone - 复选框保持选中状态?