- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在考虑构建一个工具,将所有浏览器事件(本地 dom 事件,如 .click()
或 jQuery 事件)转换为标准形式。
标准形式是:HTMLElement.dispatchEvent(new Event(eventType, eventInitDict))
例如,我想将 HTMLElement.click()
更改为 HTMLElement.dispatchEvent(new Event("click", {"bubbles": true, ...}))
用于所有事件。
我的问题:
我必须将所有事件完全转换成这种格式......一个都不能幸免!
谢谢!
我为什么要这样做?
我正在 try catch Chrome 扩展程序触发的所有事件。为此,我决定在将扩展内容脚本注入(inject)页面之前修改它(我不关心背景页面或弹出页面),因此触发的所有事件都被“标记”为源自扩展(这将被添加到上面示例中的 eventInitDict
。我正在修改 Chromium 来执行此操作。
附言。我想不出更好的问题标题,但如果您有,请告诉我/更改它。
最佳答案
要捕获所有事件,您需要为每个事件向 DOM 添加事件监听器。
要捕获的事件很多,这很费力。我知道,因为我必须在我目前正在进行的项目中执行此操作。
通常在 SO 答案中,建议将所有相关文本放入答案中,在这种情况下,由于可用事件的数量,我不会这样做。您可以找到 DOM 事件的详细列表 here (MDN)
现在幸运的是,无论触发事件的原因如何,都可以捕获事件。在底层,JQuery 最有可能触发 DOM 事件,但由于我没有查看 JQuery 源代码,所以我不能肯定地说。
添加事件监听器时,您需要为 addEventListener 函数上的 useCapture 传递一个设置为 true 的 bool 值。
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);
有一个警告,对于捕获的每个事件,您需要捕获可能特定于该事件类型的事件属性,并将其保存在存储事件属性(如事件名称、选择器等)的自定义对象中.
新事件的“标准”形式是不够的。有些事件有不同的初始化字典,如果属性不是事件的标准,它们将被普通事件忽略,这就是为什么你应该实例化正确的对象类型,例如新的鼠标事件,新的键盘事件。等等
您可以使用新的 CustomEvent 来捕获不向事件的详细信息属性添加标准属性的合成事件,但这对于常规 DOM 事件来说是不够的。
无论以何种标准衡量,这都不是一项小任务。
关于javascript - 使用 dispatchEvent 触发所有浏览器事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42148611/
我正在使用 Angular2 + TypeScript,当我尝试执行这段代码时: var event = new Event('check'); window.dispatchEvent(event)
在我的 Angular 应用程序中,我必须打开一个新窗口并将一个事件发送回 Controller 。该代码适用于 Chrome 和 Firefox,但它不适用于 Edge 下面是来自外部文件的代码 t
我在获取 dispatchEvent 时遇到问题上类。我正在尝试消除对 jQuery 的依赖,并且一直在对 native API 进行自己的小扩展,但我无法获取我的 trigger 版本使用 disp
我有编写的代码: window.addEventListener("orientationchange", function() { //code here; }, false); 它工作正常
也许这是我的误解,但我认为当您创建一个自定义事件,然后创建“带有事件监听器的元素”(监听该事件)时,该事件(本身)会跟踪所有监听器谁在等待事件发生,并且当事件发生时,所有监听器都会自动收到通知。 但是
有没有办法调度所有元素? 例如,我们可以做 window.dispatchEvent(evt),但我想允许所有元素使用该事件。 (对于onclick,我们几乎可以使用所有元素) 最佳答案 var ev
我正在尝试为 WinJS 中的自定义事件编写事件处理程序。我不太确定这在 IE 中是如何工作的 -我正在创建一个自定义事件并发送它 - var eventObject = document.creat
如演示中所示,dispatchEvent 未按预期工作。 http://jsfiddle.net/DerekL/V8uEN/ 关键部分: btn.dispatchEvent( document
当我使用 dispatchEvent 模拟鼠标事件时,事件监听器的调用顺序与实际鼠标事件不同。特别是,某些bubble监听器会在同一目标上的capture监听器之前被调用。 这是一个 fiddle 来
如果我有一个无按钮表单,并且我想测试可能的 onsubmit 函数是否返回 true,然后提交它。这是我当前的代码,效果很好。 var form = document.getElementById('
通常我不会在 SO 中提出这种如此具体的问题,但我已经为这个问题苦苦挣扎了好几天,所以我在这里寻求一些帮助。 我正在构建一个应用程序来自动执行 Web 版 Whatsapp 中的任务 (https:/
在我的代码中我做了:element.onerror = my_function; 我想知道如何强制触发此事件以便我可以对其进行测试? 谁能告诉我如何使用 dispatchEvent 流程来做到这一点?
我正在尝试根据用户操作将字符发送到输入元素。 我正在尝试将 KeyboardEvent 与 dispatchEvent 一起使用,但无论我做什么,它都不起作用 例如: let keyEvent = n
我创建了一个事件,以便可以在事件发生时添加监听器。触发事件的场景会有所不同,因此需要跟踪触发事件的原因并进行适当的处理。但是,我尝试在循环内发生的函数中添加dispatchEvent,但收到 In
我有一个由特定函数触发的自定义事件。 此事件包含一个包含详细信息等的eventArgs。我希望处理程序/监听器能够更改 eventArgs,以便原始函数获得更改后的值。这可能吗? 到目前为止我已经尝试
我有以下代码 http://jsfiddle.net/yc7sj3pt/2/ document.getElementById('obj_one').addEventListener('mouseove
我在表单上有一个提交事件处理程序(以捕获使用 enter 提交表单的人,有时我需要手动触发(由用户点击提交按钮以外的其他内容触发) ,通过 dispatchEvent。 虽然我不希望它实际提交表单,但
当我在输入框上使用 dispatchEvent 触发 focus 事件时,它的 onfocus 被调用,但在 UI 上输入框是不专注。这种行为有什么原因吗? var test = document.g
我对下面的脚本感到困惑: var event = new Event('shazam'); document.body.addEventListener('shazam',function(){
我的要求是将事件从代码触发到父托管组件。 我在这里使用第一个答案作为引用:angular2 manually firing click event on particular element 如果我尝
我是一名优秀的程序员,十分优秀!