使用 js 和增量符号 (++) 克隆一个项目,我的错误是双增量 i

Cloning an item with js and the increment sign (++), my error with double increment i

这是我的问题:

document.addEventListener("DOMContentLoaded",function() {
    const adduser = document.querySelector("#add-user");
    const original = document.querySelectorAll('#input');
    let i = 0;

    function duplicate() {
        
        let clone = original[0].cloneNode(true);
        clone.id = "input" + ++i;
        clone.name = "input" + ++i;
        
        original[0].after(clone);
    }

    adduser.onclick = function() {

        duplicate();

    };
});
<form action="second.php" method="post">
    <div class="form-group">
        <label for="username">Name of the user:</label>
        <input type="text" class="form-control multinput" class="username" id="input" placeholder="Enter the user's name" name="fullName">
        <button type="button" class="btn btn-default" id="add-user">+ Add a user</button>
    </div>
    <div class="buttons">
        <input type="submit" name="submit" id="submit" class="button" value="Submit"/>
    </div>
</form>

正如您已经猜到的那样,我正在尝试克隆一个字段,但我想增加这个字段的两个属性(在本例中,这是一个输入字段)。

现在我的问题是,一旦我按下按钮克隆 INPUT,在这种情况下,我将增加 id 和名称,但不幸的是,它们不会保持相同的数字,在事实上,标记将变为:

<form action="second.php" method="post">
    <div class="form-group">
        <label for="username">Name of the user:</label>
        <input type="text" class="form-control multinput" id="input" placeholder="Enter the user's name" name="fullName">
        <input type="text" class="form-control multinput" id="input" placeholder="Enter the user's name" name="input3">
        <input type="text" class="form-control multinput" id="input" placeholder="Enter the user's name" name="input1">
        <button type="button" class="btn btn-default" id="add-user">+ Add a user</button>
    </div>
    <div class="buttons">
        <input type="submit" name="submit" id="submit" class="button" value="Submit">
    </div>
</form>

这个。正如您所注意到的,在我的选择中,我们有两个错误的操作,它们是:

  1. 克隆然后附加到原始输入的输入顺序错误,因为它被添加到第一个元素 (0) 所以附加的最后一个元素不会上升,但在这种情况下, 它将具有更高的数字。

  2. id和name都会递增,所以id=1和name=2的输入是一样的,不太理想

关于如何解决问题的任何提示?

在分配新的 idname 之前,

仅增加 i 一次 。此外,使用按钮上的 insertAdjacentElement 在它之前插入每个新输入,而不是 after,以插入新输入:

  function duplicate() {
    i++;
    let clone = original[0].cloneNode(true);
    clone.id = "input" + i;
    clone.name = "input" + i;
    document.querySelector('button').insertAdjacentElement('beforebegin', clone);
  }

document.addEventListener("DOMContentLoaded", function() {
  const adduser = document.querySelector("#add-user");
  const original = document.querySelectorAll('#input');
  let i = 0;

  function duplicate() {
    i++;
    let clone = original[0].cloneNode(true);
    clone.id = "input" + i;
    clone.name = "input" + i;
    document.querySelector('button').insertAdjacentElement('beforebegin', clone);
  }

  adduser.onclick = duplicate
});
<form action="second.php" method="post">
  <div class="form-group">
    <label for="username">Name of the user:</label>
    <input type="text" class="form-control multinput" class="username" id="input" placeholder="Enter the user's name" name="fullName">
    <button type="button" class="btn btn-default" id="add-user">+ Add a user</button>
  </div>
  <div class="buttons">
    <!-- <input type="button" name="next" value="submit"> -->
    <input type="submit" name="submit" id="submit" class="button" value="Submit" />
  </div>
</form>

三件事:

  • 使用后递增 i,不是每次需要它时递增,否则它会递增多次而不是每次重复递增 1
  • 使用 setAttribute
  • 附加到父元素,而不是在原始输入之后实现降序

document.addEventListener("DOMContentLoaded",function() {
    const adduser = document.querySelector("#add-user");
    const original = document.getElementById('input');
    let i = 1;

    function duplicate() {
        
        let clone = original.cloneNode(true);
        clone.setAttribute("id", "input"+i);
        clone.setAttribute("name", "input"+i);
        i++
        
        original.parentNode.appendChild(clone);
    }

    adduser.onclick = function() {

        duplicate();

    };
});
<form action="second.php" method="post">
    <div class="form-group">
        <label for="username">Name of the user:</label>
        <input type="text" class="form-control multinput" class="username" id="input" placeholder="Enter the user's name" name="fullName">
        <button type="button" class="btn btn-default" id="add-user">+ Add a user</button>
    </div>
    <div class="buttons">
        <input type="submit" name="submit" id="submit" class="button" value="Submit"/>
    </div>
</form>