【问题标题】:getElementsByClassName plus a value filter of the data inside this element?getElementsByClassName 加上这个元素内数据的值过滤器?
【发布时间】:2022-01-15 22:18:47
【问题描述】:

我需要为函数添加过滤器。

我在页面中有不同的元素,类为 a-text-center table-border,但我需要代码仅在元素值大于 1 时才能工作,因此其他元素不会受到脚本的影响。

我无法在代码中添加任何内容,例如 ID 或任何其他元素以将其与其他元素区分开来,因此区分它的唯一方法是使用该元素内数字的value

元素示例:

<td class="a-text-center table-border">4</td>

在这种情况下,值为4

这是脚本:

$(document).ready(function() {
  var x = (document).getElementsByClassName('a-text-center table-border');
  for (var i = 0; i < x.length; i++)
    x.item(i).className += " bordertopred";

【问题讨论】:

  • 为什么document在括号中?
  • 为什么if 语句在这里不起作用?

标签: javascript jquery contains getelementsbyclassname


【解决方案1】:

首先,请注意td 元素没有value。您要阅读的是元素的innerText。这可以在从 DOM 中选择必要的元素后使用filter() 来完成。

还请注意,如果您在页面中包含 jQuery,您也可以使用它来完成您需要的工作。下面是两个版本的代码,一个使用 jQuery,另一个使用纯 JS。

首先是普通的 JS:

document.addEventListener('DOMContentLoaded', () => {
  let valueToMatch = '4';
  let elements = Array.from(document.querySelectorAll('.a-text-center.table-border')).filter(el => el.innerText.trim() === valueToMatch);
  elements.forEach(el => el.classList.add("bordertopred"));
});
td {
  padding: 10px; 
}
.bordertopred {
  background-color: #CC0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<table>
  <tr>
    <td class="a-text-center table-border">1</td>
    <td class="a-text-center table-border">2</td>
    <td class="a-text-center table-border">3</td>
    <td class="a-text-center table-border">4</td>
  </tr>
</table>

这将是 jQuery 等价物:

jQuery($ => {
  let valueToMatch = '4';
  $('.a-text-center.table-border').filter((i, el) => el.innerText.trim() === valueToMatch).addClass('bordertopred');
});
td {
  padding: 10px; 
}
.bordertopred {
  background-color: #CC0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<table>
  <tr>
    <td class="a-text-center table-border">1</td>
    <td class="a-text-center table-border">2</td>
    <td class="a-text-center table-border">3</td>
    <td class="a-text-center table-border">4</td>
  </tr>
</table>

【讨论】:

  • "从 getElementsByClassName() 返回的集合没有 items() 方法。" 不,它不是复数,但 HTMLCollection#item() 确实存在。
  • @VLAZ 非常好 - 我会更新答案
  • "应该是 item()." 这就是 OP 已经使用的...
  • "getElementsByClassName() 只接受一个类" - it does work with multiple ones。我仍然会在这里建议querySelectorAll,因为它更清晰,但当前代码没有错。
  • @VLAZ 我很确定这个问题在我回答时被忍者编辑了,因为 OP 添加了关于“值”实际上是 td 单元格文本的注释。我再次编辑了问题,以便更清楚地解释原始问题
【解决方案2】:

我不明白。 不能在函数中添加if 语句?

<script>
$(document).ready(function(){
    var x = (document).getElementsByClassName('a-text-center table-border');
for(var i = 0; i < x.length; i++) {
   if (i > 1)
     x.item(i).className += " bordertopred";
}
</script>

我也倾向于使用x.item(i).className.add('yourclass');

【讨论】:

  • 如果我没记错的话,这只会跳过数组中的第一个元素。你的 if 语句应该检查每个元素的 value 属性而不是索引。
  • 我真的很喜欢 "if" 选项,但是,它不起作用,代码仍在将类添加到与 className 匹配的任何 td 中,它不仅限于指定的 innerText。如果我们将工作限制为仅 innerText = 4 呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
相关资源
最近更新 更多