【问题标题】:jQuery highlight row within specific timejQuery在特定时间内突出显示行
【发布时间】:2016-12-18 08:46:32
【问题描述】:

我试图在特定时间范围内突出显示一行。 所以实际上假设它是 10:00:00 并且我需要标记该行,如果时间在开始和结束日期行之间。

桌子:

<table class="table table-striped" id="timeTable">
  <thead>
    <th>Title</th>
    <th>Start</th>
    <th>End</th>
    <th>Channel</th>
  </thead>
  <tbody>
    <tr>
      <td>Title 1</td>
      <td class="dateRowStart">2016-08-10 09:00:00+02</td>
      <td class="dateRowEnd">2016-08-10 11:00:00+02</td>
      <td>Channel 1</td>
    </tr>
    <tr>
      <td>Title 2</td>
      <td class="dateRowStart">2016-08-10 09:30:00+02</td>
      <td class="dateRowEnd">2016-08-10 12:00:00+02</td>
      <td>Channel 3</td>
    </tr>
    <tr>
      <td>Title 4</td>
      <td class="dateRowStart">2016-08-10 13:00:00+02</td>
      <td class="dateRowEnd">2016-08-10 15:00:00+02</td>
      <td>Channel 4</td>
    </tr>
  </tbody>
</table>

dateformat 是我的 postgresql 数据库的输出。如果我能以我们的本地时间格式(10.08.2016 - 14:15:12)显示它们会很棒,但这不是我的主要问题。

我的(只完成了一半)js代码要突出显示:

<script>
$('#timeTable .dateRowStart').each(function () {
  var dtTd = new Date($(this).html());
  var dtNew = new Date();
  if (dtNew.getTime() < dtTd.getTime()) {
    $(this).parent('tr').addClass('highlight');
  } 
});

</script>

我不知道如何包含dateRowEnd 来检查日期是否仍在开始/结束时间之间。如果我使用两个相同的时间/日期和日期格式,例如。 “08/10/2016 10:05:00”,我只标记了一行。这是另一件烦人的事情。

谢谢!

【问题讨论】:

  • 您只是对时间感兴趣,还是对提供的特定日期的时间感兴趣?
  • 嗯,我不明白你的问题 :) 我需要突出显示该行,当 Starttime 是 = current Time
  • 我的意思是您的示例中的日期不同。今天是 8 月 11 日,你的日期是 10 日。
  • 我仍然不确定您要达到的目标,但希望这会有所帮助。请注意,我修改了在本地时区工作的最后日期:jsfiddle.net/zbz14uuo
  • @bingobear 在这种情况下,我的小提琴示例对你有用

标签: javascript jquery


【解决方案1】:

检查这个sn-p:

$(function() {
  $('#timeTable .dateRowStart').each(function() {
    var dtTdStart = new Date($(this).text());
    var dtTdEnd = new Date($($(this).siblings('.dateRowEnd')).text());


    var dtNew = new Date();


    if (dtNew > dtTdStart && dtNew < dtTdEnd) {
      $(this).parent('tr').addClass('highlight');
    }
    else{
      $(this).parent('tr').removeClass('highlight');
    }
  });

});
.highlight {
  color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table class="table table-striped" id="timeTable">
  <thead>
    <th>Title</th>
    <th>Start</th>
    <th>End</th>
    <th>Channel</th>
  </thead>
  <tbody>
    <tr>
      <td>Title 1</td>
      <td class="dateRowStart">2016-08-11 17:00:00+02</td>
      <td class="dateRowEnd">2016-08-11 19:00:00+02</td>
      <td>Channel 1</td>
    </tr>
    <tr class="highlight">
      <td>Title 2</td>
      <td class="dateRowStart">2016-08-11 17:30:00+02</td>
      <td class="dateRowEnd">2016-08-11 18:00:00+02</td>
      <td>Channel 3</td>
    </tr>
    <tr>
      <td>Title 4</td>
      <td class="dateRowStart">2016-08-11 13:00:00+02</td>
      <td class="dateRowEnd">2016-08-11 15:00:00+02</td>
      <td>Channel 4</td>
    </tr>
  </tbody>

【讨论】:

  • 你应该只选择具有结束日期类的兄弟姐妹 - 你不想要的行标题,我确实看到了 [1] 但是......我更喜欢明确的,以防他们添加新的 td 或某事
【解决方案2】:

使用moment.js,您可以做到--

$('#timeTable .dateRow').each(function () {
  var startTime = $(this).closest("tr").find(".dateRowStart") .text();
  var endTime = $(this).closest("tr").find(".dateRowEnd").text();
  if (moment().isBetween(startTime, endTime)) {
      $(this).addClass('highlight'); 
  } 
});

codepen -- http://codepen.io/anon/pen/OXAEAv

您也可以使用moment('orig date').format('MM/DD/YY HH:mm:ss')更改日期格式

【讨论】:

    【解决方案3】:

    你可以自己给&lt;tr&gt;标签添加一个类,然后这样做:

    HTML:

    <tbody>
      <tr class="dateRow">
        <td>Title 1</td>
        <td class="dateRowStart">2016-08-10 09:00:00+02</td>
        <td class="dateRowEnd">2016-08-10 11:00:00+02</td>
        <td>Channel 1</td>
      </tr>
      ...
    </tbody>
    

    jQuery:

    $('#timeTable').find('.dateRow').each(function () {
      var dtStart = new Date($(this).find(".dateRowStart").text());
      var dtEnd = new Date($(this).find(".dateRowEnd").text());
      var dtNew = new Date();
      if (dtNew >= dtStart && dtNew <= dtEnd) {
        $(this).addClass('highlight');
      } 
    });
    

    请注意,如果您对日期对象 as seen here 执行 ==!====!==,则只需使用 .getTime()

    编辑:正如@MarkSchultheiss 建议的那样,将$('#timeTable .dateRow') 分成$('#timeTable').find('.dateRow') 会略微提高效率。

    【讨论】:

    • 至于在页面上超过时间就去掉高亮,请看call a javascript function at a specific time of day。并将$(this) 传递到函数中,以便您可以引用它来调用.removeClass('highlight')
    • .text() 可能比.html() 更好,但这是一个折腾 - 也许不需要[0].?测试一下...
    • @MarkSchultheiss 好点,我没有意识到.text() 从它返回的字符串中过滤掉了 html。我还没有测试过[0],我假设因为我选择的类将作为数组返回。
    • Uncaught TypeError: $(...).find(...)[0].text is not a function - 如果您希望隔离,请在此处使用.eq(0)
    • 顺便说一句,$('#timeTable').find('.dateRow') 会稍微快一些,但这是一种微优化,只会出现在非常大的 DOM 上。这是由于嘶嘶声引擎处理的从右到左的功能。
    猜你喜欢
    • 2014-08-08
    • 2018-11-06
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    相关资源
    最近更新 更多