如何将原版 JavaScript onchange select 输入事件代码重写为 OOP JavaScript?[关闭]

How can be rewritten the vanilla JavaScript onchange select input event code to OOP JavaScript? [closed]

提问人:Ron 提问时间:11/17/2023 最后编辑:BarmarRon 更新时间:11/17/2023 访问量:24

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

2天前关闭。

初始代码是一个普通的 js 函数,它侦听 select 标签的 change 事件处理程序。通过在 select 中选择一个特定的选项,使用 Switch js 案例,启动了一个特殊的逻辑,基本上这个逻辑是设置一个空字符串,或者一个数组,或者其他任何东西。所以我想知道有没有办法将逻辑重写为 OOP JavaScript 类。我屁股 因此,无需重写每个功能......主要是为了帮我看清基本的逻辑架构。谢谢

// init variables
const formSelect = document.querySelector('.form-select')
const fromInput = document.querySelector('.from-input')
const toInput = document.querySelector('.to-input')
const textFieldFrom = document.querySelector('.text-field-from')
const textFieldTo = document.querySelector('.text-field-to')

// init state
let fromInputValue = ''
let toInputValue = ''
let range = []

function setAllFieldsHidden() {
  toInput.style.display = 'none';
  textFieldFrom.style.display = 'none';
  textFieldTo.style.display = 'none';
  fromInput.style.display = 'none';
}

function setSingleDateFieldBlock() {
  toInput.style.display = 'none';
  textFieldFrom.style.display = 'none';
  textFieldTo.style.display = 'none';
  fromInput.style.display = 'block';
}

function setAllDateFieldsBlock() {
  textFieldFrom.style.display = 'none';
  textFieldTo.style.display = 'none';
  fromInput.style.display = 'block';
  toInput.style.display = 'block';
}

function setSingeTextFieldBlock() {
  fromInput.style.display = 'none';
  toInput.style.display = 'none';
  textFieldTo.style.display = 'none';
  textFieldFrom.style.display = 'block';
}

function setAllTextFieldsBlock() {
  fromInput.style.display = 'none';
  toInput.style.display = 'none';
  textFieldFrom.style.display = 'block';
  textFieldTo.style.display = 'block';
}

