【问题标题】:How to change multiple table rows' dates with one start date如何使用一个开始日期更改多个表格行的日期
【发布时间】:2017-10-13 07:51:32
【问题描述】:

现在,当在每一行中选择开始日期并单击确定时,将相应显示结束日期。所以每个表格行都必须手动点击一个按钮来显示结束日期。

我想知道是否有可能如果我只选择一个开始日期并单击确定, 不仅会显示第一行结束日期,还会根据间隔天数自动显示第 2、3... 等行的 start dateend date

PS:请注意,行数是动态的,来自数据库,总行数未知。

任何想法将不胜感激。谢谢!!

(function($, window, document, undefined){

  $(".addSkip").click(function() {
    // row instance to use `find()` for the other input classes
    var $row = $(this).closest('tr');

    var date = new Date($row.find(".start_date").val()+" 0:00:00"),
        days = parseInt($row.find(".days").val(), 10);
    
    console.log(date.getDate());
    console.log(days);

    if (!isNaN(date.getTime())) {
      date.setDate(date.getDate() + days);

      $row.find(".end_date").val(date.toInputFormat());
    } else {
      alert("Invalid Date");
    }
  });

  Date.prototype.toInputFormat = function() {
    var yyyy = this.getFullYear().toString();
    var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based
    var dd  = this.getDate().toString();
    return yyyy + "-" + (mm[1]?mm:"0"+mm[0]) + "-" + (dd[1]?dd:"0"+dd[0]); // padding
  };
})
(jQuery, this, document);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<table>
<th>
start</th>

<th>end</th>
<th>interval</th>
  <tr>
    <td><input type="date" size="15" name="date[]" class="start_date" \>
      <input type="button" size="10" value="ok" class="addSkip"></td>
    <td><input type="text" size="15" name="nextdate[]" class="end_date"  \> </td>
  <td><input type="text" size="3" name="skip[]" class="days" value="10"> </td>

  </tr>
  
  <tr>
   <td><input type="date" size="15" name="date[]" class="start_date" \>
      <input type="button" size="10" value="ok" class="addSkip"></td>
    <td><input type="text" size="15" name="nextdate[]" class="end_date"  \> </td>
  <td><input type="text" size="3" name="skip[]" class="days" value="10"> </td>
  </tr>
   <tr>
    <td><input type="date" size="15" name="date[]" class="start_date" \>
      <input type="button" size="10" value="ok" class="addSkip" ></td>
    <td><input type="text" size="15" name="nextdate[]" class="end_date"  \> </td>
<td><input type="text" size="3" name="skip[]" class="days" value="10">
 
  </tr>
</table>

想要的结果

 start            end            interval
 13/10/17       20/10/17          7
 20/10/17       23/10/17          3
 23/10/17       30/10/17          7

…… 等等

【问题讨论】:

  • 您希望所有行都显示相同的结束日期吗?还是所有 end 都必须显示相对 start 对应的值?
  • 我已经用表格更新了问题,请看一下,谢谢
  • 所以,您希望在第一个 start_date 中插入一个日期为 2017-01-01(例如),脚本详细说明相对 end_date 并将另一个 start_date 设置为 2017-01-02, 2017- 01-03 等详细说明每个 end_date,对吧?
  • 没错!

标签: javascript jquery


【解决方案1】:

我删除了“确定”按钮以支持更简单的更改事件(在 date_start 和 days 上)并添加了您需要的逻辑!如果有不清楚的地方,不要要求澄清;)

(function($, window, document, undefined){
$('input.start_date, input.days').on('change',function() {
    var $row = $(this).closest('tr'),
      $start = $row.find('.start_date'),
      $end = $row.find('.end_date'),
      $other = $row.find('.otherfield'),
      $interval = $row.find('.days'),
      date = new Date($start.val()+" 0:00:00"),
        days = parseInt($interval.val(), 10);
    
    console.log(date.getDate());
    console.log(days);

    if (!isNaN(date.getTime())) {
      date.setDate(date.getDate() + days);

      $end.val(date.toInputFormat());
      $other.val(date.toInputFormat());
      $row.next('tr')
        .find('.start_date').val(date.toInputFormat()).trigger('change');
    } else {
      console.log("Invalid Date");
    }
  });

  Date.prototype.toInputFormat = function() {
    var yyyy = this.getFullYear().toString();
    var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based
    var dd  = this.getDate().toString();
    return yyyy + "-" + (mm[1]?mm:"0"+mm[0]) + "-" + (dd[1]?dd:"0"+dd[0]); // padding
  };
})
(jQuery, this, document);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<table>
  <thead>
  <tr>
    <th>start</th>
    <th>end</th>
    <th>other</th>
    <th>interval</th>
  </tr>
  </thead>
  <tbody>
    <tr>
      <td><input type="date" size="15" name="date[]" class="start_date" \>
      <td><input type="text" size="15" name="nextdate[]" class="end_date"  \> </td>
      <td><textarea class="otherfield"></textarea></td>
      <td><input type="text" size="3" name="skip[]" class="days" value="10"> </td>
    </tr>

    <tr>
      <td><input type="date" size="15" name="date[]" class="start_date" \>
      <td><input type="text" size="15" name="nextdate[]" class="end_date"  \> </td>
      <td><textarea class="otherfield"></textarea></td>
      <td><input type="text" size="3" name="skip[]" class="days" value="10"> </td>
    </tr>

     <tr>
      <td><input type="date" size="15" name="date[]" class="start_date" \>
      <td><input type="text" size="15" name="nextdate[]" class="end_date"  \> </td>
      <td><textarea class="otherfield"></textarea></td>
      <td><input type="text" size="3" name="skip[]" class="days" value="10"></td>
    </tr>
   </tbody>
</table>

【讨论】:

  • 问题是每一行的结束日期应该是下一行的开始日期。
  • 我已经更新了我的问题表,请看一下,谢谢你的帮助
  • ops,我的误解 :D 我已经修复了代码:现在每次更改 .start_date 或 .days 都会将更改传播到下一个开始日期;)
  • 你是一个真正的救生员,卡在那里很长一段时间,非常感谢你!
  • 显然可以,我已经以这种方式编辑了代码(并修复了一些 html 错误输入)
【解决方案2】:

在 jquery 中,您可以执行以下操作来查找多个元素:

$row.find("*[class^=".end_date"]")

更多详情请参考jquery selectors

【讨论】:

  • 试试$("[class=".end_date"]") 没有$row.find
猜你喜欢
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多