javascript - 为什么表格有效?
问题描述
如果表单被验证,为什么按钮不改变颜色?如果您打开表单并将其发送为空,则由于某种原因它被视为已验证,但如果您输入数据,然后将其删除,则会出现验证错误并且按钮不会发送数据(应该如此)
https://jsfiddle.net/qwertyzaqqq/vedhqLsu/12/
https://codepen.io/camobap6/pen/BaKBGJY
const showInputError = (formElement, inputElement, errorMessage, settings) => {
const errorElement = formElement.querySelector(`#${inputElement.name}-error`);
inputElement.classList.add(settings.inputErrorClass);
errorElement.classList.add(settings.errorClass);
errorElement.textContent = errorMessage;
}
const hideInputError = (formElement, inputElement, settings) => {
const errorElement = formElement.querySelector(`#${inputElement.name}-error`);
inputElement.classList.remove(settings.inputErrorClass);
errorElement.classList.remove(settings.errorClass);
errorElement.reset();
}
const hasInvalidInput = (inputList) => {
return inputList.some((inputElement) => {
return !inputElement.validity.valid;
});
}
const toggleButtonState = (inputList, buttonElement, settings) => {
if (hasInvalidInput(inputList)) {
buttonElement.classList.add(settings.inactiveButtonClass);
buttonElement.disabled = true;
} else {
buttonElement.classList.remove(settings.inactiveButtonClass);
buttonElement.disabled = false;
}
}
const checkInputValidity = (formElement, inputElement, settings) => {
if (inputElement.validity.valid) {
hideInputError(formElement, inputElement, settings);
} else {
showInputError(formElement, inputElement, inputElement.validationMessage, settings);
}
}
const setEventListeners = (formElement, settings) => {
const inputList = Array.from(formElement.querySelectorAll(settings.inputSelector));
const submitButton = formElement.querySelector(settings.submitButtonSelector);
inputList.forEach((inputElement) => {
inputElement.addEventListener('input', (evt) => {
checkInputValidity(formElement, inputElement, settings);
toggleButtonState(inputList, submitButton, settings);
});
});
}
const enableValidation = (settings) => {
const formList = Array.from(document.querySelectorAll(settings.formSelector));
formList.forEach((formElement) => {
setEventListeners(formElement, settings);
});
}
enableValidation({
formSelector: '.popup__form',
inputSelector: '.popup__input',
submitButtonSelector: '.popup__button',
inactiveButtonClass: 'popup__save-button_disabled',
inputErrorClass: 'popup__input_type_error',
errorClass: 'popup__input-error-message_visible'
});
解决方案
验证不是由事件触发
您可以添加 focusout 侦听器以在人员移动到其他输入时显示验证消息。和/或添加一个 keyup 事件,然后检查 evt.keycode === 13 和/或 9,如果其为真,则用户按下 enter/tab 键。
inputElement.addEventListener('input keyup focusout', (evt) => { <== Add listeners (keyup and focusout)
checkInputValidity(formElement, inputElement, settings);
toggleButtonState(inputList, submitButton, settings);
});
检查输入/点击键看起来有点像这样。
inputElement.addEventListener('input keyup focusout', (evt) => {
if(evt.keycode === 13 || evt.keycode === 9){ // The Enter and Tab keyup check
checkInputValidity(formElement, inputElement, settings);
toggleButtonState(inputList, submitButton, settings);
}
});
推荐阅读
- java - 通过布尔条件中断while循环
- mysql - 无法卸载 mysql-server,因为:脚本 SACSrv 已损坏
- python - 是否有轻量级 Python 模块来加载预安装的 ML 模块并执行预测?
- ruby-on-rails - 如何监视 ActiveRecord 模型上在类级别调用的方法?
- c# - Automapper 将 ExpandoObject 转换为自定义对象的字典
- java - 无法在 Kerberised 集群中使用 Spark JDBC 连接到 Hive 服务器
- bash - bash脚本无限循环一行语法
- javascript - 如何以 lodash 的方式转置集合?
- bokeh - 如何使用选择/下拉菜单的 on_change 函数动态更改我的数据源?
- python - 如何将程序代码重构为 mvc 模型?