【问题标题】:JQuery each(): index is always 0 [duplicate]JQuery each():索引始终为0 [重复]
【发布时间】:2016-03-13 20:36:29
【问题描述】:

我有一个 jquery .each() 嵌套在 Datatables action 函数中。我试图获取选中行的值(td),所以我想我使用传递给 each() 函数的索引并使用索引来选择行(tr)。索引始终为 0。我的方法似乎有缺陷,但这是一个开始。我需要选中行中的值。

var data = hesTable.$('input[type="checkbox"]:checked').each(function (index, element) {
                        var item = $(this);
                        alert(index);
                        alert('Row index: ' + item.index())
                        alert('Row index: ' + item.parent().index());
});

HTML (MVC)

<tbody>
            @if (Model.HesViewModels != null)
            {
                // Can't use the DisplayTemplate here because need to assign Data-* attributes
                //
                //foreach (var item in Model.HesViewModels)
                for (var i = 0; i < Model.HesViewModels.Count; i++)
                {
                    // Make sure Hes Service returns data
                    //
                    if (Model.HesViewModels[i] != null)
                    {
                        <tr>
                            <td>
                                @Html.CheckBoxFor(s => Model.HesViewModels[i].Process,
                                  new
                                  {                                      
                                      data_detailid = Model.HesViewModels[i].PartnerReferralDetailId,
                                      data_reasoncode = Model.HesViewModels[i].ReferralDetailReasonCode,
                                      data_statuscode = Model.HesViewModels[i].ReferralDetailStatusCode,
                                      data_outcomecode = Model.HesViewModels[i].ReferralDetailOutcomeCode
                                  })
                            </td>
                            <td>@Model.HesViewModels[i].PartnerReferralDetailId</td>
                            <td>@Html.TextBoxFor(m => Model.HesViewModels[i].ReferralDetailStatusCode)</td>
                            <td>@Html.TextBoxFor(m => Model.HesViewModels[i].ReferralDetailReasonCode)</td>
                            <td>@Html.TextBoxFor(m => Model.HesViewModels[i].ReferralDetailOutcomeCode)</td>
                        </tr>
                    }
                }
            }
        </tbody>

渲染的 HTML

<input data-detailid="1578441" data-outcomecode="154" data-reasoncode="9" data-statuscode="8" data-val="true" data-val-required="The Process field is required." id="HesViewModels_0__Process" name="HesViewModels[0].Process" type="checkbox" value="true" /><input name="HesViewModels[0].Process" type="hidden" value="false" />

【问题讨论】:

  • 您需要显示您的标记,但我想您在单独的容器中拥有input 元素,因此它们都是其父元素的第一个子元素,即index = 0
  • 我有一些猜测关于您的问题可能是什么,但我无法确定,因为您没有提供重现该问题的示例。
  • “我认为我使用了传递给 each() 的索引” index.each(function(index, element){}) 似乎没有被使用?
  • @guest271314...当我缩写代码时,我把它剪掉了——它又回来了

标签: javascript jquery asp.net-mvc datatables


【解决方案1】:

尝试使用选择器"table tr:has(:checked)" 仅选择具有input 元素的tr,其中checkedtrue。方法迭代 tr 元素而不是 input 元素,以避免需要在 .each() 中选择父元素

$("table tr:has(:checked)").each(function(index, element) {
  console.log($(this).index())
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<table>
  <tbody>
    <tr>
      <td>
        <input type="checkbox" />
      </td>
    </tr>
    <tr>
      <td>
        <input type="checkbox" checked />
      </td>
    </tr>
    <tr>
      <td>
        <input type="checkbox" checked />
      </td>
    </tr>
  </tbody>

【讨论】:

  • @BigDaddy “试图获取选中行的值(td)” 哪些值?可以在 Question 中包含呈现的html 吗?
  • 我添加了渲染的html
  • 我在 Datatables 表中工作,您的建议有效吗?
  • @BigDaddy “在 Datatables 表中工作,所以你的建议有效吗?” 应该返回预期结果。尝试在 stacksn-ps 使用 js 进行检查?
【解决方案2】:

因为 index() 是基于兄弟姐妹的。并非页面上的所有复选框。所以使用行的索引。

item.closest("tr").index()

如果你想得到 tds,那么你真的不需要 index()

item.closest("tr").find("td")

【讨论】:

  • 这假定该行的其他表格单元格中没有复选框。哎呀,你甚至都不知道他在用桌子。
  • 问题中写着 TD...
  • @BenjaminGruenbaum 哦,看看那个......一张桌子。
  • @epascarello...我正在使用您的代码获取索引,但不完全理解为什么。我应该使用这个索引来获取行值还是有更好的方法?谢谢
  • 正如我所说的 index() 获取相对于兄弟姐妹的索引。您的复选框位于 TD 中,因此没有兄弟姐妹。如果您想获得复选框所在的 tr,请使用最接近的爬上父母直到它与选择器匹配。
猜你喜欢
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 2011-05-19
  • 2013-05-29
  • 2013-04-03
相关资源
最近更新 更多