以编程方式将关键字符分派到输入/内容可编辑

Nik*_*des 3 javascript dom

我可以很容易地设置输入样式 DOM 元素 ( input/ div contenteditable=true) 的值,通过 JS 设置它们的.valueinnerText属性。

但是是否可以向它们分派键盘事件,加载一个字符,以便将分派的字符插入到当前光标位置?

这是一个不起作用的例子。

'use strict'

const btn = document.querySelector('#btn')
const editable = document.querySelector('#editable')

btn.addEventListener('mousedown', e => {
  // prevent unfocus when clicking button
  e.preventDefault()
  
  const customEvt = new KeyboardEvent('keypress', {
    bubbles: true, 
    cancelable: true, 
    key: 'X', 
    char: 'X'
  })

  editable.dispatchEvent(customEvt)
})
Run Code Online (Sandbox Code Playgroud)
#editable {
  border: 1px solid;
  padding: 8px 12px;
}
Run Code Online (Sandbox Code Playgroud)
<p> Make sure the editable is focused before pressing button</p>
<div id="editable" contenteditable="true">Lorem Ipsum</div>
<button id="btn"> Add 'X' character at cursor position</button>
Run Code Online (Sandbox Code Playgroud)

为什么我需要这个:

我们正在为应用程序构建符号键盘,该键盘将允许用户将符号添加到当前光标位置。

跟踪 a 中的当前光标位置contenteditable,以便我们可以插入单击的符号,很容易出错并且需要额外的(通常是丑陋的)代码。我想避免它。

我猜这是不可能的,因为这可能存在安全风险,但问一下总没有坏处。

Jul*_*ire 5

您无法伪造按键,但可以使用 document.execCommand.insertText,它应该给出或多或少相同的结果。请参阅https://developer.mozilla.org/en-US/docs/Web/API/document/execCommand

'use strict'

const btn = document.querySelector('#btn')
const editable = document.querySelector('#editable')

btn.addEventListener('mousedown', e => {
  // prevent unfocus when clicking button
  e.preventDefault() 
  console.log(document.execCommand('insertText', false, 'X'));
  

  
})
Run Code Online (Sandbox Code Playgroud)
#editable {
  border: 1px solid;
  padding: 8px 12px;
}
Run Code Online (Sandbox Code Playgroud)
<p> Make sure the editable is focused before pressing button</p>
<div id="editable" contenteditable="true">Lorem Ipsum</div>
<button id="btn"> Add 'X' character at cursor position</button>
Run Code Online (Sandbox Code Playgroud)