【问题标题】:Getting HTML5 custom data-* attributes from radio buttons on form submit从表单提交的单选按钮获取 HTML5 自定义数据-* 属性
【发布时间】:2019-08-20 23:03:15
【问题描述】:

提交表单时,有没有办法为选定的单选按钮获取自定义 HTML5 data-* 属性? serializeArray() 似乎没有获取该值。

HTML

<form id="preference-form">
<table>
<tr class ="result">
    <td width="100%">{{Title}}</td>
    <td><input type="radio" id="radio-{{Project_No}}-1" data-application="{{Application_ID}}" name="{{Project_ID}}" value="1"></td>
    <td><input type="radio" id="radio-{{Project_No}}-2" data-application="{{Application_ID}}" name="{{Project_ID}}" value="2"></td>
    <td><input type="radio" id="radio-{{Project_No}}-3" data-application="{{Application_ID}}" name="{{Project_ID}}" value="3"></td>
    <td><input type="radio" id="radio-{{Project_No}}-9" data-application="{{Application_ID}}" name="{{Project_ID}}" value="9"></td>
</tr>
</table>
</form>

JavaScript

$("#preference-form).on('submit', function() {
    var data = $(this).serializeArray();
    console.log(data)
});

这会输出namevalue 字段,但我似乎找不到关于data-* 字段的简单答案。不幸的是,我需要所有三条信息才能对数据库记录执行更新,据我了解:

  • 每个 ID 和 Value 字段都必须是唯一的,
  • 每个名称字段必须相同才能对元素进行分组。

我认为这其中的棘手部分是多个元素与单个元素相比。

【问题讨论】:

  • 你不能只使用隐藏输入吗?
  • 请注意,将&lt;tr&gt; 包装在&lt;form&gt; 中是无效标记
  • 也许如果我知道如何将它与输入相关联。我的 HTML 的 &lt;tr&gt; 元素实际上是 3 或 4 深;我将如何关联?更新了标记。
  • 除了收音机之外,您还有其他表单控件吗?简单地为收音机编写自己的序列化程序并提出像[{app:123, name:'foo', value:3}]这样的对象
  • 然后我会建议另一个数据属性来识别更新与插入也

标签: javascript forms serializearray html5-data


【解决方案1】:

基于您只有收音机的评论;编写自己的序列化程序很简单。

首先我会将数据属性放在&lt;tr&gt; 上以减少重复

<tr data-application="{{Application_ID}}">

然后你会做这样的事情:

var data = $(this).find('tr:has(:radio:checked)').map(function(){
   var $row=$(this), radio = $row.find(':radio:checked')[0]
   return {
      app: $row.data('application'),
      name: radio.name,
      value: radio.value
   }
}).get()

【讨论】:

  • 你能把你的代码分解一下吗?我假设$(this) 是执行submit 操作时选择的元素;在我的情况下$("#preference-form"),但是$row = $(this) 呢?我的radio 元素也被塞进了&lt;td&gt; 元素中,不管怎样,这会发现吗?
  • 第一个 this 是格式...正确。 map() 中的内部 this&lt;tr&gt; 实例
  • 它一直在抛出unrecognized expression: tr.has(:radio:checked)
  • 同样的错误只是tr.has(… :radio:checked),如果我理解你最后的评论是正确的,但我认为这也会破坏Edge。
  • 在这里工作正常jsfiddle.net/vp8d3tc6。这里使用的任何东西都不应该在 Edge 或旧版 IE 中使用。即使在 IE 7-8 中也可能工作
【解决方案2】:

你不见了#

 $('#preference-form').on('submit', function(e) {

data-* 属性值使用隐藏输入。以下演示发送到实时测试服务器,响应将显示在下面的 iframe 中。

$('#preference-form').on('submit', function(e) {
  radData(e);
  var data = $(this).serializeArray();
  console.log(data);
});

var radData = e => {
  $(':radio:checked').each(function(e) {
    var dataSet = $(this).data('application');
    $(this).closest('tr').find('.dataSet').val(dataSet);
  });
}
.as-console-wrapper {
  width: 350px;
  min-height: 100%;
  margin-left: 45%;
}

.as-console-row.as-console-row::after {
  content: '';
  padding: 0;
  margin: 0;
  border: 0;
  width: 0;
}

.hide {
  display: none
}
<form id="preference-form" action='https://httpbin.org/post' method='post' target='response'>
  <table width='100%'>
    <tr class="result">
      <td><input type="radio" id="rad1" data-application="rad1" name="rad1" value="1"></td>
      <td><input type="radio" id="rad2" data-application="rad2" name="rad1" value="2"></td>
      <td><input type="radio" id="rad3" data-application="rad3" name="rad1" value="3"></td>
      <td><input type="radio" id="rad9" data-application="rad9" name="rad1" value="9">
      </td>
      <td class='hide'>
        <input class='dataSet' name='dataSet1' type='hidden'>
      </td>
    </tr>

    <tr class="result">
      <td><input type="radio" id="rad4" data-application="rad4" name="rad2" value="4"></td>
      <td><input type="radio" id="rad5" data-application="rad5" name="rad2" value="5"></td>
      <td><input type="radio" id="rad6" data-application="rad6" name="rad2" value="6"></td>
      <td><input type="radio" id="radA" data-application="radA" name="rad2" value="A">
      </td>
      <td class='hide'>
        <input class='dataSet' name='dataSet2' type='hidden'>
      </td>
    </tr>

    <tr class="result">
      <td><input type="radio" id="rad7" data-application="rad7" name="rad3" value="7"></td>
      <td><input type="radio" id="rad8" data-application="rad8" name="rad3" value="8"></td>
      <td><input type="radio" id="radB" data-application="radB" name="rad3" value="B"></td>
      <td><input type="radio" id="radC" data-application="radC" name="rad3" value="C">
      </td>
      <td class='hide'>
        <input class='dataSet' name='dataSet3' type='hidden'>
      </td>
    </tr>
  </table>
  <input type='submit'>

</form>
<iframe name='response'></iframe>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【讨论】:

  • 带收音机的 2 行或更多行怎么样?我发现隐藏输入的最大问题是,当显示或超过 1 行时,无法关联 data-* 字段。在我的例子中,每一行代表一个应用程序,每一列代表一个偏好。
  • 更新了 2 行
猜你喜欢
  • 1970-01-01
  • 2019-03-11
  • 2018-04-04
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
相关资源
最近更新 更多