【问题标题】:Not collecting data by custom tag on submit提交时未通过自定义标签收集数据
【发布时间】:2019-12-03 12:08:21
【问题描述】:

我有这种 JS,女巫收集数据并推动改变。

var dataArray = [];

$(function(){
    $(document).on('change', 'input', function(){
    var hid0 = $(this).data("hidden_val0");
    var hid1 = $(this).data("hidden_val1");
    var hid2 = $(this).data("hidden_val2");
    dataArray.push([hid0, hid1, hid2])
  });
});

   $('.something_here').bind('click', function (event) {
    event.preventDefault();
    $.post('/do/it',
        {
            send_array: dataArray,
        },
        function (response) {
           location.reload();
        }
    );

问题是它看不到目标,我认为?可能是我不应该使用$(this),因为他根本没有得到正确的值。

这是我正在使用的 HTML:

  <input autocomplete="off" id="add_109_01000340001001001_cad" name="add_109_01000340001001001[cad]" hidden_val0="hidden_val0" type="hidden" value="01000340001001001">
  <input autocomplete="off" hidden_val1="hidden_val1" id="add_109_01000340001001001_id" name="add_109_01000340001001001[id]" type="hidden" value="112000666">
  <input autocomplete="off" autocomplete_key="add_109" hidden_val2="hidden_val2" id="add_109_01000340001001001" name="add_109_01000340001001001" onkeyup="fillFlatNumber(this)" size="3" style="height: 10px" type="text" value="1" class="ac_input">

现在我得到了这个,而不是里面的值:

[undefined, undefined, undefined]

如果有人这么好心并且可以帮助我。我将感激不尽。

【问题讨论】:

  • 数据属性应以data-为前缀
  • 另外,$(this) 仅指一个输入框(您输入的那个)
  • 嘿!谢谢你。我理解你。你知道如何正确使用它吗?
  • 你可以用$(this).attr("hidden_val0");代替$(this).data("hidden_val0");
  • @NiravJoshi 谢谢你的回答,但我面临同样的问题:(。

标签: javascript jquery html arrays


【解决方案1】:

不要使用不同的数据属性,而是使用一个(例如data-hidden),并确保为它们添加data-的前缀。完成此操作后,您可以使用以下命令遍历所有具有此数据隐藏属性的元素:

$("[data-hidden]").each(function() { // loop all tags with `data-hidden`
  hidden_values.push($(this).data("hidden"));
});

这里$("[data-hidden]")选择所有具有data-hidden属性的元素,.each()允许我们循环遍历这些元素,其中$(this)指的是我们正在迭代的当前元素。

见下例:

var dataArray = [];

$(function() {
  $('input').change(function() {
    var hidden_values = [];
    $("[data-hidden]").each(function() { // loop through all hidden values
      hidden_values.push($(this).data("hidden"));
    });
  
    dataArray.push(hidden_values);
    console.log(dataArray);
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<input autocomplete="off" id="add_109_01000340001001001_cad" name="add_109_01000340001001001[cad]" data-hidden="hidden_val0" type="hidden" value="01000340001001001">
<input autocomplete="off" data-hidden="hidden_val1" id="add_109_01000340001001001_id" name="add_109_01000340001001001[id]" type="hidden" value="112000666">
<input autocomplete="off" autocomplete_key="add_109" data-hidden="hidden_val2" id="add_109_01000340001001001" name="add_109_01000340001001001" size="3" style="height: 10px" type="text" value="1" class="ac_input">

【讨论】:

  • 这太棒了!非常感谢你!但最后,我可以使用binddelegate 吗?因为我们使用的 jQuery on。没有办法升级:)。
  • @Marshmello 不用担心。如果页面加载时input 标签将出现在页面上,则可以使用$('input').change()(请参阅更新)
  • 如果您需要使用事件委托,.bind().delegate() 应该没问题
  • 那么,如果我是对的,您的解决方案会循环所有页面值并将它们推送到数组中吗?因为对我来说它是这样工作的,他将整个页面推到那里 => prntscr.com/q5kyox 这很奇怪......
  • 因为这个东西应该只收集值,这些值被修改并放入一个数组中。它不应该收集整个页面的数据。
【解决方案2】:

您的代码存在多个问题,我会尝试一一列出

  1. 数据属性应以数据为前缀。所以访问喜欢 $(this).data("hidden_val") 你的 html 应该是 data-hidden_val="hidden_val"
  2. 您正在向所有输入字段添加输入更改事件,所以当您 编辑第一个输入,你不能查询第二个和第三个输入的 值,因为它们将为空。如果你试图获得所有的价值 三个元素,您的数组将只有一个正确值和两个 空值。
  3. 由于您将数据附加到数组中,因此任何输入的每次更改都会添加一组新的重复值。
  4. 您为每个输入使用了不一致的数据属性,例如hidden_val0hidden_val1 等。而只需使用data-hidden_val

因此,与其在输入更改时读取数据,不如在将其发送到服务器之前读取它

【讨论】:

  • 感谢您的评论。我对此表示感谢。我已经通过data-hidden_val="hidden_val" 尝试了您的解决方案,但他仍然无法获取数据。所以我把它命名为undefined
猜你喜欢
  • 2015-07-06
  • 1970-01-01
  • 2014-07-13
  • 2011-12-27
  • 2019-10-09
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
相关资源
最近更新 更多