【问题标题】:Getting all selected checkboxes in an array to POST to API获取数组中所有选中的复选框以发布到 API
【发布时间】:2021-12-14 02:00:01
【问题描述】:

我想通过urlencoded.append 将数组中的所有选中复选框获取到POST 到API

urlencoded.append("typeID", (document.getElementById("type").value==1?"1":document.getElementById("type").value==2?"2":"3"));
<div id="myDiv">
  <input type="checkbox" name="name" value="1" id="type-id">
  <label>Food Deals</label>
  <br>
  <input type="checkbox" name="name" value="2" id="type-id">
  <label>Groceries Deals</label>
  <br>
  <input type="checkbox" name="name" value="3" id="type-id">
  <label>Karam Box</label>
  <br>
</div>

【问题讨论】:

  • 您的 HTML 无效,id 必须是唯一的...
  • @MisterJojo 我编辑它
  • 同理,你的3个复选框的ID相同,所以它们不是唯一的。
  • @FadyNabil ...id 复选框的值仍然不是唯一的(3 次 id="type-id")。此外,根本没有理由为每个复选框控件提供id 属性。
  • @FadyNabil ... 从所有提供的解决方案/方法中,还有什么问题吗?

标签: javascript arrays forms checkbox form-data


【解决方案1】:

前置编辑

It looks like the OP already has access to a FormData instance 在 OP 的示例代码中被称为 urlencoded

因此,为了快速修复 OP 的代码,解决方案可能如下所示...

// make an array from the ...
Array.from(
  // ... node list of every checked
  // ckeckbox control withing the #myDiv element ...
  document.querySelectorAll('#myDiv [type="checkbox"]:checked')
)
.reduce((formData, control) => {

  // ... and append key/name and value to `formData` ...
  formData.append(control.name, control.value);
  return formData;

  // ... which is represented by the `urlencoded` object
  // that got provided as the `reduce` task's initial value.
}, urlencoded);

为了研究XHRFormData 的使用,下面还有一个完整且有效的示例代码。

+++编辑结束+++

除了日志记录之外,还要检查您的 DevTools Network 选项卡。应该能够检查到 https://stacksnippets.net/ 的失败 (404) POST 请求,但使用正确发送的表单数据。

提供的方法使用一个表单元素,它拦截并阻止浏览器的表单提交,但会根据表单的 methodaction 值创建自己的 XHR。

为了收集/聚合表单数据,它使用FormData Web API。这样的对象可以直接传递给XHR的send方法。

function createXHRFromForm(form) {
  const xhr = new XMLHttpRequest;

  xhr.open(
    form.method,
    form.action,
    true
  );
  xhr.setRequestHeader(
    'Content-Type',
    'application/x-www-form-urlencoded'
  );
  // xhr.onreadystatechange = function() {
  //   if (
  //     (this.readyState === XMLHttpRequest.DONE)
  //     && (this.status === 200)
  //   ) {
  //     // handle success
  //   }
  // };
  return xhr;
}
function createCheckboxFormData(form) {
  // for the given example form
  // following line already was sufficient enough
  //
  // return new FormData(form);
  //
  // but a custom aggregation is supposed to be shown.
  return Array
    .from(
      form.querySelectorAll('[type="checkbox"]:checked')
    )
    .reduce((formData, control) => {

      formData.append(control.name, control.value);
      return formData;

    }, new FormData); 
}

function handleCheckboxDataSubmit(evt) {
  evt.preventDefault();
  
  const form = evt.currentTarget;

  const xhr = createXHRFromForm(form);
  const formData = createCheckboxFormData(form);

  console.clear();
  console.log({
    entries: [...formData.entries()],
    name: formData.getAll('name'),
  });
  xhr.send(formData);

  return false;
}

function main() {
  document
    .querySelector('form[name="myForm"]')
    .addEventListener('submit', handleCheckboxDataSubmit);
}
main();
:not([type="submit"]) {
  margin: 0!important;
  padding: 0!important;
}
body { zoom: .85; }
label { display: block; cursor: pointer; }
[type="submit"] { margin-top: 3px; }
<form name="myForm" action="/" method="post">
  <label>
    <input type="checkbox" name="name" value="1" checked/>
    <span class="label">Food Deals</span>
  </label>
  <label>
    <input type="checkbox" name="name" value="2" checked/>
    <span class="label">Groceries Deals</span>
  </label>
  <label>
    <input type="checkbox" name="name" value="3"/>
    <span class="label">Karam Box</span>
  </label>
  <button type="submit">POST</button>
</form>

【讨论】:

    【解决方案2】:

    几个笔记:

    1. HTML(和现实)中,id 是独一无二的。
    2. JS 中,选中的复选框是checked 而不是selected

    为了收集所有检查的值,您可以执行以下操作:

    function demo() {
      document.querySelectorAll('input:checked').forEach(element => {
        console.log(element.value);
      });  
    }
    <div>  
      <label>1<input type="checkbox" value="1" /></label>
      <label>2<input type="checkbox" value="2" /></label>  
      <label>3<input type="checkbox" value="3" / ></label>
      <label>4<input type="checkbox" value="4" /></label>
      <label>5<input type="checkbox" value="5" /></label>  
      <label>6<input type="checkbox" value="6" / ></label>
    </div>
    <button type="button" onclick="demo()">"POST"</button>

    【讨论】:

    • @a-meshu 这很适合我查看控制台日志上的值,但不适用于我发布到 API urlencoded.append("typeID", document.querySelectorAll('input:checked') .forEach(element => {console.log(element.value)}));
    • @FadyNabil ...我们甚至不知道urlencodedurlencoded.append 应该是什么意思。你也不是,因为如果append 是一种需要参数的方法,那么就不能将document.querySelectorAll('input:checked').forEach(element =&gt; {console.log(element.value)}) 作为它的第二个参数执行并期望发生有意义的事情。看看我提供的方法。在那里,您可以找到完整且有效的示例代码,以研究 XHRFormData 的使用。我的猜测是您的 urlencoded 对象实际上是一个 FormData 实例。
    • @FadyNabil 你到底想做什么?我的基本 sn-p 演示了如何从检查的输入中获取所有值。取而代之的是console.log他们-您可以随心所欲地使用它(:
    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2012-02-14
    • 2016-01-14
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多