2013-09-23 14 views
0

我基於對基於類的CoffeeScript的jQuery插件這種方便的模板編寫插件的行爲:https://gist.github.com/rjz/3610858不一致jQuery的每個()有無法解釋的修復

一切都運行得很好。然而,在年底一些意外的行爲,當我註冊插件:

$.fn.extend markdownAsides: (option, args...) -> 
    @each -> 
    $this = $(this) 
    data = $this.data('markdownAsides') 

    if not data? 
     $this.data 'markdownAsides', (data = new MarkdownAsides(this, option)) 
    if typeof option is 'string' 
     data[option].apply(data, args) 

    data # Plugin breaks without this line 

之前,我補充說,最後一行(一個解決方案,我發現純屬事故),該插件的初期建設工作得很好,但在連續的方法調用,jQuery each循環有時無法遍歷每個元素。

檢查this.size()以外的each循環返回正確的值,並檢查循環外的單個元素也看起來不錯。但是在循環內部,元素有時會被跳過,這是我無法辨別的模式。

就像我說的,問題是通過添加最後一行來解決的。 (也許函數的返回值以某種方式傳遞給each很重要?)我的問題不是「我該如何解決這個問題?」但是「爲什麼這個工作?」

回答

3

從傳遞給each的回調函數返回false將跳出循環。我沒有驗證,但也許jQuery也將打破除undefined以外的任何虛假價值。

由於在CoffeeScript中存在隱式返回,您可能會從回調中返回false或甚至false,具體取決於在其中執行的操作。

爲避免任何問題,最後只需更改datatrue

+1

你也可以在迭代器函數中使用顯式的'return'來顯式地不返回任何東西。 AFAIK,jQuery的['each'](http://api.jquery.com/each/)檢查確切地'false'而不是任何falsy值。 –

+0

啊!這就說得通了。謝謝! –