【问题标题】:jquery each as 'named function'jquery 每个作为“命名函数”
【发布时间】:2015-02-10 13:50:26
【问题描述】:

我想用这个语法

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");

【问题讨论】:

  • 你的意思是:().each(x)?
  • 在第一个代码段中,x 是一个变量,指的是一个匿名函数。在第二段中,您只需传递一个匿名函数,供 each() 方法使用。

标签: javascript jquery function each


【解决方案1】:

当这样使用函数时:

$(...).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
});

但这只会给您留下10 元素的数组,这与您开始的内容或多或少相同。您需要添加另一个循环来将元素相加。

最后让我们来看看jQuery.filter 方法,它应该正是你所需要的:

var errors = $("#firstname, #surname").filter(function() {
  return $(this).val() == "";
}).length;

console.log("you have " + errors + " errors");

Filter 将仅返回那些传递函数返回真值的元素,因此在这种情况下,所有元素都具有空值。您不仅可以计算元素,还可以立即突出显示空的表单元素:

var errors = $("#firstname, #surname").filter(function() {
  return $(this).val() == "";
}).css("background-color", "red").length;

console.log("you have " + errors + " errors");

【讨论】:

  • 请注意我对示例进行了一些更新,最重要的是我不小心使用了.count 而不是.length
【解决方案2】:

您的示例有一个简单的解决方案,因为您可以只使用过滤器并观察结果的长度,但一般来说,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() 是您应该在这里使用的,但希望这会在将来的某个时候对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    相关资源
    最近更新 更多