【开源论坛】论通过事件对象分派,模拟用户输入文本的行为(花了300大洋学到了本应该学到的知识点)
花了300大洋学到的知识点,其实自己之前也看到了这个知识点,只是没重点关注,不知道方向,调试的方法也有错误,所以很难受地花了300大洋。。。。。
一、论 facebook 的dom 动态渲染
facebook 的前端页面全是动态渲染形成的,所以可以查
,对直接改
dom是没有作用的,不仅因为它马上又会动态渲染回去,而且因为它并没有实际渲染进dom树中。所以需要一种方式,能够模拟用户行为,而不是直接修改dom。
二、事件对象分派
const input= document.querySelector("[aria-label='发消息'][aria-placeholder='Aa'][contenteditable='true']");
input.focus();// 创建一个新的 InputEvent
const event = new InputEvent('input', {inputType: 'insertText',data: message
});// 分派事件
input.dispatchEvent(event);
这段代码模拟用户在输入框中输入文本的行为。让我们逐步分析:
input.focus();
这行代码将焦点设置到名为 input 的输入元素上。这是必要的,因为 dispatchEvent 方法只有在元素获得焦点时才能可靠地工作。 如果没有这行代码,模拟的输入事件可能不会被正确处理。
const event = new InputEvent('input', { inputType: 'insertText', data: text });
这行代码创建了一个新的 InputEvent 对象。InputEvent 是一个浏览器事件,表示输入元素的值发生了变化。
'input':
指定事件类型为 input,这是当输入元素的值发生变化时触发的事件。
{ inputType: 'insertText', data: text }:
这是一个选项对象,包含了关于该事件的更多信息。
inputType: 'insertText':
指定输入类型为insertText,表示文本被插入到输入框中。这有助于浏览器更准确地处理事件,例如更新光标位置和文本选择。 其他可能的 inputType值包括 deleteContentBackward、deleteContentForward 等,取决于如何修改输入内容。
data: text:
指定插入的文本内容,text 变量应该包含要插入的文本字符串。
input.dispatchEvent(event);
这行代码将创建的 InputEvent
对象分派到 input
元素上。dispatchEvent
方法模拟了用户实际进行输入操作,触发了与用户输入相同的事件处理程序和行为。 这使得代码能够以编程方式更改输入框的值,并触发所有相关的事件监听器和更新。
三、关键词:
获取焦点
创建事件
事件对象分派
模拟用户实际操作
触发与用户实际操作相同的事件处理程序和行为
四、总结:
这段代码通过创建一个 InputEvent
对象并将其分派到输入元素,模拟了用户输入文本的行为。这在需要以编程方式更新输入框值并触发相关事件处理程序的场景中非常有用,例如自动化测试或构建自定义 UI 组件。 需要注意的是,keypress
事件与 input
事件不同,keypress
事件在按键按下时触发,而 input
事件在输入框的值发生变化时触发。 使用 input
事件可以更准确地模拟用户输入行为。
五、思考:为什么通过对象事件分派,可以模拟用户行为,触发与用户输入相同的时间处理程序和行为?
通过对象事件分派模拟用户行为并触发相同的事件处理程序和行为,是因为浏览器事件机制的设计。 浏览器事件系统并非仅仅针对用户交互,而是更通用的机制,允许任何代码(包括 JavaScript 代码)触发事件。
当用户与页面交互(例如,点击按钮、输入文本)时,浏览器会创建一个相应的事件对象,该对象包含事件类型、目标元素以及其他相关信息。然后,浏览器将此事件对象分派给目标元素及其祖先元素上的事件监听器。 事件监听器是预先注册的函数,它们会在特定事件发生时被执行。
dispatchEvent 方法正是利用了这个机制。它允许你创建一个事件对象,并将其人工地“分派”给目标元素。 浏览器接收到这个事件对象后,会按照与用户交互时完全相同的流程处理它:
事件捕获阶段: 事件从 window 对象开始,沿着 DOM 树向下传播到目标元素。 在此阶段,任何在祖先元素上注册的事件监听器(使用 addEventListener 的 capture 选项设置为 true)都会被执行。
目标阶段: 事件到达目标元素。 在此阶段,任何在目标元素上注册的事件监听器都会被执行。
事件冒泡阶段: 事件从目标元素开始,沿着 DOM 树向上传播到 window 对象。 在此阶段,任何在祖先元素上注册的事件监听器(使用 addEventListener 的 capture 选项设置为 false 或省略)都会被执行。
因为 dispatchEvent 创建的事件对象与用户交互触发的事件对象具有相同的结构和属性(事件类型、目标元素等),所以浏览器会以完全相同的方式处理它,从而触发与用户输入相同的事件处理程序和行为。 这使得开发者能够在不依赖实际用户交互的情况下,测试和控制页面元素的行为。
简而言之,dispatchEvent 绕过了用户交互这一步骤,直接将事件对象注入到浏览器的事件系统中,从而模拟用户行为。 这依赖于浏览器事件系统本身的机制,该机制对用户交互和程序化事件触发一视同仁。
好用的知识一起分享,但有些人总想藏着掖着拿来盈利,实话实说,这钱我花得很不爽,明明提一下方向就行,开源和技术精神就是这么被搞坏的!这是第一次也是最后一次此类交易。