2015-02-10 58 views
-2

我想用這個語法jQuery的每一個如「命名函數」

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

你的意思是:'().each(x)'? – tymeJV 2015-02-10 13:51:52

+1

在第一個代碼段中,'x'是引用**匿名函數**的**變量**。在第二部分中,您只需傳遞一個匿名函數以供'each()'方法使用。 – haim770 2015-02-10 13:53:48

回答

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

過濾器將只返回那些傳遞函數返回一個truthy值的元素,所以在這種情況下,所有元素有一個空值。你不能只算的元素,但立即凸顯空表單元素:

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

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

非常感謝! – leblaireau 2015-02-10 14:43:08

+0

請注意我對示例做了一些更新,最重要的是我不小心使用'.count'而不是'.length'。 – udondan 2015-02-10 14:48:04

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()是你應該使用什麼在這裏,但希望這將幫助你在未來的某一時刻。