【问题标题】:Simulating a Key in Input Field VANILLA Javascript [closed]模拟输入字段 VANILLA Javascript 中的键 [关闭]
【发布时间】:2020-06-05 21:50:11
【问题描述】:

我觉得我很愚蠢。我的英语不是很好,所以当我阅读解决方案时我什么都听不懂。我为你们准备了一个实验室。请看一下。

(请使用 Vanilla Javascript 而不是 JQuery 找到解决方案)

HTML:

    <div id = "row1">
      <span>Word</span>
      <span>Word2</span>
      <span>Word3</span>
    </div>

    <input id="inputfield">

JS:

    var childs = document.getElementById('row1').childNodes;
    var input = document.getElementById('inputfield');
    childs.forEach(e => {
        if(e.innerText){
            console.log(e.innerText);
            input.value += e.innerText;
            //simulate a key press right here (space)
            //input's value have to be like this > Word Word2 Word3
        }
    })

【问题讨论】:

  • 当按键发生时你期望发生什么?

标签: javascript input key simulate


【解决方案1】:

在我看来,最简单的方法是拥有一个值数组并使用数组的join() 方法从中创建一个字符串。使用join(),您可以在每个单词之间添加一个字符串,如空格或您想要的字母。

下面的 sn-p 使用 Array.from()map() 方法循环遍历每个 &lt;span&gt; 元素,以转换数组中的元素并返回一个新数组,其中只有每个 textContent 的值 &lt;span&gt; .现在你有一个看起来像这样的数组。

['Word', 'Word2', 'Word3']

通过在该数组上使用join(' '),您可以将其转换为字符串,每个单词之间有什么空格。

var words = ['Word', 'Word2', 'Word3'];
words.join(' '); // "Word Word2 Word3"

var childs = document.querySelectorAll('#row1 span');
var input = document.getElementById('inputfield');

var words = Array.from(childs).map(child => child.textContent);
input.value = words.join(' ');
<div id = "row1">
  <span>Word</span>
  <span>Word2</span>
  <span>Word3</span>
</div>

<input id="inputfield">

编辑

您可以使用KeyboardEvent() 构造函数创建自己的键盘事件。有了这个,您可以使用应该按下的键创建自己的事件。但是您必须监听该事件,因为如果您不告诉浏览器该做什么,浏览器将不知道如何处理它。

使用dispatchEvent(),您可以从某个元素触发事件。当您在该元素上侦听该事件时,您将捕获创建的事件。

在您的输入中监听keydown 事件并检查按下的键是否是空格键。在下面的示例中,keykeyCodecode 代表空格键,但方式不同。

var childs = document.querySelectorAll('#row1 span');
var input = document.getElementById('inputfield');

input.addEventListener('keydown', event => {
  if (event.key === "Space" || event.keyCode === 32 || event.code === '32') {
    console.log('Spacebar simulated');
    input.value += ' ';
  }
});

childs.forEach(e => {
  if (e.innerText) {
    input.value += e.innerText;
    var keydownEvent = new KeyboardEvent('keydown', {
      key: "Space",
      keyCode: 32,
      code: '32'
    });
    input.dispatchEvent(keydownEvent);
  }
});
<div id="row1">
  <span>Word</span>
  <span>Word2</span>
  <span>Word3</span>
</div>

<input id="inputfield">

【讨论】:

  • 非常感谢您的回答,但这不是我想要的。我想要“模拟输入字段中的键”。我必须模拟一个键(就像我按下它一样)。我必须这样做。所以这个答案是正确的,但不是我想要的。你也可以按照我的方式做这件事吗? (顺便说一句,再次非常感谢你,并对我奇怪的英语感到抱歉:D)
  • 不客气。我添加了第二个示例,其中空格键是“模拟的”。还有一个事件侦听器,它侦听keydown 事件,以便在每个单词之后的输入元素内添加空格。如果您可以向您的问题解释 why 会很有帮助,因为您的问题不是您通常会如何做这样的事情。你的奇怪的英语是没有问题的,只要我们互相理解。 ;)
  • 这个解决方案非常好,我正在寻找什么,但我有一个问题。我们模拟了一个空格键,但它没有在我们的输入中添加空格,除了我们添加 input.value += ' ';但是我想在模拟空格键时在输入中添加空格。
  • 这根本不可能。操作系统会接收您的键盘输入,然后告诉浏览器如何处理该输入。您只能控制用户在浏览器中可以在您的网站上做什么,而不是操作系统应该告诉浏览器做什么。基本上,浏览器在按下空格键时会做与事件处理程序相同的事情。再说一次,为什么你需要它作为“模拟”按键?
  • 我只是在一个快速打字网站上测试了一些东西。只是想从中赚取一些错误赏金。这东西有问题吗?我只是害怕你说话的方式:D
【解决方案2】:

如果您希望在按键时发生某些事情,您可以将onkeypress="function()" 添加到您的输入框中,但您很可能需要onkeyup="function()",否则您将无法在输入中看到按键的结果

    <div id = "row1">
      <span>Word</span>
      <span>Word2</span>
      <span>Word3</span>
    </div>

    <input id="inputfield" onkeyup="run(this)">

我不确定当按键发生时你想要发生什么,但你会这样写你的 JS


  const childs = document.getElementById('row1').childNodes;
  const input = document.getElementById('inputfield');
  childs.forEach(e => {
    if(e.innerText){
      console.log(e.innerText);
      input.value += e.innerText + ' ';
      // simulate a key press right here (space)
      // input's value have to be like this > Word Word2 Word3
    }
  });

在这里查看 jsfiddle:https://jsfiddle.net/kcbst5oe/1/

【讨论】:

  • 我想要“模拟输入字段中的键”。我必须模拟一个键(就像我按下它一样)。我必须这样做。因此,我与 onkeyup 事件无关。阅读我在代码中编写的 cmets。 //input.value += e.innerText; //在这里模拟一个按键(就像我按下了空格键) //输入的值必须是这样的 > Word Word2 Word3
  • “模拟键”不是一回事。您需要找到另一种方式来解释您想要实现的目标
  • 您只是希望输入字段在每个单词之间有一个空格吗?如果您只想更新input.value += e.innerText + ' ';
  • 用新的 jsfiddle jsfiddle.net/kcbst5oe/1更新示例
  • var keydownEvent = new KeyboardEvent('keydown', { key: "Space", keyCode: 32, code: '32' }); input.dispatchEvent(keydownEvent);我想要那样的东西。 input.dispatchEvent(keydownEvent) -> 这个东西每次我调用它时都必须在我的输入中添加空间。 Emiel 回答了我的问题,但是这个 dispatchEvent 方法并没有在我的输入中添加空格。看看 -> jsfiddle.net/tb58y1aj/3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多