Chrome:使用 javascript 在输入文本字段上模拟按键事件

IT技术 javascript
2021-03-07 03:41:11

堆栈溢出中有很多关于此的内容,但似乎没有一个适用于我的情况。我有一个输入文本字段,我想模拟按键事件来填充文本字段。

原因:我在不提供 API 的 Web 界面上自动执行大量数据输入任务。使用更改输入字段.value不会触发界面的 JS 端(角度)。这就是为什么我想模拟按键事件。

首先我试过这个:

var inp = document.getElementById('rule-type');
inp.dispatchEvent(new KeyboardEvent('keypress',{'key':'a'}));

然后我在 Chrome 中学习了key并且code保持为 0 并且在KeyBoardEvent.

所以我创建了单独的事件 ev = new KeyboardEvent('keypress',{'key':'a', 'code': 'KeyA'})

然后我再次调度,返回语句是true但它没有改变输入字段。

解决方案需要使用纯 javascript 而不是 jQuery。

2个回答

您将无法触发会导致文本填充输入的事件。请参阅MDN 中的此片段

注意:手动触发事件不会生成与该事件关联的默认操作。例如,手动触发按键事件不会导致该字母出现在焦点文本输入中。对于 UI 事件,出于安全原因,这很重要,因为它可以防止脚本模拟与浏览器本身交互的用户操作。

谢谢@gforce301

最好的办法可能是设置该值,然后调度一个事件。

谢谢,这是非常有用的。关于您设置值然后调度事件的建议。它不会工作,因为一旦我设置了值,即使我进行了任何手动数据输入,它也不起作用。
2021-04-22 03:41:11
感谢 zero298 和 @gforce301。这个答案拯救了我的一天!
2021-04-27 03:41:11
@gforce301 好消息。我已经更新了我的答案。如果您希望我删除我的答案以便您可以自己发布,请告诉我。
2021-05-07 03:41:11
@sjishan 手动触发的键盘事件永远不会改变输入的值。请参阅:developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent关于手动触发事件的一半的注释。这是出于安全原因。
2021-05-16 03:41:11
好奇的。为什么要按键?你的代码也是 KeyA,key 和 keyCode 是不同的。无论如何在调度后它不会改变文本字段。
2021-05-19 03:41:11

恕我直言,你对这一切都错了。Angular 不是“听”keypress之类的。它正在侦听changeinput事件。请参阅下面的示例。它可以(诚然,它很简单)满足您的需求。

var iButton = document.getElementById('inputButton');
iButton.addEventListener('click', simulateInput);

var cButton = document.getElementById('changeButton');
cButton.addEventListener('click', simulateChange);

function simulateInput() {
  var inp = document.getElementById('name');
  var ev = new Event('input');
  
  inp.value =inp.value + 'a';
  inp.dispatchEvent(ev);
}

function simulateChange() {
  var inp = document.getElementById('name');
  var ev = new Event('change');
  
  inp.value = 'changed';
  inp.dispatchEvent(ev);
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="">
 
<p>Input something in the input box:</p>
<p>Name : <input id="name" type="text" ng-model="name" placeholder="Enter name here"></p>
<h1>Hello {{name}}</h1>

</div>

<button id="inputButton">I simulate the "input" event.</button>
<button id="changeButton">I simulate the "change" event.</button>

它是有效长度。它说太短的原因是因为它无法注册更改。如果我在刷新页面后手动输入相同的字符串,它工作正常。非常有趣的是,如果我在更改后不刷新并手动输入value仍然会引发相同的错误。
2021-04-21 03:41:11
试过了。没有用。得到同样的错误。ApiException: [LocalizedErrorWrapper<LocalizedErrorWrapper<StringLengthError.TOO_SHORT @ name>>] 如果我使用.value进行任何更改就不再起作用了。
2021-05-06 03:41:11
@sjishan 我不是 Angular 专家。我给出的例子是一个最小的 Angular 应用程序,你可以看到这个例子是有效的。您的错误是:“StringLengthError.TOO_SHORT @ name”。也许尝试输入一个有效长度的字符串?
2021-05-08 03:41:11
@sjishan 另外,“遇到相同的错误”是什么意思?您的帖子没有提到有关获取错误的任何内容。如果错误是问题,那么您应该询问错误,而不是将其转化为XY 问题
2021-05-10 03:41:11
你是对的,它可能是 XY 问题的情况。如果我使用更改输入文本字段的值,我会不断收到此 LocalizedErrorWrapper<LocalizedErrorWrapper<StringLengthError.TOO_SHORT.value因此我尝试使用键盘事件来模拟用户。我试过你的解决方案,它的情况相同。这就是为什么我说我遇到了同样的错误。
2021-05-14 03:41:11