我想使用这种语法
var x = function() {
//do something here
}
每个函数
$("#firstname, #surname").each(function( index ) {
if ($(this).val() == '') {
errors += 1;
}
});
这是可能的,这叫做什么(我称之为'命名函数'是正确的吗?)
修改
这样的事情
var errors = $("#firstname, #surname").each(function( index ) {
if ($(this).val() == '') {
errors += 1;
}
return errors;
});
console.log("you have".errors()."errors");
答案 0 :(得分:0)
当使用这样的函数时:
$(...).each(function() {
...
});
它被称为anonymous function或lambda函数。
我从未听过“命名函数”这个术语,但我猜你可以这样称呼它,当你将函数赋值给变量时。
jQuery.each
几乎所有jQuery方法都返回第一个参数,相当于$("#firstname, #surname")
。这是非常重要的理解,因为它是jQuery的关键机制之一,并使您能够做方法链等很酷的东西,例如$("#firstname, #surname").each(do something).each(do even more)
。这意味着,您无法在each
方法中返回错误并将其传递给构造外部的变量。
您可以增加一个全局变量:
var errors = 0
$("#firstname, #surname").map(function() {
if ($(this).val() == '') {
errors++
}
});
console.log("you have" + errors + "errors");
请注意字符串连接符+
,而不是.
。
另一个想法可能是使用jQuery.map
方法,这确实可以让您返回一个值:
var errors = $("#firstname, #surname").map(function() {
if ($(this).val() == '') {
return 1
}
return 0
});
但是这只会给你留下一系列1
和0
元素,这些元素与你的开始元素大致相同。您需要添加另一个循环来将元素汇总在一起。
最后让我们来看jQuery.filter
方法,这应该就是你需要的方法:
var errors = $("#firstname, #surname").filter(function() {
return $(this).val() == "";
}).length;
console.log("you have " + errors + " errors");
Filter只返回传递函数返回truthy值的元素,因此在这种情况下,所有元素都具有空值。您不仅可以计算元素,还可以立即突出显示空表单元素:
var errors = $("#firstname, #surname").filter(function() {
return $(this).val() == "";
}).css("background-color", "red").length;
console.log("you have " + errors + " errors");
答案 1 :(得分:0)
您的示例有一个简单的解决方案,因为您可以使用过滤器并观察结果的长度,但一般来说,reduce()
是当您想要聚合有关所有项目的内容时使用的操作收集到单个值。
jQuery doesn't have a reduce()
method,但是ES5 arrays do,所以你可以像这样使用它:
var errorCount = $("#firstname, #surname").toArray().reduce(function(count, item) {
return count + ($(item).val() === '' ? 1 : 0);
}, 0);
如前所述,filter()
是你应该在这里使用的,但希望这将在未来的某个时候帮助你。