微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

了解 event.target.elements

如何解决了解 event.target.elements

我正在使用 javascript(React,但我认为这不是 React 特有的)来处理表单提交。我的任何元素都不受控制,我想保持这种状态。我可能事先并不确切知道表单元素是什么,有多少个等等。我只想抓住表单中的任何内容并将其发送到任何需要去的地方。

我正在事件处理程序中进行一些日志记录,以便我可以检查 event.target.elements,这有点令人困惑。它似乎同时是一个索引数组和一个对象,每个表单元素都有一个数字条目和一个命名条目。它的 length 属性等于数字条目数的长度(忽略命名条目),但如果我尝试直接在其上使用 .forEach,则会收到错误 {{1} }.如果我使用 event.target.elements.forEach is not a function 对其进行循环,则会记录数字和命名条目。但如果我使用 Object.entries 循环遍历它,我只会得到数字条目。

我只想知道到底发生了什么。如果 lodash 不是数组,为什么它有 event.target.elements 属性?如果是数组,为什么不能直接在上面使用普通的length

我的表单提交事件处理程序看起来像这样,用于测试/学习目的:

forEach

输出如下,注意let handleSubmit = async( event ) => { event.preventDefault(); console.log("event.target.elements",event.target.elements); console.log("event.target.elements",typeof event.target.elements); Object.entries(event.target.elements).forEach(([name,input]) => { console.log("name",name); console.log("input",input); }); console.log("------"); _.forEach(event.target.elements,(el,key)=>{ console.log("key",key); console.log("name",el.name); console.log("value",el.value); }); }; // handleSubmit 循环执行四次,而Object.entries循环执行两次

lodash

解决方法

实际上,答案就在您的代码示例中:它是一个 HTMLFormControlsCollection (MDN entry here)。

在 JS 中,不仅有 ObjectArrayMapSet(好吧,WeakMapWeakSet),而且还有其他类型(集合),例如 HTMLCollection 的“家庭”。

这些都有自己的专长,可用于不同的用例,但它们可以通过一些迭代技术用作Array

const inputForm = document.getElementById("input-form")

inputForm.addEventListener('submit',(e) => {
  e.preventDefault()

  const el = e.target.elements
  console.log("el.toString():",el.toString())
  console.log("instanceof HTMLFormControlsCollection:",el instanceof HTMLFormControlsCollection) // expected: true
  console.log("instanceof Array:",el instanceof Array) // expected: false

  // iteration #1
  // using map() on collections
  const mapped = Array.prototype.map.call(el,(ele) => ele)
  console.log("mapped:",mapped)

  // iteration #2
  // logs the elements
  for (let ele of el) {
    console.log("for...of:",ele)
  }

  // iteration #3
  // logs the keys of the HTMLFormControlsCollection
  for (let ele in el) {
    console.log("for...in:",ele)
  }

  // iteration #4
  const spread = [...el]
  console.log("spread:",spread)
});
<form id="input-form">
  <input type="text" />
  <input type="text" />
  <button type="submit">SUBMIT</button>
</form>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?