【问题标题】:How to use nth-child/type-of to change background colour based on user input?如何使用 nth-child/type-of 根据用户输入更改背景颜色?
【发布时间】:2020-12-29 18:48:21
【问题描述】:

我正在尝试根据用户输入更改表格单元格的背景。

如果用户输入 3 小时,时间为 10。那么我需要更改表格单元格 7-8、8-9、9-10 的背景以显示此范围。

这里是 HTML:

<thead>
  <tr>
   <th id="car">Car</th>
   <th id="7">7 - 8</th>
   <th id="8">8 - 9</th>
   <th id="9">9 - 10</th>
   <th id="10">10 - 11</th>
   <th id="11">11- 12</th>
   <th id="12">12 -13</th>
   <th id="13">13 - 14</th>
   <th id="14">14 - 15</th>
   <th id="15">15 - 16</th>
   <th id="16">16 - 17</th>
   <th id="exit_miles">Exit Miles</th>                            
  </tr>
</thead>
<tr id="car-1-test">
   <td id="car-1">Car 1</td>
   <td id="car-1-7" class="charging not_charging">Test</td>
   <td id="car-1-8" class="charging not_charging">Test</td>
   <td id="car-1-9" class="charging not_charging">Test</td>
   <td id="car-1-10" class="charging not_charging">Test</td>
   <td id="car-1-11" class="charging not_charging">Test</td>
   <td id="car-1-12" class="charging not_charging">Test</td>
   <td id="car-1-13" class="charging not_charging">Test</td>
   <td id="car-1-14" class="charging not_charging">Test</td>
   <td id="car-1-15" class="charging not_charging">Test</td>
   <td id="car-1-16" class="charging not_charging">Test</td>
   <td id="car-1-exit-miles">60</td>
</tr> 

到目前为止我所拥有的......


// Check how many hours are needed for charge 

function checkHours(){
  var lhours = $("#car-1-charge-needed").text();
  var ltime = $("#car-1-lt")
    $("#car-1-test > td:nth-child("+ ltime - lhours.val +")").css("background-colour", "blue");
}

// Generate time table 

$('#generate-time-table').click(function() {
 checkHours();
})

这里是完整代码的小提琴:https://jsfiddle.net/Coxy/bv5jct7n/6/

小提琴已更新。

为了澄清,用户输入的结果表明需要设置多少小时以及他们离开的时间。我需要在表格中显示这些时间在休假时间之前被排除在外。

EDIT** 更新了 JS 以显示正确的变量。谢谢安德烈亚斯。

我实际上认为这可能是错误的方法。我在想,如果我可以根据用户输入(充电所需的时间和离开的时间)将课程从不充电切换到充电,而不是尝试第 n 个孩子的方法,这可能会更好。我仍然不确定如何实现这一点,或者它是第 n 个孩子/类型是我将如何实现这一点。欢迎任何建议。

$(".generate").click(function() {
  var lvalue = Number(document.getElementById('time-input').value);
  var hoursneeded = document.getElementById('car-1-charge-needed').textContent;
  var timeTd = $('table_id_2 td[id$="-' + lvalue + '"]'),
      previousTds = timeTd.prevAll().slice(0, -1),
      numberOfHours = hoursneeded;
  $("table_id_2 td").removeClass("blocked");
  previousTds.slice(0, numberOfHours)
             .addClass("blocked");
             console.log(hoursneeded);
});

现在更新代码我认为没有错误,但我仍然没有得到想要的结果。

【问题讨论】:

  • 它的意思是从 lhours 中获取值(来自用户输入)并将其分配给具有该数值的 td 单元格。即用户输入 = 8,它从单元格编号 8 开始,然后从“需要的小时数”用户输入返回小时数。我可以看到这是不正确的重复。谢谢,我会修改的。

标签: jquery html-table css-selectors user-defined-functions


【解决方案1】:

您可以为此使用ends with ($=) selector.prevAll().slice() 的组合

首先找到id以给定时间结尾的&lt;td&gt;

var timeTd = $('table td[id$="-' + time + '"]')

然后抓取之前的所有 &lt;td&gt; 元素 (.prevAll()) 并使用 .slice() 删除第一个单元格(汽车名称)

var previousTds = timeTd.prevAll().slice(0, -1); /* the tds are in reverse order, hence the (0, -1) range */

我们现在必须选择要通过另一个 .slice() 调用“阻止”的元素数量

var tdsToBlock = previousTds.slice(0, numberOfHours);

工作示例:

$("select").on("change", function() {
  var timeTd = $('table td[id$="-' + this.value + '"]'),
      previousTds = timeTd.prevAll().slice(0, -1),
      numberOfHours = 2;

  $("table td").removeClass("blocked");

  previousTds.slice(0, numberOfHours)
             .addClass("blocked");
})
.blocked {
  background-color: yellow
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select>
  <option></option>
  <option value="8">8</option>
  <option value="9">9</option>
  <option value="10">10</option>
</select>

<table>
  <thead>
    <tr>
      <th id="car">Car</th>
      <th id="7">7 - 8</th>
      <th id="8">8 - 9</th>
      <th id="9">9 - 10</th>
      <th id="10">10 - 11</th>
      <th id="exit_miles">Exit Miles</th>
    </tr>
  </thead>
  <tbody>
    <tr id="car-1-test">
      <td id="car-1">Car 1</td>
      <td id="car-1-7" class="charging not_charging">Test</td>
      <td id="car-1-8" class="charging not_charging">Test</td>
      <td id="car-1-9" class="charging not_charging">Test</td>
      <td id="car-1-10" class="charging not_charging">Test</td>
      <td id="car-1-exit-miles">60</td>
    </tr>
  </tbody>
</table>

【讨论】:

  • 非常感谢您花时间向我解释这一点。你说的很有道理。我将尝试将您所说的内容应用到我的代码中。会告诉你这件事的进展的。再次感谢您。
  • 对不起,我已经实现了代码,但是当我单击生成按钮时它不起作用。我一定错过了什么,对不起。
  • 我已使用您的 sn-p 使用最新代码编辑了问题。
  • “它不起作用” 是有史以来最无用的错误描述;)您的问题中没有minimal reproducible example 可以使用。并且尝试调整 jsfiddle 上的完整示例对我来说超出了范围。
  • 大声笑对不起,我的错。仍然是 Stack 上的菜鸟。好的,所以当点击生成时间表按钮时,似乎没有做任何事情。我将“ $("select").on("change", function() {" 更改为 " $('#generate-time-table').click(function() { " 希望复制 sn-p 的内容确实。当我检查控制台时,它没有显示任何错误。我还添加了变量值“lvalue”。我会尝试找出更多来更好地解释。
猜你喜欢
  • 1970-01-01
  • 2016-11-10
  • 2012-03-07
  • 1970-01-01
  • 2021-08-29
  • 2021-05-10
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多