我有这段代码:
// Required fields is an array of objects
required_fields.each(function() {
// Check each field: If it has no value, do nothing.
if( !$(this).val() ) {
return false;
}
// If all the fields are there, do something.
else {
alert('Doing something.');
}
});
我相信你能看到问题所在。在alert
函数中使用.each()
会导致警报触发数组中的每个项目。但我想要的是仅在所有数组项都有值的情况下触发事件 - 即如果没有return false
。
只有在所有数组项都通过后触发某事的正确方法是什么?
答案 0 :(得分:5)
为每个值实施一个小计数器。
var valueCount = 0;
required_fields.each(function () {
if (!$(this).val()) {
return false;
} else {
valueCount++; // increment to say has value
}
});
if (valueCount == required_feilds.length) {
alert('Doing something.');
}
答案 1 :(得分:1)
您可以使用Array.prototype.every
,当返回假值时会短路:
var isTrue = [].every.call(required_fields, function(el) {
return $(el).val();
});
if (isTrue) {
console.log('Doing something');
}
我不认为你有一个数组而是一个jQuery对象就是数组(得到长度和0
,1
,......属性)所以你可以(ab)使用本机通过使用.call
:
var every = Array.prototype.every;
every.call({ '0': 'a', '1': 'b', length: 2 }, console.log.bind(console));
// will output
// ['a', 0]
// ['b', 1]
现在我想起来jQuery.fn.each
如果返回false
也会短路。
答案 2 :(得分:1)
两个主要选择突出: 1:编写一个带有jQuery对象数组的简单函数,如果数组中的所有项都有值
,则返回truevar allHaveValue = function(array){
for(var i = 0; i < array.length; i++){
if(!$(array[i]).val()){
return false;
}
}
return true;
};
// For your example
if(allHaveValue(required_fields)){
// Proceed
} else{
// Handle errors
}
另一种选择是做同样的事情,但为[every] [1]使用underscore.js函数
[1]:http://underscorejs.org/#every做同样的事情。这个电话看起来像是:
var allHaveValue = _.every(required_fields, function(item){
return $(item).val();
});
if(allHaveValue)}{
// Proceed
} else{
// Handle errors
}