【问题标题】:jQuery: the checked property is undefined on change eventjQuery:在更改事件中未定义选中的属性
【发布时间】:2016-08-21 12:24:38
【问题描述】:

我看到很多关于这个主题的问题,但没有一个能解决我的问题。

问题是:我有一个复选框,当用户单击它时需要选中属性的新值。

我尝试过不同的事件附加器,例如 on.("change" .. 和 .change(function() .. 但它总是返回“未定义”。 如果对变量的分配不止一次,我还测试了(带有警报),但他们没有。就一次。

请考虑脚本并告诉我您是否知道我做错了什么。或者,如果我应该发布更多信息。

$(document).ready(function () {
        $('#invoice_list :checkbox').on('change', function () {
            var _invoice_id;
            var _payed;
            var _sent;
            $(this).parent().siblings().each(function () {
                if ($(this).hasClass('name?ajax_invoice_id')) {
                    _invoice_id = $(this).text();
                }
                if ($(this).hasClass('name?ajax_payed')) {
                    _payed = $(this).children(':checkbox').prop('checked');
                }
                if ($(this).hasClass('name?ajax_sent')) {
                    _sent = $(this).children(':checkbox').prop('checked');
                }
            });
            alert('invoice_id: ' + _invoice_id + '\r\npayed: ' + _payed + '\r\nsent: ' + _sent);
        });
    });        

如果我选中“已付款”复选框,无论新值如何,这都是结果(“已发送”也是如此):localhost says

html from razor view

<tbody class="clickable">
                    <tr>
                        <td class="name?ajax_invoice_id">85</td>
                        <td>31-10-2015 16:54:27</td>
                        <td>31-10-2015 00:00:00</td>
                        <td>31-10-2015 00:00:00</td>
                        <td>4800,00</td>
                        <td>6000,00</td>
                        <td>1200,00</td>
                        <td>25,00 %</td>
                        <td>1</td>
                        <td>6,00</td>
                        <td>800,00</td>                            
                        <td class="name?ajax_sent"><input data-val="true" data-val-required="The Sendt field is required." id="Collection_0__Sent" name="Collection[0].Sent" type="checkbox" value="true" /><input name="Collection[0].Sent" type="hidden" value="false" /></td>
                        <td class="name?ajax_payed"><input data-val="true" data-val-required="The Betalt field is required." id="Collection_0__Payed" name="Collection[0].Payed" type="checkbox" value="true" /><input name="Collection[0].Payed" type="hidden" value="false" /></td>
                    </tr>
                    <tr>
                        <td class="name?ajax_invoice_id">36</td>
                        <td>25-10-2015 18:54:35</td>
                        <td>25-10-2015 00:00:00</td>
                        <td>25-10-2015 00:00:00</td>
                        <td>6400,00</td>
                        <td>8000,00</td>
                        <td>1600,00</td>
                        <td>25,00 %</td>
                        <td>1</td>
                        <td>8,00</td>
                        <td>800,00</td>                            
                        <td class="name?ajax_sent"><input data-val="true" data-val-required="The Sendt field is required." id="Collection_1__Sent" name="Collection[1].Sent" type="checkbox" value="true" /><input name="Collection[1].Sent" type="hidden" value="false" /></td>
                        <td class="name?ajax_payed"><input data-val="true" data-val-required="The Betalt field is required." id="Collection_1__Payed" name="Collection[1].Payed" type="checkbox" value="true" /><input name="Collection[1].Payed" type="hidden" value="false" /></td>
                    </tr>
        </tbody>

【问题讨论】:

  • $('#invoice_list :checkbox') 更改为$('#invoice_list input[type=checkbox]')
  • @MehdiDehghani 刚刚尝试过,但它仍然是相同的消息框:-/
  • 请出示html
  • @MehdiDehghani 我已经发布了 html 的屏幕截图。
  • 将所有:checkbox 替换为input[type=checkbox],然后告诉我这个值invoice_id、_payed、_sent 中的undefined 是哪一个

标签: jquery checkbox onchange


【解决方案1】:

为了解释您的实际问题,$(this).parent().siblings() 仅将其兄弟姐妹返回到集合中,而不是包含您单击的 checkboxtd

您可以使用.addBack(),其中包括兄弟姐妹 + 自身:-

$(document).ready(function() {
  $('#invoice_list :checkbox').on('change', function() {
    var _invoice_id;
    var _payed;
    var _sent;
    $(this).parent().siblings().addBack().each(function() {
      if ($(this).hasClass('name?ajax_invoice_id')) {
        _invoice_id = $(this).text();
      }
      if ($(this).hasClass('name?ajax_payed')) {
        _payed = $(this).children(':checkbox').prop('checked');
      }
      if ($(this).hasClass('name?ajax_sent')) {
        _sent = $(this).children(':checkbox').prop('checked');
      }
    });
    alert('invoice_id: ' + _invoice_id + '\r\npayed: ' + _payed + '\r\nsent: ' + _sent);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<table id="invoice_list">
  <tbody class="clickable">
    <tr>
      <td class="name?ajax_invoice_id">85</td>
      <td>31-10-2015 16:54:27</td>
      <td>31-10-2015 00:00:00</td>
      <td>31-10-2015 00:00:00</td>
      <td>4800,00</td>
      <td>6000,00</td>
      <td>1200,00</td>
      <td>25,00 %</td>
      <td>1</td>
      <td>6,00</td>
      <td>800,00</td>
      <td class="name?ajax_sent">
        <input data-val="true" data-val-required="The Sendt field is required." id="Collection_0__Sent" name="Collection[0].Sent" type="checkbox" value="true" />
        <input name="Collection[0].Sent" type="hidden" value="false" />
      </td>
      <td class="name?ajax_payed">
        <input data-val="true" data-val-required="The Betalt field is required." id="Collection_0__Payed" name="Collection[0].Payed" type="checkbox" value="true" />
        <input name="Collection[0].Payed" type="hidden" value="false" />
      </td>
    </tr>
    <tr>
      <td class="name?ajax_invoice_id">36</td>
      <td>25-10-2015 18:54:35</td>
      <td>25-10-2015 00:00:00</td>
      <td>25-10-2015 00:00:00</td>
      <td>6400,00</td>
      <td>8000,00</td>
      <td>1600,00</td>
      <td>25,00 %</td>
      <td>1</td>
      <td>8,00</td>
      <td>800,00</td>
      <td class="name?ajax_sent">
        <input data-val="true" data-val-required="The Sendt field is required." id="Collection_1__Sent" name="Collection[1].Sent" type="checkbox" value="true" />
        <input name="Collection[1].Sent" type="hidden" value="false" />
      </td>
      <td class="name?ajax_payed">
        <input data-val="true" data-val-required="The Betalt field is required." id="Collection_1__Payed" name="Collection[1].Payed" type="checkbox" value="true" />
        <input name="Collection[1].Payed" type="hidden" value="false" />
      </td>
    </tr>
  </tbody>
</table>

【讨论】:

  • 我总是发现知道问题发生的原因很有用,而不是仅仅找到不同的解决方案。另一个答案是转到该行然后获取其所有单元格。因此绕过您使用兄弟姐妹的问题。两者都有效:)
【解决方案2】:

更新

$('table input[type=checkbox]').on('change', function() {
  var _invoice_id = 'not found',
    _payed = 'not found',
    _sent = 'not found',
    $this = $(this);

  $this.closest('tr').children('td').each(function() {
    var $this = $(this);

    if ($this.hasClass('name?ajax_invoice_id')) {
      _invoice_id = $(this).text();
    }
    if ($this.hasClass('name?ajax_payed')) {
      _payed = $(this).children('input[type=checkbox]').prop('checked');
    }
    if ($this.hasClass('name?ajax_sent')) {
      _sent = $(this).children('input[type=checkbox]').prop('checked');
    }
  });

  alert('invoice_id: ' + _invoice_id + '\r\npayed: ' + _payed + '\r\nsent: ' + _sent);
});

jsfiddle

【讨论】:

  • 感谢 Mehdi,但你的小提琴只是在我点击的那个上给了我“未找到”
【解决方案3】:

检查以下解决方案将解决您的问题并确保兄弟姐妹具有您所期望的课程

$(document).ready(function () {
    $("input[type='checkbox']").on('change', function () {
        var $parent = $(this).parent("td");
        var _invoice_id= $parent.siblings("td.name\\?ajax_invoice_id").html();

        var _payed="";
        if ($parent.hasClass("name?ajax_payed")) {
           _payed = this.checked;
        } else {
           _payed = $parent.siblings("td.name\\?ajax_payed").find("input[type='checkbox']").is(":checked");
        }
        var _sent="";
        if ($parent.hasClass("name?ajax_sent")) {
           _sent = this.checked;
        } else {
           _sent = $parent.siblings("td.name\\?ajax_sent").find("input[type='checkbox']").is(":checked");
        }




         alert('invoice_id: ' + _invoice_id + '\r\npayed: ' + _payed + '\r\nsent: ' + _sent);
    });
});  

【讨论】:

  • 我复制了您的脚本,但它仍然是相同的 - 在我单击的复选框上未定义。
  • 嗯,我不明白 - 仍然不确定.. 我尝试了 ie,ff 和 chrome。它对你有用吗?
  • 是的,它对我来说很好用...你在 jsfiddle 中是否未定义?
  • 是的。什么血腥......哦,我发现我可以使用 eventarg 和目标值。不过还是感谢您的帮助
  • 我们不想遍历兄弟姐妹,请查看此解决方案jsfiddle.net/naveencgr/Lecbrhbd/2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
相关资源
最近更新 更多