You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何点击jQuery UI日期选择器时获取对应data-id并传至服务器

解决多个jQuery UI Datepicker获取对应容器data-id的问题

问题分析

你当前的代码有两个核心问题导致只能拿到第一个data-id:

  • 直接通过$('.calendar').data("id")获取的是第一个匹配到的.calendar元素的data-id,不会随点击的日期选择器变化。
  • HTML中存在重复的id="dateFrom"和id="dateTo",这违反了HTML的id唯一性规则,会导致jQuery选择器$('#dateFrom')只能选中第一个元素。

修复方案

我们需要针对每个.calendar容器单独初始化Datepicker,并在事件回调中动态获取当前日期选择器所属容器的data-id:

第一步:修正HTML的重复id问题

先把重复的id移除(或者改成唯一值,不过这里用类足够):

<div class="form-group row calendar" data-id="5799f281049ac12422000033">
 <div class="col-sm-4">
 <input type="text" class="form-control dateFrom hasDatepicker" name="dateFrom" placeholder="Arrival" readonly="">
 </div>
 <div class="col-sm-4">
 <input type="text" class="form-control dateTo hasDatepicker" name="dateTo" placeholder="Departure" readonly="">
 </div>
</div>
<div class="form-group row calendar" data-id="5799f281049ac12422000034">
 <div class="col-sm-4">
 <input type="text" class="form-control dateFrom hasDatepicker" name="dateFrom" placeholder="Arrival" readonly="">
 </div>
 <div class="col-sm-4">
 <input type="text" class="form-control dateTo hasDatepicker" name="dateTo" placeholder="Departure" readonly="">
 </div>
</div>
<div class="form-group row calendar" data-id="5799f281049ac12422000035">
 <div class="col-sm-4">
 <input type="text" class="form-control dateFrom hasDatepicker" name="dateFrom" placeholder="Arrival" readonly="">
 </div>
 <div class="col-sm-4">
 <input type="text" class="form-control dateTo hasDatepicker" name="dateTo" placeholder="Departure" readonly="">
 </div>
</div>

第二步:修改jQuery代码

遍历每个.calendar容器,为内部的日期选择器绑定Datepicker,并在回调中动态获取当前容器的data-id:

$(function() {
  // 遍历每个calendar容器,确保每个日期选择器绑定到所属容器的data-id
  $('.calendar').each(function() {
    var $currentCalendar = $(this);
    var containerDataId = $currentCalendar.data('id');
    
    // 初始化当前容器内的dateFrom选择器
    $currentCalendar.find('.dateFrom').datepicker({
      dateFormat: "dd.mm.y",
      onChangeMonthYear: function(year, month, inst) {
        // 生成当月第一天作为start_date(可根据你的实际需求调整)
        var start_date = $.datepicker.formatDate("dd.mm.y", new Date(year, month - 1, 1));
        
        $.ajax({
          url: '/availability',
          dataType: 'JSON',
          type: 'POST',
          async: false, // 注意:同步请求会阻塞UI,建议尽量改成异步
          data: { 
            dateFrom: start_date, 
            data_id: containerDataId 
          },
          success: function(response) {
            array = response.disableDates;
          }
        });
      }
    });
    
    // 初始化当前容器内的dateTo选择器
    $currentCalendar.find('.dateTo').datepicker({
      dateFormat: "dd.mm.y",
      onChangeMonthYear: function(year, month, inst) {
        var start_date = $.datepicker.formatDate("dd.mm.y", new Date(year, month - 1, 1));
        
        $.ajax({
          url: '/availability',
          dataType: 'JSON',
          type: 'POST',
          async: false,
          data: { 
            dateFrom: start_date, 
            data_id: containerDataId 
          },
          success: function(response) {
            array = response.disableDates;
          }
        });
      }
    });
  });
});

关键改动说明

  • 使用$('.calendar').each()遍历每个容器,确保每个日期选择器都绑定到所属容器的data-id。
  • 用$currentCalendar.find('.dateFrom')代替全局的$('#dateFrom'),彻底解决重复id导致的选择器错误。
  • 在回调中直接使用预先获取的containerDataId,也可以用$(this).closest('.calendar').data('id')动态获取,效果一致。
  • 补充了start_date的生成逻辑(如果你的需求不是当月第一天,可以根据业务场景调整)。

额外建议

  • 尽量避免使用async: false,同步AJAX请求会阻塞浏览器UI,影响用户体验,建议改成异步并调整逻辑。
  • 如果需要用返回的disableDates来禁用日期,记得在Datepicker的beforeShowDay回调中过滤这些日期。

内容的提问来源于stack exchange,提问作者Sarath TS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:36:45