【问题标题】:Global javascript event intercept/handling全局 javascript 事件拦截/处理
【发布时间】:2020-03-05 18:13:21
【问题描述】:

我有一个大型网站,其中的一部分由框架(即 React、Vue、Angular...)呈现。 我需要的是一种处理/拦截所有输入事件(例如焦点、onchange、onclick ...)的方法,以便我可以捕获所有用户输入的遥测。

我最初的蛮力方法是在框架级别添加遥测捕获(以便捕获所有按钮点击)。但是后来我意识到所有在框架之外渲染的输入控件都不会被捕获。

现在我要回到绘图板上,想知道这是否可行。

我想不出一种方法来覆盖所有输入事件,即使它很丑陋。

问题:

如何拦截/处理所有输入事件,无论是否传播事件,也不管使用的框架如何?

【问题讨论】:

  • 所有输入事件是什么意思? AFAIK,没有这种类型的事件。 input 只是一个UIEvent 的名称。 focusFocusEventonchangeUIEventonclickMouseEvent...

标签: javascript events event-handling dom-events


【解决方案1】:

此示例在元素的值发生更改时记录该值。

您使用什么框架或在其他时间处理什么事件都没有关系。

处理特定事件:

var inputs = document.querySelector("input");

inputs.addEventListener('input', (event) => {
  console.log('input value!', event.target.value, event.data);
});
Input <input type="text">

处理所有事件:

var inputs = document.querySelector("input");
for (var ev in inputs) {
    // Events starts with "on" -> onClick, onInput, ...
    if (/^on/.test(ev)) {
        document.addEventListener(ev.substring(2), someFunction);
    }
}

function someFunction(event) {
  if (event.target.tagName === 'INPUT') {
    console.log(event.type);
  }
};

function createInput() {
  var new_input = document.createElement("INPUT");
  new_input.setAttribute("type", "text");
  document.body.appendChild(document.createElement("BR"));
  document.body.appendChild(new_input);
}
Input <input type="text">
<br>
<button onclick="createInput()">Create Input</button>

已编辑:添加了捕获所有事件的示例。

已编辑:捕获动态创建的输入事件。

【讨论】:

  • 谢谢。这太棒了。
  • 但是所有其他事件呢?
  • @VLAZ 新版本可以捕获所有事件。
  • 这不会在稍后动态插入到 DOM 的元素上注册事件。将事件侦听器附加到document 可能会更好(可能是在任何其他事件侦听器有机会通过调用stopPropagation 来防止冒泡之前捕获事件以注册事件)。
  • @John - 感谢您使用良好的语法、标点符号并提供优雅/简单/易于遵循的 sn-ps。这是一个惊人的答案。
猜你喜欢
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
相关资源
最近更新 更多