【问题标题】:How do paste to multiple input? [duplicate]如何粘贴到多个输入? [复制]
【发布时间】:2019-03-15 19:48:41
【问题描述】:

有一个包含六个条目的输入。如果所需的数字直接粘贴到输入中..

123456

将数字粘贴到第一个框中时,如何将它们分配给其他框?

JSfiddle

var $inp = $(".passInput");

$inp.on({
 input: function(ev) {
  if(this.value) {
    $inp.eq($inp.index(this) + 1).focus();
  }
 },
 keydown: function(ev) {
  var i = $inp.index(this);
  if(ev.which===8 && !this.value && i) {
    $inp.eq(i - 1).focus();
  }
 }
});
.passInput {text-align: center;}
<form action="" role="form" method="post" id="passForm">
  <input type="text" class="passInput" name="pass[]" maxLength="1" size="1" autocomplete="off" min="0" max="9" required pattern="\d{1}" autofocus>
  <input type="text" class="passInput" name="pass[]" maxLength="1" size="1" autocomplete="off" min="0" max="9" required pattern="\d{1}">
  <input type="text" class="passInput" name="pass[]" maxLength="1" size="1" autocomplete="off" min="0" max="9" required pattern="\d{1}">
  <input type="text" class="passInput" name="pass[]" maxLength="1" size="1" autocomplete="off" min="0" max="9" required pattern="\d{1}">
  <input type="text" class="passInput" name="pass[]" maxLength="1" size="1" autocomplete="off" min="0" max="9" required pattern="\d{1}">
  <input type="text" class="passInput" name="pass[]" maxLength="1" size="1" autocomplete="off" min="0" max="9" pattern="\d{1}">
  <button type="submit" class="btn btn-lg btn-primary">SUBMIT</button>
</form>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

感谢 Roko C. Buljan 帮助开发代码


P.S.:我已经查看了问题的答案。但我意识到它不起作用。

【问题讨论】:

  • 仅粘贴还是在输入更改时粘贴?
  • 并非所有数字都在框中。仅粘贴了第一个数字@GetOffMyLawn
  • 我之前看过这个问题的答案,但它在演示中不起作用。 @BStill
  • @BStill Demo 太好了,谢谢!

标签: javascript html


【解决方案1】:

要获取clipboardData 文本,请使用ev.originalEvent.clipboardData.getData('text')
而不是确保修剪的长度正好是 6 个字符长并且都是数字。
通过拆分字符串为每个输入分配新值,并关注最后一个输入:

const $inp = $(".passInput");

$inp.on({
  paste(ev) { // Handle Pasting
  
    const clip = ev.originalEvent.clipboardData.getData('text').trim();
    // Allow numbers only
    if (!/\d{6}/.test(clip)) return ev.preventDefault(); // Invalid. Exit here
    // Split string to Array or characters
    const s = [...clip];
    // Populate inputs. Focus last input.
    $inp.val(i => s[i]).eq(5).focus(); 
  },
  input(ev) { // Handle typing
    
    const i = $inp.index(this);
    if (this.value) $inp.eq(i + 1).focus();
  },
  keydown(ev) { // Handle Deleting
    
    const i = $inp.index(this);
    if (!this.value && ev.key === "Backspace" && i) $inp.eq(i - 1).focus();
  }
});
.passInput {
  text-align: center;
  width: 20px;
}
Copy and paste into any field: 456123<br>
Than try with some invalid string: aA123B

<form action="" role="form" method="post" id="passForm">
  <input type="text" class="passInput" name="pass[]" maxlength="1" autocomplete="off" required pattern="\d{1}" autofocus>
  <input type="text" class="passInput" name="pass[]" maxlength="1" autocomplete="off" required pattern="\d{1}">
  <input type="text" class="passInput" name="pass[]" maxlength="1" autocomplete="off" required pattern="\d{1}">
  <input type="text" class="passInput" name="pass[]" maxlength="1" autocomplete="off" required pattern="\d{1}">
  <input type="text" class="passInput" name="pass[]" maxlength="1" autocomplete="off" required pattern="\d{1}">
  <input type="text" class="passInput" name="pass[]" maxlength="1" autocomplete="off" required pattern="\d{1}">
  <button type="submit" class="btn btn-lg btn-primary">SUBMIT</button>
</form>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【讨论】:

  • + ... 使用 preventDefault 进行良好的类型检查以抢先阻止边缘情况
  • @RokoC.Buljan 再次感谢您。
【解决方案2】:

您可以收听paste 事件和grab the pasted text

然后遍历每个粘贴的字符并像这样更新每个输入字段:

$inp.on('paste', function(e) {

    var pastedData = e.originalEvent.clipboardData.getData('text');
    var pastedChars = pastedData.split("");

    var curIndex = $inp.index(this)

    for (var i=0; i < pastedChars.length; i++) {
      var char = pastedChars[i]
      $inp.eq(curIndex + i).val(char).focus();
    }
 }
});

您可以在这里做更多的事情来处理边缘情况,但基本原则应该在下面的演示中发挥作用

var $inp = $(".passInput");

$inp.on({
 input: function(ev) {
  if(this.value) {
    $inp.eq($inp.index(this) + 1).focus();
  }
 },
 keydown: function(ev) {
  var i = $inp.index(this);
  if(ev.which===8 && !this.value && i) {
    $inp.eq(i - 1).focus();
  }
 },
 paste: function(e) {

    var pastedData = e.originalEvent.clipboardData.getData('text');
    var pastedChars = pastedData.split("");
    
    var curIndex = $inp.index(this)
    
    for (var i=0; i < pastedChars.length; i++) {
      var char = pastedChars[i]
      $inp.eq(curIndex + i).val(char).focus();
    }
 }
});
.passInput {text-align: center;}
<p>
Copy some text here: 123 123456
</p>
<form action="" role="form" method="post" id="passForm">
  <input type="text" class="passInput" name="pass[]" maxLength="1" size="1" autocomplete="off" min="0" max="9" required pattern="\d{1}" autofocus>
  <input type="text" class="passInput" name="pass[]" maxLength="1" size="1" autocomplete="off" min="0" max="9" required pattern="\d{1}">
  <input type="text" class="passInput" name="pass[]" maxLength="1" size="1" autocomplete="off" min="0" max="9" required pattern="\d{1}">
  <input type="text" class="passInput" name="pass[]" maxLength="1" size="1" autocomplete="off" min="0" max="9" required pattern="\d{1}">
  <input type="text" class="passInput" name="pass[]" maxLength="1" size="1" autocomplete="off" min="0" max="9" required pattern="\d{1}">
  <input type="text" class="passInput" name="pass[]" maxLength="1" size="1" autocomplete="off" min="0" max="9" pattern="\d{1}">
  <button type="submit" class="btn btn-lg btn-primary">SUBMIT</button>
</form>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多