如何使用自定义键盘事件和keyCode更改输入/textarea值
How to change input/textarea value with custom keyboard event and keyCode?
我想通过触发键盘事件来填充文本区域,例如keydown
(我这样做是为了测试用例)。
我添加了一个片段(如下)来显示我用于创建和触发事件的代码。事件触发,但文本区域从未接收到字母A的keyCode
值。
我需要做什么才能在文本区看到这封信?我目前正在Chrome控制台中运行这个片段,但它也应该在IE9中运行。
var t = document.getElementById('foo');
// Event creation
var event = document.createEvent('HTMLEvents');
event.initEvent('keydown', true, true);
event.keyCode = 65;
event.which = 65;
// Listener for demo purpose
t.addEventListener('keydown', function (e) {
document.getElementById('fired').value = e.type + ' fired';
});
// Event trigger
t.dispatchEvent(event);
<textarea id="foo"></textarea>
<br>
<input id="fired" value="">
为什么触发keydown
后值没有变化
简而言之:不能通过编程方式调度KeyboardEvent
来更改input
/texarea
的值。
字符实际上是如何进入input
的?在MDN上,您可以找到键盘事件序列的描述(假设未调用preventDefault
):
- 首先激发
keydown
事件。如果该键被进一步按下,并且该键生成一个字符键,那么该事件将继续在依赖于平台实现的间隔中发出,并且KeyboardEvent.repeat
只读属性将设置为true- 如果该键生成的字符键可能会导致字符插入到
<input>
、<textarea>
或HTMLElement.contentEditable设置为true的元素中,则beforeinput
和input
事件类型将按该顺序激发。请注意,如果支持,某些其他实现可能会激发keypress
事件。当按键按下时,事件将被反复触发- 一旦释放密钥,就会触发密钥设置事件。这就完成了这个过程
因此,默认情况下keydown
会导致input
事件。但这只适用于可信事件:
大多数不受信任的事件不会触发默认操作,
click
事件除外。。。所有其他不受信任的事件的行为就好像对该事件调用了preventDefault()
方法一样。
基本上,可信事件是由用户发起的事件,而不可信事件是通过脚本发起的。在大多数浏览器中,每个事件都有一个属性isTrusted,指示该事件是否可信。
那么如何在input
s上测试KeyboardEvent
s呢
首先,考虑一下您是否真的需要一个KeyboardEvent
处理程序。也许您可以在InputEvent
处理程序中完成所有操作。这意味着您可以在测试中设置input
的值,然后触发InputEvent
。
如果你仍然需要KeyboardEvent
处理程序,这取决于它中发生了什么。例如,如果你在某些条件下调用preventDefault
,那么你可以使用间谍检查它是否在测试中被调用。这里有一个例子,西农是间谍,柴是断言库。
const myEvent = new KeyboardEvent('keydown', { key: 'a' })
sinon.spy(myEvent, 'preventDefault')
document.getElementById('foo').dispatchEvent(myEvent)
expect(myEvent.preventDefault.calledOnce).to.equal(true)
按下键时会触发keydown
事件,但它不负责在DOM
元素中写入数据。
问题是;如果用户首先在<textarea>
上写入,则字符将添加到元素值中,然后触发keyDown
事件。然而,在您的情况下,您是直接触发事件的,因此将字符添加到<textarea>
值的第一步不会发生。
您有两个选项,以浏览器的方式编写值,然后发送事件
t.value = t.value + String.fromCharCode(e.keyCode);
t.addEventListener('keydown', function (e) {
document.getElementById('fired').value = e.type + ' fired';
});
也可以在keyDown
事件上写入<textarea>
的值:
// Listener for demo purpose
t.addEventListener('keydown', function (e) {
t.value = t.value + String.fromCharCode(e.keyCode);
document.getElementById('fired').value = e.type + ' fired';
});
但是,如果您想使用第二种方法进行用户交互,这是无稽之谈,因为在用户输入数据的情况下,数据将被写入两次(一次用于用户输入,另一次用于事件)。
希望这有帮助,
Javascript向<text区域>元件
我环顾四周,这似乎比我之前的非相关答案更相关。很抱歉。我知道这是jquery,但前提是一样的。
在事件中添加此项将工作
document.getElementById('foo').innerHTML += String.fromCharCode(e.keyCode);
这里是纯javascript jsfiddle
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 可以't让我的if语句处理js中的html表单输入
- 如何使用自定义键盘事件和keyCode更改输入/textarea值
- 为什么在Chrome中输入更改时,TEXTAREA的scrollHeight错误
- JavaScript中的内容会使contentEditable和textarea都无法接收任何输入
- 使用Ajax在输入时提交Textarea,然后在不刷新整个页面的情况下呈现部分
- 检测“;输入“;键并绘制textarea组件
- 改变“+”;在textarea中输入type='复选框'>
- 如何使文本输入框可调整大小(如textarea)通过拖动其右下角使用jQuery
- jQuery输入过滤器的textarea
- 当javascript中的输入发生变化时,在html textarea中自动更改文本
- 不能使用Angular获取HTML textarea输入文本
- 在提交时将文本输入到注释textarea html/jquery中
- ExtJS Textarea -自动保存用户输入的内容
- 从用户输入(textarea)生成json数据
- 限制在ExtJS Textarea中输入的行数
- 使用javascript将值赋给前一页输入的textarea
- Textarea autcomplete - 使用 JavaScript 将文本输入定位在文本区域的光标位置之上
- 使用两个输入看起来像textarea
- HTML从textarea获取输入并将其传递给我的Javascript函数