formSelect.addEventListener("change", function() {

  let selectedOption = formSelect.options[formSelect.selectedIndex].value;


  switch (formSelect.value) {
    case 'yesterday':
      setAllFieldsHidden();
      let currentDateY = new Date()
      let yesterdayD = new getDate(currentDateY)
      yesterdayD.setDate(yesterdayD.getDate() - 1)
      formSelect.value = yesterdayD

      break

    case 'today':
      setAllFieldsHidden();
      formSelect.value = new Date().getDate()
      break

    case 'tomorrow':
      setAllFieldsHidden();

      let currentDateT = new Date()
      let yesterday = new getDate(currentDateT)
      yesterday.setDate(yesterday.getDate() + 1)
      formSelect.value = yesterday
      break

    case 'recentWeek':
      setAllFieldsHidden();

      let todayR = new Date();
      let currentDayOfWeek = today.getDay();
      let diff = today.getDate() - currentDayOfWeek;
      let recentWeekDates = [];
      for (let i = 1; i < 8; i++) {
        let tempDate = new Date(todayR);
        tempDate.setDate(diff + i);
        recentWeekDates.push(tempDate);
      }
      formSelect.value = recentWeekDates
      break

    case 'previousWeek':
      setAllFieldsHidden();

      let todayP = new Date();
      let startOfPreviousWeek = new Date(todayP);
      startOfPreviousWeek.setDate(startOfPreviousWeek.getDate() - 7);
      let previousWeekDates = [];
      for (let i = 0; i < 7; i++) {
        let tempDate = new Date(startOfPreviousWeek);
        tempDate.setDate(startOfPreviousWeek.getDate() + i);
        previousWeekDates.push(tempDate);
      }
      formSelect.value = previousWeekDates
      break

    case 'recentMonth':
      setAllFieldsHidden();

      let todayM = new Date();
      todayM.setDate(1);
      let recentMonthDates = [];
      while (todayM.getMonth() === new Date().getMonth()) {
        recentMonthDates.push(new Date(todayM));
        todayM.setDate(todayM.getDate() + 1);
      }
      formSelect.value = recentWeekDates
      break

    case 'previousMonth':
      setAllFieldsHidden();

      let todayPm = new Date();
      let firstDayOfCurrentMonth = new Date(today.getFullYear(), todayPm.getMonth(), 1);
      let lastDayOfPreviousMonth = new Date(firstDayOfCurrentMonth);
      lastDayOfPreviousMonth.setDate(0);
      let previousMonthDates = [];
      for (let i = 1; i <= lastDayOfPreviousMonth.getDate(); i++) {
        let tempDate = new Date(lastDayOfPreviousMonth);
        tempDate.setDate(i);
        previousMonthDates.push(tempDate);
      }
      formSelect.value = previousMonthDates
      break

    case 'recentQuarter':
      setAllFieldsHidden();

      let todayRq = new Date();
      let currentYear = todayRq.getFullYear();
      let currentMonth = todayRq.getMonth();
      let currentQuarter = Math.floor(currentMonth / 3) + 1;
      let startDate = new Date(currentYear, (currentQuarter - 1) * 3, 1);
      let endDate = new Date(currentYear, currentQuarter * 3, 0);
      let actualQuarterDates = [];
      for (let date = new Date(startDate); date <= endDate; date.setDate(date.getDate() + 1)) {
        actualQuarterDates.push(new Date(date));
      }
      formSelect.value = recentWeekDates
      break

    case 'last7Days':
      setAllFieldsHidden();

      let todayLse = new Date();
      let lastSevenDaysDates = [];
      for (let i = 6; i >= 0; i--) {
        let tempDate = new Date(todayLse);
        tempDate.setDate(today.getDate() - i);
        lastSevenDaysDates.push(tempDate);
      }
      formSelect.value = lastSevenDaysDates
      break

    case 'last30Days':
      setAllFieldsHidden();

      let todayLt = new Date();
      let lastThirtyDaysDates = [];
      for (let i = 29; i >= 0; i--) {
        let tempDate = new Date(todayLt);
        tempDate.setDate(today.getDate() - i);
        lastThirtyDaysDates.push(tempDate);
      }
      formSelect.value = lastThirtyDaysDates
      break

    case 'last60Days':
      setAllFieldsHidden();

      let todayLs = new Date();
      let lastSixtyDaysDates = [];
      for (let i = 59; i >= 0; i--) {
        let tempDate = new Date(todayLs);
        tempDate.setDate(todayLs.getDate() - i);
        lastSixtyDaysDates.push(tempDate);
      }
      formSelect.value = lastDaysDates
      break

    case 'last90Days':
      setAllFieldsHidden();

      let todayLn = new Date();
      let lastNinetyDaysDates = [];
      for (let i = 89; i >= 0; i--) {
        let tempDate = new Date(todayLn);
        tempDate.setDate(today.getDate() - i);
        lastNinetyDaysDates.push(tempDate);
      }
      formSelect.value = lastNinetyDaysDates
      break

    case 'lastNumberOfDays':
      setSingeTextFieldBlock();

      textFieldFrom.addEventListener("change", event => {
        fromInputValue = event.target.value

        for (let i = 0; i < fromInputValue; i++) {
          let previousDate = new Date(currentDate);
          previousDate.setDate(currentDate.getDate() - i);
          range.push(previousDate);
        }
        range.reverse();
      })
      break

    case 'nextNumberOfDays':
      setSingeTextFieldBlock();

      textFieldFrom.addEventListener("change", event => {
        fromInputValue = event.target.value

        for (let i = 0; i < fromInputValue; i++) {
          let previousDate = new Date(currentDate);
          previousDate.setDate(currentDate.getDate() + i);
          range.push(previousDate);
        }
        range.reverse();
      })
      break

    case 'exactDate':
      setSingleDateFieldBlock()

      fromInput.addEventListener("change", event => {
        fromInputValue = event.target.value
      })
      break

    case 'range':
      setAllTextFieldsBlock()

      fromInput.addEventListener("change", event => {
        fromInputValue = event.target.value
      })
      toInput.addEventListener("change", event => {
        toInputValue = event.target.value
      })
      let currentDate = new Date(fromInputValue);
      while (currentDate <= toInputValue) {
        range.push(new Date(currentDate));
        currentDate.setDate(currentDate.getDate() + 1);
      }
      break

    default:
      console.log('else')
  }
});
<body>
  <div>
    <select class="form-select" id="example-select" name="example-select">
      <option selected="">Any date</option>
      <option value="yesterday">yesterday</option>
      <option value="today">today</option>
      <option value="tomorrow">tomorrow</option>
      <option value="recentWeek">recentWeek</option>
      <option value="recentMonth">recentMonth</option>
      <option value="recentQuarter">recentQuarter</option>
      <option value="last7Days">last7Days</option>
      <option value="last30Days">last30Days</option>
      <option value="last60Days">last60Days</option>
      <option value="last90Days">last90Days</option>
      <option value="lastNumberOfDays">lastNumberOfDays</option>
      <option value="nextNumberOfDays">nextNumberOfDays</option>
      <option value="exactDate">exactDate</option>
      <option value="range">range</option>
      <option value="previousWeek">previousWeek</option>
      <option value="previousMonth">previousMonth</option>
    </select>
    <input type="date" class="from-input" placeholder="Choose date" value="from">
    <input style="display: none;" type="text" class="text-field-from form-control" placeholder="Enter number">
    <input type="date" class="to-input form-control " placeholder="Till" value="to" />
    <input style="display: none;" type="text" class="text-field-to form-control" placeholder="Choose date">
  </div>

u

JavaScript oop 事件 switch-statement

评论


答: 暂无答案