代码之家  ›  专栏  ›  技术社区  ›  nicholaswmin

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

  •  1
  • nicholaswmin  · 技术社区  · 8 年前

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

    但是,有没有可能向它们发送带有字符的键盘事件,以便将发送的字符插入到当前光标位置?

    下面是一个不起作用的例子。

    '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)
    })
    #editable {
      border: 1px solid;
      padding: 8px 12px;
    }
    <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>

    为什么我需要这个:

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

    跟踪当前光标的位置 contenteditable ,因此我们可以插入单击的符号,这很容易出错,并且需要额外的代码(通常很难看)。我想避开它。

    我猜这是不可能做到的,因为这可能是一个安全风险,但提出要求从来没有坏处。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Julien Grégoire    8 年前

    你不能伪造按键,但你可以使用文件。执行命令。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'));
      
    
      
    })
    #editable {
      border: 1px solid;
      padding: 8px 12px;
    }
    <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>