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

Why doesn't javascript "this" work with "each"?

提问人:ahnbizcad 提问时间:8/15/2014 最后编辑:TRiGahnbizcad 更新时间:11/6/2014 访问量:69

问:

我试图在检测到元素具有 的属性时将一个类分配给它,但简单的 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。

jquery coffeescript 这个 不显眼的 javascript

评论


答:

2赞 ahnbizcad 8/15/2014 #1
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"truefalse

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

多么隐含的背景疯狂。文档,文档,文档。缺乏它,或者不读它,就是浪费生命。因此,文档可以挽救生命 xp

1赞 Sylvain Leroux 8/15/2014 #2

作为对 @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')

评论

0赞 ahnbizcad 8/15/2014
很好的答案。谢谢。我喜欢答案超出范围,并彻底提及其他可能的案例。接受 becaues 更彻底。