javascript - javascript中带有多个事件侦听器的for语句外的未定义变量
问题描述
我想使用 Javascript 验证 API 构建客户端验证。
我对某些字段进行了自定义验证,但希望在为空时对所有字段进行通用验证。我正在尝试使用 for 短语。但是由于某种原因,当我尝试在 for 之外运行变量 [i] 时出现此错误: Uncaught TypeError: Cannot read property 'value' of undefined
到目前为止,这是我的代码。
//Test
var test_field = document.querySelectorAll(".um-form-field");
var i;
for (i = 0; i < test_field.length; i++) {
test_field[i].addEventListener('keyup', test_function, false);
test_field[i].addEventListener('click', test_function, false);
test_field[i].addEventListener('invalid', test_function, false);
console.log(test_field[i].value);//this works every time i click or type a field!
function test_function (event) {
console.log(test_field[i].value);//This tells me an undefined variable every time I click on a field
}
}
24/12 编辑: 感谢任何人。我终于使用了评论中提到的 event.target 。
这是我的最终代码(我在 setCustomValidity 方面遇到了一些问题):
var all_fields = document.querySelectorAll(".um-form-field");
var i;
for (i = 0; i < all_fields.length; i++) {
all_fields[i].addEventListener('keyup', field_function, false);
all_fields[i].addEventListener('click', field_function, false);
all_fields[i].addEventListener('invalid', field_function, false);
function field_function (event) {
if (event.target.value.length == 0) {
event.target.style.background = "#eb91ae";
event.target.setCustomValidity("error");
divError.style.display = "block";
divError.innerHTML = "You must complete this field"
event.target.parentElement.appendChild(divError);
} else {
event.target.style.background = "#9deb91";
event.target.setCustomValidity("");
divError.style.display = "none";
}
}
}
解决方案
您的代码将不起作用。在 iterable 之后for...loop
,i
将达到最终值,这i
将等于test_field.length
为什么test_function
在执行时看起来像波纹管:
function test_function (event) {
console.log(test_field[test_field.length].value);
}
因此,您可以像这样进行快速修复:
var test_field = document.querySelectorAll(".um-form-field");
test_field.forEach(field => {
field.addEventListener('keyup', test_function, false);
field.addEventListener('click', test_function, false);
field.addEventListener('invalid', test_function, false);
});
function test_function (event) {
console.log(event.target.value);
}
推荐阅读
- html - 如何使用 Bootrap-4 的网格功能?
- fluid-framework - 重新启动服务器时,流体客户端不同步
- java - 在没有 JPQL 的情况下连接两个表
- r - 如何从一个数据集中获取 R 中的频率表,使用间隔和中断形成不同的数据集?
- faunadb - 从两个日期之间的 Fauna 集合中选择满足另一个条件的文档
- kotlin - Kotlin Coroutine Scope:如果在控制器端点中使用,return@runBlocking 是否存在问题
- python - Python 基于连接条件的字典连接列表
- javascript - 视差滚动和交替文本同时
- html - 仅在右侧对齐一个链接,flex-end 不起作用
- r-markdown - 如何在 Rmarkdown 中居中和删除图形标题