为什么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