【问题标题】:Why doesn't javascript "this" work with "each"?为什么javascript“this”不能与“each”一起使用?
【发布时间】:2014-11-06 06:54:42
【问题描述】:

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

我一直在使用 $(this),直到我阅读了 jQuery 的 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);

但即使这样仍然没有分配一个类,即使我已经确认它确实具有 "true"data-voted 属性

CoffeesSript 可以在 js2coffee 转换为 Javascript。

【问题讨论】:

    标签: jquery coffeescript this unobtrusive-javascript


    【解决方案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 通常采用== 并将其转换为===。所以根据===,它也应该检查类型。所以当data-voted"true" 时,你会认为你必须将它与"true" 进行比较。不。

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

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

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

    【讨论】:

      【解决方案2】:

      作为对@gwho 回答的补充,这种隐式类型转换实际上是documented feature of JQuery

      HTML5 数据-* 属性

      每次尝试都将字符串转换为 JavaScript 值 (这包括布尔值、数字、对象、数组和空值)。一个值 仅在不改变值的情况下转换为数字 表示。例如,“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')
      

      【讨论】:

      • 优秀的答案。谢谢你。当答案超出范围并彻底提及其他可能的情况时,我喜欢它。接受是因为它更彻底。
      猜你喜欢
      • 2019-06-07
      • 1970-01-01
      • 2015-03-16
      • 2010-11-01
      • 2018-03-09
      • 2021-06-14
      • 2012-10-09
      • 2020-03-18
      • 2017-11-21
      相关资源
      最近更新 更多