2010-10-29 21 views
0

我正在通過O'Reilly jQuery Cookbook。在p。 100有一個例子,我沒有得到一個細節。我在第一週看jQuery,所以這並不奇怪,但我希望有人能澄清。jQuery迭代問題(由書中的例子困惑)

功能是用幾個鈴鐺&口哨撥動:

onValueoffValue都是布爾值,而且必須具有相反意義,它可能是更清晰的只具有其中之一,但這個想法是以適應某些地方(例如)name是「禁用」。 可選on,也是一個布爾值,讓來電者用此爲「套」,而不是「切換」

jQuery.fn.toggleAttr = function (name, onValue, offValue, on) { 
    function set($element, on) { 
     var value = on ? onValue : offValue; 
     return value == null ? $element.removeAttr(name) : $element.attr(name, value); 
    } 
    return on !== undefined ? 
     // next line is where I'm confused 
     set(this, on) : 
     this.each(function (i, element) { 
      var $element = $(element); 
      set($element, $element.attr(name) !== onValue); 
     }); 
}; 

如何set(this, on)在這裏工作的?它似乎在列表元素,但需要發生每個元素,我不明白什麼會導致任何迭代。我會期待更多的東西,如on === undefined情況下,是這樣的:

 this.each (function(i, element) { 
      set($(element), on); 
     )} 

所以,我失去的東西嗎?

+0

我有罪不盡可能靠近我應該有閱讀代碼,我刪除我的答案。現在我想說你沒有提供足夠的信息。你如何知道該集合被應用於元素列表?爲了讓我關注正在發生的事情,我需要了解toggleAttr是如何應用的。 – mikerobi 2010-10-29 22:04:28

+0

我知道,因爲'toggleAttr'被定義爲jQuery.fn的一個方法(希望術語是正確的,我是一個C++開發人員,對於jQuery來說是新的)。這將在以下情況下調用: 'jQuery('ul#booklist li')。toggleAttr(「related」,true,false,true);' 或 'jQuery('#workers li')。toggleAttr 「on-shift」,true,false);' – 2010-10-29 22:45:31

回答

0

當未設置on然後在toggleAttr函數通過每個檢查什麼name屬性的當前值被設置爲與該比較的onValue可變的元件的環路。

當設置了on這意味着您要告知toggleAttr「我希望您將所有元素切換爲真/假,並忽略當前值是什麼」。所以它不需要循環遍歷所有的元素,並檢查當前值設置爲什麼,因爲你告訴它蠻力的價值。

例子: http://jsfiddle.net/petersendidit/sHJC3/2/

+0

我想我明白了:所以當'set'傳遞一個jQuery對象,並且該對象是一個列表時,'set'隱式地操作列表元素,因爲' jQuery.fn.removeAttr'和'jQuery.fn.attr'隱式地操作列表的元素。那是對的嗎? – 2010-10-30 01:59:13

+0

正確的'jQuery.fn.removeAttr'和'jQuery.fn.attr'在jQuery對象上運行,如果jQuery對象在集合中有12個元素或1,則無關緊要。 – PetersenDidIt 2010-10-30 12:39:30