Joestar.Xu 发表于 2024-9-3 09:17:35

如何限制日期选择器时间范围

在软件开发和网页设计中,日期选择器是一个常用的工具,它为用户提供了一种方便的方式来选择日期。然而,在某些情况下,我们可能需要限制日期选择器的时间范围,以满足特定的业务需求。

在本文中,我将介绍一种通过事件实现的方法,供大家参考。

SpreadJS中,我们可以通过获取单元格的样式信息来判断当前的单元格是否为日期选择器:

sheet.getStyle(row, col).cellButtons.command === "openDateTimePicker"

如果是日期选择器我们才会进行下一步的判断,比如当选择的时间小于当前的时间时,我们会告诉用户不允许修改,因为选择的日期不得遭遇当前时间,逻辑如下:

if (newDate < Date.now()) {
let cell = sheet.getCell(row, col);
cell.value(info.oldValue);
alert("非法修改,日期不得早于当前时间!");
}

然后我们将以上两个部分组合在CellChanged事件中:

sheet.bind(GC.Spread.Sheets.Events.CellChanged, function (e, info) {
if (!info.isUndo) {
    let row = info.row;
    let col = info.col;
    if (
      sheet.getStyle(row, col).cellButtons.command === "openDateTimePicker"
    ) {
      let newDate = info.newValue;
      console.log(newDate);
      if (newDate < Date.now()) {
      let cell = sheet.getCell(row, col);
      cell.value(info.oldValue);
      alert("非法修改,日期不得早于当前时间!");
      }
    }
}
});

但是由于修改的逻辑(cell.value())存在于CellChanged事件中,若不加干预,则会变成一个死循环,要调整此处的逻辑,需要先关闭事件响应机制,等修改的逻辑执行完,再开启事件响应机制。

完整代码如下:

window.onload = async () => {
let ifDesigner = true;
let designer, spread, sheet;

if (ifDesigner) {
    let designerConfig = JSON.parse(
      JSON.stringify(GC.Spread.Sheets.Designer.DefaultConfig)
    );

    designer = new GC.Spread.Sheets.Designer.Designer(
      "gc-designer-container",
      designerConfig
    );

    spread = designer.getWorkbook();
} else {
    spread = new GC.Spread.Sheets.Workbook(
      document.getElementById("gc-designer-container"),
      { sheetCount: 1 }
    );
}

sheet = spread.getActiveSheet();

window.designer = designer;
window.spread = spread;
window.sheet = sheet;

sheet.bind(GC.Spread.Sheets.Events.CellChanged, function (e, info) {
    if (!info.isUndo) {
      let row = info.row;
      let col = info.col;
      if (
      sheet.getStyle(row, col).cellButtons.command === "openDateTimePicker"
      ) {
      let newDate = info.newValue;
      console.log(newDate);
      if (newDate < Date.now()) {
          let cell = sheet.getCell(row, col);

          sheet.suspendEvent();
          cell.value(info.oldValue);
          sheet.resumeEvent();

          alert("非法修改,日期不得早于当前时间!");
      }
      }
    }
});
};

页: [1]
查看完整版本: 如何限制日期选择器时间范围