使用 dispatchEvent 触发所有浏览器事件

Trigger all browser events using dispatchEvent

我正在考虑构建一个工具,将所有浏览器事件(本机 dom 事件,如 .click() 或 jQuery 事件)转换为标准形式。

标准格式为:HTMLElement.dispatchEvent(new Event(eventType, eventInitDict))

例如,我想将所有事件的 HTMLElement.click() 更改为 HTMLElement.dispatchEvent(new Event("click", {"bubbles": true, ...}))

我的问题:

  1. 是否有从事件到这个标准形式的完整映射,如果 那么,它在任何地方都有记录吗?
  2. 是否有任何可以触发但无法转换的事件 到这个标准格式?
  3. jQuery 会做一些我做不到的事情吗 转换。

当务之急是我把所有的事件全部转成这个格式...None可以省下来!

谢谢!


我为什么要这样做?

我正在尝试捕获 Chrome 扩展程序触发的所有事件。为此,我决定在将扩展内容脚本注入页面之前修改它(我不关心背景页面或弹出页面),因此触发的所有事件都是 "tagged" 来自扩展(这将添加到上面示例中的 eventInitDict。我正在修改 Chromium 来执行此操作。


PS。我想不出更好的问题标题,但如果您有,请告诉我/更改它。

要捕获所有事件,您需要将事件侦听器添加到每个事件的 DOM。

要捕获的事件很多,这很费力。我知道,因为我必须在我目前正在从事的项目中这样做。

通常在 SO 答案中,建议将所有相关文本放入答案中,在这种情况下,由于可用事件的数量,我不会这样做。您可以找到 DOM 事件的详细列表 here (MDN)

现在幸运的是,无论触发事件的原因如何,都可以捕获事件。在下面,JQuery 最有可能触发 DOM 事件,但由于我没有查看 JQuery 来源,我不能肯定。

添加事件侦听器时,您需要为 addEventListener 函数上的 useCapture 传递一个设置为 true 的布尔值。

target.addEventListener(type, listener, useCapture);

有关 addEventListener 的更多文档 here

您可能希望在代码中声明一个 JSON 事件数组,或者声明一个静态数组,以便维护您希望捕获的事件列表。

此外,为了触发事件,您需要存储对它们所针对的元素的引用。我也不得不这样做。您需要找到一种方法来获取触发事件的任何元素的选择器。

类似于以下内容

var eventList = ['click', 'keydown'];
for(var i = 0;i < eventList.length; i++) {
    var eventName = eventList[i];
    document.addEventListener(eventName, function (evt) {
        var selector = getElementSelector(evt.target); // where getElementSelector will be a function that returns an id, css path or xpath selector.
        var captured = { eventName: eventName, selector: selector };
    });
}

要触发捕获的事件,假设您使用上面的对象结构,您可以执行以下操作

var eventObject = { eventName: 'click', selector: '#targetId'};
var target = document.querySelector(eventObject.selector);
var event = new Event(eventName, {
    view: window,
    bubbles: true,
    cancelable: true
});
target.dispatchEvent(event);

需要注意的是,对于捕获的每个事件,您需要捕获可能特定于该事件类型的事件属性,并将其保存在存储事件属性(例如 eventName、选择器和之类的

新事件的'standard'形式是不够的。有些事件有不同的初始化字典,如果属性不是,这些事件将被普通的Event忽略事件的标准,这就是为什么你应该实例化正确的对象类型,例如新的鼠标事件,新的键盘事件。等等

您可以使用新的 CustomEvent 来捕获合成事件,这些合成事件将 none 标准属性添加到事件的详细信息 属性 中,但这对于常规 DOM 事件来说是不够的。

无论以何种标准衡量,这都不是一项小任务。