我基本上尝试使用以下代码检查所有输入字段是否有效:
addData (input){
var isValid = false;
for (var i = 0, ii = input.length; i < ii; ++i) {
if ($('#' + input[i].id).hasClass('valid')) {
isValid = true;
}
}
if (isValid) {
//do stuff
}
}
总的来说input.length是3,我想检查所有3个输入字段是否有效。在我的例子中,它只检查最后一个输入元素。在related posts中,我找不到用for-loop解决它的方法。有人可以帮忙吗?
感谢所有有用的答案:最后,我调整了MátéSafranka的答案:
var isValid = input.toArray().every(element => $('#' + element.id).hasClass('valid'))
使用
.toArray()
将jQuery对象转换为Array
&gt;&gt; see here了解更多信息。定义true
或false
不是 需要更长时间。
答案 0 :(得分:3)
你弄错了。在元素有效之前,您将无效。你应该假设有效,直到一个元素无效:
addData (input){
var isValid = true;
for (var i = 0, ii = input.length; i < ii; ++i) {
if (!($('#' + input[i].id).hasClass('valid'))) {
isValid = false;
}
}
if (isValid) {
//do stuff
}
}
答案 1 :(得分:3)
您永远不会将isValid
设置为false,因此只要至少有一个输入有效,结果就会有效。
最好交换true / false并检查是否有任何无效的,例如:
addData (input){
var isValid = true;
for (var i = 0, ii = input.length; i < ii; ++i) {
if (!$('#' + input[i].id).hasClass('valid')) {
isValid = false;
}
}
if (isValid) {
//do stuff
}
}
注意:有使用循环的替代方法,但这是为了回答在OPs问题中修复循环的明确问题。
答案 2 :(得分:3)
如果input
是数组,则可以使用.every()
:
var isValid = input.every(it => $('#' + it.id).hasClass('valid'));
如果input
不是数组,您可以将其转换为Array.from()
的数组。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every
注意:正如评论中所指出的,这适用于IE10及更高版本。这在大多数情况下不应该成为问题(Windows 10附带IE11和Edge,理论上每个商业最终用户都应该已经升级),但值得注意的是,如果您必须支持传统平台。
答案 3 :(得分:3)
正如其他人所说,您需要从设置为isValid
的{{1}}开始,然后从第一个无效字段开始,将其设置为true
并打破循环。< / p>
但如果false
确实是一个数组,我会改用input
:
input.every
addData (input){
if (input.every(function(element) { return $(element).hasClass('valid'); })) {
// Do stuff
}
}
调用数组中项目的回调,如果回调返回所有这些项目的真值,则返回Array#every
,或返回true
(并立即停止)回调永远会返回一个假值。
或者你可以使用jQuery的false
:
filter
如果您可以使用ES2015 +箭头功能, addData (input){
if ($(input).filter(':not(.valid)').length === 0) {
// Do stuff
}
}
会更简洁:
Array#every
答案 4 :(得分:0)
and
true
isValid
与true
(而不是直接分配isValid
)会使第一个错误值使整个条件成为假。请确保在循环之前以isValid = true;
// inside the loop
isValid = isValid && true;
为真。
{{1}}