【问题标题】:Multi step form - how to show data from steps before?多步骤表单 - 如何显示之前步骤的数据?
【发布时间】:2020-01-24 12:31:57
【问题描述】:

这是检查带有 1 个标签的多个单选按钮的好方法吗?我有一个包含多个步骤的表格。最后一步显示了关于前面步骤的摘要,我需要从那里获取所有数据。有更好的选择吗?如何从输入字段中获取文本并将其插入摘要? JavaScript?

$('label').click(function() {
  id = this.id.split('-');

  if (id[0] === '1') {
    id[0] = '2';
  } else {
    id[0] = '1';
  }

  $('#' + id[0] + '-' + id[1]).prop('checked', true);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="one">
  <input type="radio" id="1-1" name="1-level">
  <label for="1-1" id="1-1">1</label>
  <input type="radio" id="1-2" name="1-level">
  <label for="1-2" id="1-2">2</label>
</div>
<div class="two">
  <input type="radio" id="2-1" name="2-level">
  <label for="2-1" id="2-1">1</label>
  <input type="radio" id="2-2" name="2-level">
  <label for="2-2" id="2-2">2</label>
</div>

【问题讨论】:

  • 这有什么意义?为什么不使用一个单选按钮来表示 1-1 和 1-2,因为选择一个也会选择另一个,使得两个单选基本相同。并且由于您不使用value 属性,因此 1-1 和 1-2 所代表的含义与它使用的单选按钮的数量无关。如果将value 属性添加到所有输入元素,则只需使用new FormData( theFormElement ) 即可自动收集所有值。
  • @Shilly 正如我所说,我有一个多步骤表格,最后我需要一个摘要(最后一步)。所以我必须显示选择了哪个值(在我的示例中,第二类是“摘要”,在开始时不可见)。
  • 啊,我明白了,您正在将选中的收音机“复制”到其他收音机。我个人更喜欢摘要不是输入元素,而只是在将值添加到输入之后的 FormData 的漂亮打印。但这使得这只是一个基于意见的问题。
  • @Shilly 我有同样的想法.. 但应该可以编辑输入。你觉得我的方案好不好?
  • 什么文本,来自哪个输入字段?你的意思是以前收音机的标签吗?为什么您需要能够从摘要中编辑表单数据,而不是仅仅重定向到表单的那一部分进行调整?

标签: javascript jquery html forms input


【解决方案1】:

添加一个form 元素来包装您的input 元素。表单可以访问其中的所有输入并查看它们的名称和值。因此,在这种情况下,在 input 元素上使用 value 属性很重要。从上面的操作开始,让你的代码看起来像下面的例子。

另外,请注意id。它们必须是唯一的,因此它们只能在每个文档中出现一次。现在label 和它们的input 元素具有相同的id

<form id="step-form">

  <div class="one">
    ...
  </div>

</form>

像@Shilly 建议的那样,使用FormData API。此 API 旨在从表单中获取所有值,例如 inputtextareaselect 元素,并将所有这些数据放入单个对象中。这样,您可以根据需要创建任意数量的 form-elements,将它们添加到表单中并将它们的值存储在单个对象中。

该对象中的数据将被读取为 key-value 对,在本例中为 namevalue 属性值。例如:['1-level', '2'],这里我们看到带有 name '1-level'value '2' 的输入。

我不建议使用其他输入元素来显示您的结果或摘要。这可能会让用户感到困惑,因为它建议输入。而是以纯文本形式打印您的结果或创建一个列表。

我不知道许多这些 API 或方法的 jQuery 等价物,所以我使用 Vanilla JavaScript 创建了一个演示,希望能展示您尝试完成的工作。

如果您有任何问题,我一直不清楚,或者没有以任何方式帮助您。请告诉我。

const form = document.getElementById('step-form');
const summary = document.getElementById('step-summary');
const clear = document.getElementById('step-clear');

// Remove all children of the summary list.
function clearSummary() {
  while(summary.firstElementChild) {
    summary.firstElementChild.remove();
  }
}

// Clear list on click.
clear.addEventListener('click', event => {
  clearSummary();
});

form.addEventListener('submit', event => {
  // Clear list first.
  clearSummary();
  
  // Create a fragment to store the list items in.
  // Get the data from the form.
  const fragment = new DocumentFragment();
  const formData = new FormData(event.target);

  // Turn each entry into a list item which display
  // the name of the input and its value.
  // Add each list item to the fragment.
  for (const [ name, value ] of formData) {
    const listItem = document.createElement('li');
    listItem.textContent = `${name}: ${value}`;
    fragment.appendChild(listItem);
  }

  // Add all list items to the summary.
  summary.appendChild(fragment);
  event.preventDefault();
});
<form id="step-form">

  <div class="one">
    <input type="radio" id="1-1" name="1-level" value="1">
    <label for="1-1">1</label>
    <input type="radio" id="1-2" name="1-level" value="2">
    <label for="1-2">2</label>
  </div>
  
  <div class="two">
    <input type="radio" id="2-1" name="2-level" value="1">
    <label for="2-1">1</label>
    <input type="radio" id="2-2" name="2-level" value="2">
    <label for="2-2">2</label>
  </div>
  
  <div class="three">
    <input type="radio" id="3-1" name="3-level" value="1">
    <label for="3-1">1</label>
    <input type="radio" id="3-2" name="3-level" value="2">
    <label for="3-2">2</label>
  </div>

  <ul id="step-summary"></ul>
  
  <button type="submit">Review form</button>
  <button type="button" id="step-clear">Clear summary</button>

</form>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多