Javascript coffeescript jquery方法返回空
我有以下共同脚本:Javascript coffeescript jquery方法返回空,javascript,jquery,coffeescript,Javascript,Jquery,Coffeescript,我有以下共同脚本: myElement = do (-> $('.manyElements').eq(window.elemIndex)) setElement = -> [...] myElement.addClass "class" window.elemIndex ++ 然而,我得到了非常奇怪的结果。当我调试到setElements()并调用myElement函数时,它返回一个空的[]。但是,当我将myElement定义复制粘贴到控制台中时,返回了一个jquery对象
myElement = do (-> $('.manyElements').eq(window.elemIndex))
setElement = ->
[...]
myElement.addClass "class"
window.elemIndex ++
然而,我得到了非常奇怪的结果。当我调试到
setElements()
并调用myElement
函数时,它返回一个空的[]
。但是,当我将myElement
定义复制粘贴到控制台中时,返回了一个jquery对象。当我将此定义设置为变量时,为什么会得到[]
如果查看已编译的javascript,您会发现jQuery选择器正在立即执行,因为您正在将其包装到do语句中:
var myElement;
myElement = (function() {
return $('.manyElements').eq(window.elemIndex);
})();
相反,我认为您只需要做一个函数声明:
myElement = -> $('.manyElements').eq(window.elemIndex)
然后叫它
myElement().addClass('class')
编辑:
如果你想避免空的插入语呼叫(回应你的评论),你可以用两种不同的方式:
addClassToMyElement = (klass)->
$('.manyElements').eq(window.elemIndex).addClass(klass)
addClassToMyElement('class')
或
只是一些想法,在CoffeeScript中使用默认赋值之类的东西使其更灵活。为什么在这里使用CoffeeScript?特别是当简单的jQuery语句就可以了吗<代码>$('.manyElements').addClass('class')代码>这不是完整的coffeescript文件。myElement将在CS的其他部分中使用,所以我想我提取出该部分并将其设置为一个更简单的变量。有许多
$('.manyElements')
这就是为什么我需要使用window.elemIndex
来指定它们并对它们进行迭代。var myElements=$('.myElements')
将它们缓存到一个可以反复使用的变量中。是的,但是我不仅仅是设置var myElements=$('.myElements'))
我正在将其设置为函数调用,因此缓存应该是这里的一个问题?@user3358302这是不正确的(您没有为以后缓存该函数),将其包装在do
中,它将在定义时执行。请看下面我的答案。非常感谢,是的,这就是问题所在!我放置do
调用的原因是试图不将空的()
用于myElement().addClass('class')
。“但我认为这是不可避免的。”用户3358302在回答中添加了一些想法,可能会让你深思。
decorateElements = ($selector, klass='class')->
$selector.eq(window.elemIndex).addClass(klass)
decorateElements $('.manyElements')
decorateElements $('.manyElements'), 'foo'