我有一堆输入字段,如果输入字段有某些值,我只想在条件中设置TRUE
名称。如果没有,请删除someClass
名称。
我目前正在研究使用JavaScript操作表单和表单字段,这是我正在处理的代码。
someClass
当前代码执行它只在最后一个输入字段上执行的操作。我想到每次有新的循环时都会覆盖// Add a class to an element, without removing/affecting existing values
var inputs = document.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++) {
// Set HTML elements collection index?
var input = inputs[i];
input.addEventListener('input', function() {
if (input.value.length > 0 && !input.className.match(/(?:^|\s)someClass(?!\S)/)) {
console.log("Input has some value");
input.className += "someClass";
}
if (input.value.length == 0) {
console.log("Input is empty");
input.className = input.className.replace( /(?:^|\s)someClass(?!\S)/g , '' );
}
});
}
。
所以我想通过循环中的一些条件语句来定位当前元素。除了手动分配一些输入的属性外,我无法想到任何其他事情(我对此知之甚少)。
答案 0 :(得分:2)
您遇到的问题是每个输入事件侦听器正在更新w / e元素,变量input
在事件被触发时表示 ,因此仅更新那个元素。
所以时间表是这样的:
input
= input1 input
= input2 input
= input3 所有3个事件监听器都将更改变量input
所持有的元素,此时此变量仅为input3。
input
得到更新正如Sean所指出的,您需要每个eventListener函数来更新触发该事件的特定元素。这里有3个选项:
使用此this
关键字
https://jsfiddle.net/5gbnykme/1/
使用event.target
作为参考
https://jsfiddle.net/5gbnykme/2/
使用包装函数在本地范围调整变量 https://jsfiddle.net/5gbnykme/3/
TL; DR 确保在事件侦听器中调用的元素是触发事件的元素。