为什么jQuery的:在我的代码中包含了意外的计数?

时间:2015-06-08 18:57:47

标签: javascript jquery jquery-selectors

我有一个带两个参数的函数:第一个是要计数的字符串,第二个是HTML元素的id,其中函数应该计算该字符串的出现次数。

function countString(searchString, elementToSearchIn) {
    return $("#"+elementToSearchIn+" *:contains("+searchString+")").length;
    // In this example, call will be $("#searchElement *:contains('Apple')").length;
}

<table id="searchElement" border="1">
  <tr>
    <th>Apple</th>
    <th>Apple</th>
    <th>Banana</th>
  </tr>
  <tr>
    <td>Apple</td>
    <td>Orange</td>
    <td>Banana</td>
  </tr>
</table>

我设置了一个小问题来证明问题:例如,我的table中有三次“Apple”,但countString返回6。

为什么我的功能没有返回正确的计数?

  

https://jsfiddle.net/v10swbff/

2 个答案:

答案 0 :(得分:3)

问题是*:contains匹配TD,TH AND TR。因此它计数为6(每个TR一个,然后是预期的TH和TD计数)。为了解决这个问题,你可以像这样分别检查TH和TD:

function countString(searchString, elementToSearchIn) {
    var thCount = $("#"+elementToSearchIn+" th:contains("+searchString+")").length;
    var tdCount = $("#"+elementToSearchIn+" td:contains("+searchString+")").length;
    return thCount + tdCount;
}

更新了JSFiddle:https://jsfiddle.net/v10swbff/1/

答案 1 :(得分:0)

正如Cymen所说,在搜索中匹配tr元素。我建议你可以使用另一个功能:

function countString(searchString, elementToSearchIn) {
    return $("#"+elementToSearchIn+" tr>*:contains("+searchString+")").length;
}

只需添加'tr&gt;'你只能找到th和td。 :)