为什么javascript“this”不适用于“each”?

我正在尝试在检测到它具有"true"data-voted属性时为一个元素分配一个类,但是简单的addClass行不起作用。

我使用$(this)直到我为each()读取jQuery的文档,然后切换到以下内容:

 windowReady = -> jQuery -> $voteLinks = $('.vote-button a') $voteLinks.each (i, current) -> if $(current).data('voted') == "true" $(current).addClass('voted') $(window).load(windowReady); $(window).on('page:load', windowReady); $(this) 

 windowReady = -> jQuery -> $voteLinks = $('.vote-button a') $voteLinks.each -> if $(this).data('voted') == "true" $(this).addClass('voted') $(window).load(windowReady); $(window).on('page:load', windowReady); 

但即便如此我仍然没有指定一个类,即使我已经确认它确实具有"true"data-voted属性

CoffeesSript可以在js2coffee转换为Javascript。

作为@gwho答案的补充,这种隐式类型转换实际上是JQuery的一个记录function

HTML5数据 – *属性

每次尝试都将字符串转换为JavaScript值 (这包括布尔值,数字,对象,数组和null)。 如果这样做不会更改值的表示,则只将值转换为数字。 例如,“1E02”和“100.000”等同于数字(数值100),但转换它们会改变它们的表示forms,因此它们保留为字符串。 字符串值“100”被转换为数字100。

[…]

要将值的属性检索为字符串而不尝试转换它,请使用attr()方法。

如上面的引文所述,如果你“不喜欢”隐式转换,你可能更喜欢使用attr() (使用完整的属性名称)而不是data()

 windowReady = -> jQuery -> $voteLinks = $('.vote-button a') $voteLinks.each (i, current) -> if $(current).attr('data-voted') == "true" $(current).addClass('voted') 

如果你能接受这种隐含的转换:

 windowReady = -> jQuery -> $voteLinks = $('.vote-button a') $voteLinks.each (i, current) -> if $(current).data('voted') == true $(current).addClass('voted') 
 windowReady = -> jQuery -> $voteLinks = $('.vote-button a') $voteLinks.each (i, current) -> if $(current).data('voted') == true $(current).addClass('voted') $(window).load(windowReady); $(window).on('page:load', windowReady); 

显然,幕后有一些翻转。

coffeescript通常采用==并将其变为=== 。 所以根据=== ,它也应该检查类型。 因此,当data-voted"true" ,您认为必须将其与"true"进行比较。 不。

显然,您通过.data()"true""false"引用或获取的任何数据都会被转换回布尔值true / false

因此,您必须将coffeescript保留为使用== ,这在javascript中实际上是=== ,它检查变量的类型(需要是布尔值,而不是字符串)。

什么隐含的背景疯狂。 文档,文档,文档。 缺乏它,或不读它会浪费生命。 因此文档可以节省生命xp