【问题标题】:How to loop through elements of forms with JavaScript?如何使用 JavaScript 遍历表单元素?
【发布时间】:2013-11-27 12:27:48
【问题描述】:

我有一个表格:

<form method="POST" action="submit.php">
    <input type="text" value="1">
    <input type="text" value="2">
    <input type="text" value="3">
    <input type="text" value="4">
    <button type="submit">Submit</button>
</form>

如何遍历表单中的输入元素(以便对它们执行一些验证)?

我更喜欢只使用纯 JavaScript,而不是 jQuery 或其他库。我还想将迭代限制为表单元素,而不是可以添加到表单中的任何其他元素。

【问题讨论】:

  • 试试 yourFormElement.getElementsByTagName
  • @DanDascalescu 正如您在 HTML 中看到的那样,这些 表单字段没有不同的名称。因此,它重复。

标签: javascript html forms


【解决方案1】:

现代 ES6 方法。使用您喜欢的任何方法选择表格。使用展开运算符将 HTMLFormControlsCollection 转换为 Array,则可以使用 forEach 方法。 [...form.elements].forEach

更新:Array.from 是传播 Array.from(form.elements) 的更好替代方案,它的行为更加清晰。


下面的示例遍历表单中的每个输入。您可以通过检查input.type != "submit"来过滤掉某些输入类型

const forms = document.querySelectorAll('form');
const form = forms[0];

Array.from(form.elements).forEach((input) => {
  console.log(input);
});
<div>
  <h1>Input Form Selection</h1>
  <form>
    <label>
      Foo
      <input type="text" placeholder="Foo" name="Foo" />
    </label>
    <label>
      Password
      <input type="password" placeholder="Password" />
    </label>
    <label>
      Foo
      <input type="text" placeholder="Bar" name="Bar" />
    </label>
    <span>Ts &amp; Cs</span>
    <input type="hidden" name="_id" />
    <input type="submit" name="_id" />
  </form>
</div>

【讨论】:

  • querySelector 用于单个查询,例如 [...document.querySelector('form').elements].forEach(el =&gt; ...);
【解决方案2】:

您可以像这样迭代命名字段:

let jsonObject = {};
for(let field of form.elements) {
  if (field.name) {
      jsonObject[field.name] = field.value;
  }
}

或者,如果您只需要提交字段:

function formDataToJSON(form) {
  let jsonObject = {};
  let formData = new FormData(form);
  for(let field of formData) {
      jsonObject[field[0]] = field[1];
  }
  return JSON.stringify(jsonObject);
}

【讨论】:

  • 或者你可以过滤它们:[...form.elements].filter(e=&gt;e.name)
【解决方案3】:
<form id="yourFormName" >
<input type="text" value="" id="val1">
<input type="text" value="" id="val2">
<input type="text" value="" id="val3">
<button type="button" onclick="yourFunction()"> Check </button>
</form>
<script type="text/javascript">
function yourFunction()
{
  var elements = document.querySelectorAll("#yourFormName input[type=text]")
  console.log(elements);
  for (var i = 0; i<elements.length; i++ )
  {
    var check = document.getElementById(elements[i].id).value);
    console.log(check);
    // write your logic here
  }
}
</script>

【讨论】:

    【解决方案4】:

    Es5 forEach:

    Array.prototype.forEach.call(form.elements, function (inpt) {
           if(inpt.name === name) {
                 inpt.parentNode.removeChild(inpt);
           }
    });
    

    否则可爱的:

    var input;
    for(var i = 0; i < form.elements.length; i++) {
         input = form.elements[i];
    
          // ok my nice work with input, also you have the index with i (in foreach too you can get the index as second parameter (foreach is a wrapper around for, that offer a function to be called at each iteration.
    }
    

    【讨论】:

      【解决方案5】:

      您可以使用getElementsByTagName 函数,它返回具有给定标签名称的元素的HTMLCollection。

      var elements = document.getElementsByTagName("input")
      for (var i = 0; i < elements.length; i++) {
          if(elements[i].value == "") {
              alert('empty');
              //Do something here
          }
      }
      

      DEMO

      您也可以使用document.myform.getElementsByTagName,前提是您已为 yoy 表单命名

      DEMO with form Name

      【讨论】:

      • 文档中的所有输入?不是好主意。此方法存在于指定元素
      • 为了避免拉取文档中的所有输入,.getElementsByTagName("input") 可以应用于表单对象或任何其他块对象,如 div。
      【解决方案6】:
      $(function() {
          $('form button').click(function() {
              var allowSubmit = true;
              $.each($('form input:text'), function(index, formField) {
                  if($(formField).val().trim().length == 0) {
                      alert('field is empty!');
                      allowSubmit = false;
                  }
              });
              return allowSubmit;
          });
      });
      

      DEMO

      【讨论】:

      • jQuery?请参阅 OP。
      【解决方案7】:

      您需要获取表单的引用,然后您可以迭代elements 集合。因此,假设例如:

      <form method="POST" action="submit.php" id="my-form">
        ..etc..
      </form>
      

      你会得到类似的东西:

      var elements = document.getElementById("my-form").elements;
      
      for (var i = 0, element; element = elements[i++];) {
          if (element.type === "text" && element.value === "")
              console.log("it's an empty textfield")
      }
      

      请注意,在支持 querySelectorAll 的浏览器中,您还可以执行以下操作:

      var elements = document.querySelectorAll("#my-form input[type=text][value='']")
      

      您将在elements 中只有具有空值属性的元素。但是请注意,如果用户更改了值,则属性将保持不变,因此此代码仅按属性过滤,而不是按对象的属性过滤。当然,你也可以混合使用两种解决方案:

      var elements = document.querySelectorAll("#my-form input[type=text]")
      
      for (var i = 0, element; element = elements[i++];) {
          if (element.value === "")
              console.log("it's an empty textfield")
      }
      

      你基本上会省下一张支票。

      【讨论】:

      • 当心这个 CSS 选择器会丢失没有属性的输入,即使它们默认为 "text",这不会反映在属性级别。应该还有一个其他选择器以input:not([type]) 为目标。
      • @Kaiido:另外值得注意的是,HTML5 增加了a bunch of new input element types,其中有几个基本上只是带有额外输入验证的文本框。
      猜你喜欢
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多