在 Javascript 中,如何在不进行硬编码和比较值的情况下检查 DOM 元素输入是否已更改?

In Javascript, how can I check that DOM elements input has changed without hardcoding and comparing values?

我有以下 StimulusJS controller that aims to track certain required elements (flatckpickr 个日期选择器)。

选择所有这些日期选择器的日期后,我必须启用表单中的提交按钮。

我在跟踪所有必需的输入都已由用户输入时遇到问题,并且由于这应该是一个可重复使用的控制器,我无法硬编码一个值并进行比较反对。

检查所有 requiredTargets 是否已收到用户输入的有效方法是什么?

import { Controller } from 'stimulus';

export default class extends Controller {
  static targets = ["required", "deactivable"];

  toggle(){
    this.deactivableTargets.toggleAttribute("disabled");
  }

  connect() {
    
    this.requiredTargets.forEach((element) => {

      element.addEventListener('input', (event) => {

        console.log(`${element} changed`);

        //if (this.requiredTargets.inputed?) {
          toggle();
        }
      })
    })
  }
}

从技术上讲,输入字段默认会有一个 value 空字符串 ("")

您可以使用JavaScript Array.every 方法检查所有必填字段是否已填写且不等于空字符串。

这将returntruefalse,根据具体情况,您可以调用toggle()方法

我的方法

input 事件上触发的每个 flatpickr HTML input element, connect a Stimulus action 方法。

在这种情况下我们称它为 handleInput,所以我们的 HTML 应该看起来像这样

<input
  data-<controller-name>-target="required"
  data-action="<controller-name>#handleInput"
  type="text"
  placeholder="Select Date.."
  data-input
>
<!-- replace <controller-name> with the actual stimulus controller name -->

接下来,像这样在控制器中定义 handleInput 方法

handleInput() {
  const isRequiredFilled = this.requiredTargets.every(el => el.value !== '');

  if (isRequiredFilled) {
    this.toggle();
  }
}

注意:输入元素有一个默认的输入事件,所以你不必自己处理。请参阅 documentation