【问题标题】:Make an action after two events happened - JS在两个事件发生后采取行动 - JS
【发布时间】:2021-11-08 06:11:20
【问题描述】:

想要在电子邮件验证和复选框标记后更改提交按钮颜色。添加了有关更改的侦听器,它们运行良好。但是不知道如何找出这个事件何时会发生以启动函数什么会改变提交按钮的颜色。

```
https://jsfiddle.net/nvologdins/brfj2xk1/
```

【问题讨论】:

  • 请注意,他们也可以取消选中该框或使他们的电子邮件再次无效。理想情况下,监听这两个事件,然后您可以将全局变量设置为 true,但如果无效,请确保设置为 false。最后,对于任一事件,调用一个函数来检查两者是否为真,然后切换提交按钮的颜色。

标签: javascript asynchronous


【解决方案1】:

这是一个基本示例,说明如何执行此操作。

如果用户再次更改值,我还稍微更改了逻辑以更新值。 - @Ultimater 也提到了这一点。


function setupButton() {
  if (validEmail && validCheckbox) {
    // add/show/enable submit button or simply change the color
    button.style.color = "red";
  } else {
    // remove/hide/disable submit button revert the changes
    button.style.color = "";
  }
}
form.input.addEventListener('input', (event)=>{
  validEmail = emailRegex.test(event.target.value);
  setupButton();
})
form.checkbox.addEventListener('change', (event)=>{
  validCheckbox = event.target.checked;
  setupButton();
})

我还建议使用 Constraint Validation API 验证表单的不同方法。

每个元素都有一个有效性检查,可以使用formElement.checkValidity() 在表单元素上轻松访问,如果表单内的所有(必需)字段都填充了有效值,则返回真/假。

<form oninput="this.querySelector('#submitButton').disabled = !this.checkValidity();" onsubmit="event.preventDefault(); console.log('Submit prevented but the form seems to be valid.'); return false;">
  <fieldset>
    <label for="newslettermail">E-Mail</label>
    <!-- you could also define a more specific pattern on the email input since email would allow foo@bar as valid mail -->
    <input type="email" id="newslettermail" required>
  </fieldset>
  <fieldset>
    <input type="checkbox" id="newsletterAcceptTos" required>
    <label for="newsletterAcceptTos">I accept the Terms of Service</label>
  </fieldset>
  <fieldset>
    <label for="textFieldWithPattern">Enter <strong>foo</strong> or <strong>bar</strong></label>
    <input type="text" id="textFieldWithPattern" pattern="^(foo|bar)$" required>
  </fieldset>
  <button type="submit" id="submitButton" disabled>Submit</button>
  <button type="submit">Force submit (will show errors on invalid input)</button>
</form>

使用它,浏览器自己会检查这些值是否包含有效值。

  • 带有必需标志的input[type=email] 必须包含有效的邮件地址。
  • 必须选中带有必需标志的复选框。
  • 带有 required 和模式的 input 必须包含与模式属性中的正则表达式匹配的值。

【讨论】:

  • 他的代码确实包含一个提交按钮。只是他没有把价值放在里面。
【解决方案2】:

无需创建额外的变量并分别监听两个表单元素...您只需监听form 元素即可检查整个内容并进行相应更新

let form = document.querySelector('form');
let input = document.getElementById('input');
let checkbox = document.getElementById('checkbox');
let submit = document.getElementById('button');

const emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

form.addEventListener('change', (event) => {
  if (checkbox.checked && emailRegex.test(input.value)) {
    submit.style.color = "red";
  } else {
    submit.style.color = "black"
  }
})

//Update
input.addEventListener('input', () => {
  const changeEvent = new Event('change');
  form.dispatchEvent(changeEvent)
})
<form class="main__emailAndTerms emailAndTerms">
  <div class="emailAndTerms__email">
    <input type="text" id="input" placeholder="Type your email address here...">
    <label class="emailAndTerms__terms">I agree to <a href="#"><span class="terms__link">terms of service</span></a>
                <input type="checkbox" class="terms__checkbox" id="checkbox">
                <span class="terms__checkbox_custom"></span>
            </label>
    <button type="submit" class="email__submitButton" id="button">Submit</button>
  </div>
</form>

【讨论】:

  • 如果您先检查 TOS 内容,然后填写邮件并按 Enter,这将失败。你需要输入事件。
  • change 事件对两者都有效,但他们需要先取消文本字段的焦点。虽然红色通常用于表示问题。如果这是您用来表示有效的颜色,它将使用户感到困惑。
  • @Ultimater 已更新我的代码,现在它可以在您更改输入时工作。
猜你喜欢
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
相关资源
最近更新 更多