提问人:ahnbizcad 提问时间:8/15/2014 最后编辑:TRiGahnbizcad 更新时间:11/6/2014 访问量:69
为什么javascript “this” 不适用于 “each”?
Why doesn't javascript "this" work with "each"?
问:
我试图在检测到元素具有 的属性时将一个类分配给它,但简单的 addClass 行不起作用。data-voted
"true"
我一直在使用,直到我阅读了jQuery的文档,然后切换到以下内容:$(this)
each()
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);
但即使这样,仍然没有分配一个类,即使我已经确认它确实具有data-voted
"true"
CoffeesSript 可以在 js2coffee 上转换为 Javascript。
答:
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 通常采用 a 并将其转换为 .因此,根据 ,它也应该检查类型。所以什么时候是 ,你会认为你必须把它与 进行比较。不。==
===
===
data-voted
"true"
"true"
显然,您引用或获取的任何数据都可以通过 ,或者变回布尔值 / 。.data()
"true"
"false"
true
false
因此,您必须将 coffeescript 保留为 using ,这在 javascript 中实际上是 ,它检查变量的类型(需要是布尔值,而不是字符串)。==
===
多么隐含的背景疯狂。文档,文档,文档。缺乏它,或者不读它,就是浪费生命。因此,文档可以挽救生命 xp
作为对 @gwho 答案的补充,这种隐式类型转换实际上是 JQuery 的一个记录特性:
HTML5 data-* 属性
每次尝试都将字符串转换为 JavaScript 值(包括布尔值、数字、对象、数组和 null)。一个值 仅当这样做不会更改值的 表示法。例如,“1E02”和“100.000”等效于 数字(数值 100),但转换它们会改变它们的 表示形式,因此它们保留为字符串。字符串值“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')
评论