不一致的jQuery每个()行为与无法解释的修复

时间:2013-09-23 21:12:17

标签: javascript jquery coffeescript

我正在为基于类的CoffeeScript jQuery插件编写一个基于这个方便模板的插件:https://gist.github.com/rjz/3610858

一切都很顺利。但是,当我注册插件时,最后会出现一些意外行为:

$.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的函数的返回值在某种程度上很重要?)我的问题不是“如何解决这个问题?”但“为什么这样做?”

1 个答案:

答案 0 :(得分:3)

从传递给each的回调函数返回false将导致循环中断。我还没有验证,但是除了undefined之外,jQuery也可以打破任何虚假值。

因为在CoffeeScript中有一个隐式返回,你可能会从回调中返回一些falsey甚至false,具体取决于在其中执行的操作。

为避免出现任何问题,请在最后更改data的{​​{1}}。