吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 561|回复: 3
收起左侧

[其他转载] 解决antd输入框不能用JS模拟输入的问题

[复制链接]
lijialong1313 发表于 2024-12-16 17:48
本帖最后由 lijialong1313 于 2024-12-16 22:46 编辑

我最近遇到了个问题,就是纯使用js,没办法模拟输入,在antd官网上的测试用例也发现了这个问题。

01.png

然后我尝试了网上大多流行的说的这些那些例如说触发什么change、input、focus、key的,均不可以。

为什么不可以呢,因为它压根没有绑定这个事件
02.png
但是你输入也确实可以触发,所以想要js绕过还是很麻烦的。

然后,经过我苦心查找。
https://blog.csdn.net/qq_17627195/article/details/134166737
中的:

[JavaScript] 纯文本查看 复制代码
// 获取 input 输入框的dom对象
var element_input = window.document.querySelector('input');

// JavaScript 中的 `_valuetracker` 方法常常用于监听 HTML 表单元素(如 input,select,textarea 等)的值变化,并在每次值发生变化时执行回调函数。
if (element_input._valueTracker) var _templMethod = element_input._valueTracker.getValue;
if (element_input.getValue) var _templMethod = element_input.getValue;
if (element_input._valueTracker) element_input._valueTracker.getValue = () => '';

// 修改input的值
element_input.value = '123';

// 设置输入框的 input 事件
var event = new InputEvent('input', {
    'bubbles': true, // 表示事件对象是否冒泡
    'cancelable': true, // 表示事件是否可以被取消,即能否用Event.preventDefault()取消这个事件。
});
// 触发 dom 对象的 input 事件
element_input.dispatchEvent(event);

// 将`_valuetracker`的值(方法)重新绑定
if (element_input._valueTracker) element_input._valueTracker.getValue = _templMethod;


这段代码是可以的。

但是这段代码没有详细解释它为什么可以。

因此在这里特别解释和介绍一下:

首先,网上说的什么”规范“什么”要求“,目前来说可以当它啥都没说。实际原因是Antd(应该是React)自己写了一个_valueTracker(或者getValue)方法,去进行底层的捕获。这个东西默认还不会显示出来。
所以逻辑就变得很简单了,其实就是我们找到了这个对象,直接捕获屏蔽了 它的方法,执行了操作之后重新绑定,就这么简单。

更新:
发现写的时候没讲的很清楚,我这里重新详细说一下。

首先,目前知道这个是React的一个写法,其他的不知道有没有。

其次,这个东西其实是React直接挂了一个最底层的input监听捕获,只要打开上级就可以全部看到。而我们通常只对input本身进行操作,因此在没有这个方法的时候触发不了。

最后,解决方案有2个办法。
1就是我上面提到的,直接中间过一轮。
2就是 https://www.52pojie.cn/forum.php?mod=viewthread&tid=1901376&page=1#pid49771019 提到的直接使用模拟方式并调用setValue设置值。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

linguo2625469 发表于 2024-12-16 19:51
react是这样的啊  论坛有人发过了
https://www.52pojie.cn/forum.php ... 76&pid=49771019
李恒道 发表于 2024-12-17 08:40
IT大小白 发表于 2024-12-17 15:04
之前也遇到这个问题,问AI各种折腾都无效;这个可以解决了,感谢分享

[JavaScript] 纯文本查看 复制代码
// 获取 input 输入框的dom对象
var element_input = document.querySelector('input[placeholder="请输入起批量"]');
 
// JavaScript 中的 `_valuetracker` 方法常常用于监听 HTML 表单元素(如 input,select,textarea 等)的值变化,并在每次值发生变化时执行回调函数。
if (element_input._valueTracker) var _templMethod = element_input._valueTracker.getValue;
if (element_input.getValue) var _templMethod = element_input.getValue;
if (element_input._valueTracker) element_input._valueTracker.getValue = () => '';
 
// 修改input的值
element_input.value = '2';
 
// 设置输入框的 input 事件
var event = new InputEvent('input', {
    'bubbles': true, // 表示事件对象是否冒泡
    'cancelable': true, // 表示事件是否可以被取消,即能否用Event.preventDefault()取消这个事件。
});
// 触发 dom 对象的 input 事件
element_input.dispatchEvent(event);
 
// 将`_valuetracker`的值(方法)重新绑定
if (element_input._valueTracker) element_input._valueTracker.getValue = _templMethod;
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-7 20:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表