【问题标题】:jquery $(this) not working in coffee script / backbonejquery $(this) 在咖啡脚本/主干中不起作用
【发布时间】:2011-12-01 23:49:06
【问题描述】:

我最近开始使用 Brunch 玩 Backbone 和 CoffeeScript,我想知道为什么会这样......

events: {
  "click .button" : "open",
  "hover .info"   : "hover"
},

hover: =>
  $(this).css("background-color", "#333")

..不起作用。

据我了解,CoffeeScript 有自己的 this 版本,它可能与 jQuery 使用的内容冲突,但在文档中我认为 => 将它绑定到当前对象。我也试过-> 也无济于事。知道为什么这不起作用吗?

HTML:

<div id='outer'> 
   <div class='.info'> <a href='google.com'> google </a> </div> 
   <div class='.info'> <a href='google.com'> google </a> </div> 
   <div class='.info'> <a href='google.com'> google </a> </div> 
</div>

【问题讨论】:

  • 你看过它生成的 javascript 吗?
  • 是的,它返回标准的 $(this).css("background-color", "#333") 这只是普通的 jquery
  • 尝试在悬停功能中提醒this,看看你实际得到了什么。
  • 即使它返回有效的 jQuery 代码并不意味着上下文是有效的。
  • 我的意思是查看您的语句之前的代码,以了解悬停功能是如何设置的以及this 的值是如何设置的。您可能需要在调试器中单步执行才能查看实际情况。

标签: jquery backbone.js coffeescript


【解决方案1】:

我在使用 Coffee Script 时这样编写我的 jQuery 调用:

$ -> $('#entryBox').val "Placeholder text"

我什至还没有弄清楚它为什么有效,但它确实有效。

【讨论】:

    【解决方案2】:

    $(this) 对我不起作用,所以我做了 $(event.target)。这肯定会奏效。

    【讨论】:

      【解决方案3】:

      Jordan 和gingerhendrix 都是正确的,但让我退后一步考虑=&gt;-&gt; 的更一般的问题。

      你肯定见过/使用过类似的代码

      $('#foo').hover ->
        $(this).css('background-color', '#333')
      

      为什么会这样?好吧,在内部,jQuery 的悬停函数看起来像这样 [显然是高度风格化的]:

      hover: (callback) ->
        for el in @
          el.onmouseenter = el.onmouseleave = (e) -> callback.call el, e
      

      callback.call el, e 就像调用callback(e) 一样,只是它使this 指向该函数调用内部的el。这就是为什么$(this) 会为您提供一个包裹在悬停事件所在元素周围的 jQuery 对象。

      但如果你写了这将不起作用

      $('#foo').hover => ...
      

      因为=&gt; 覆盖 callapply;它强制 this 始终表示相同的意思,无论函数如何调用。

      事情是这样的:Backbone 的 hover 环绕 jQuery 的 hover,因此 this 无论如何都指向 View 实例......所以在你的情况下,是否使用 -&gt; 实际上并不重要或=&gt;。这就是他们在the docs 中使用$(this.el) 的原因。这很好,因为您几乎肯定希望在处理事件时能够访问视图的属性。正如gingerhendrix 指出的那样,this.el 将为您提供整体 View 元素,而不是接收 hover 事件的特定元素;但是事件对象 e 有你需要的东西(还有更多)。

      有关绑定函数运算符的更多信息,check out my book

      【讨论】:

        【解决方案4】:

        Jordan 对此的回答是正确的 - 如果您想要视图的元素,请使用 this.el。

        在您的情况下,您需要触发事件的元素,即 .info 元素。这个可以通过event.currentTarget1检索到

        hover: (e) =>
          $(e.currentTarget).css("background-color", "#333")
        

        【讨论】:

        • 这就是我想要的。谢谢!
        【解决方案5】:

        来自the docs

        所有附加的回调在传递给 jQuery 之前都绑定到视图,所以当回调被调用时,this 继续引用视图对象。

        如果this 是视图对象(而不是HTML 元素),$(this) 就毫无意义。我相信你想要做的是传递视图引用$元素,例如:

        hover: =>
          $(this.el).css("background-color", "#333")
          # -----^
        

        【讨论】:

        • 当我这样做时,它会更改该类的所有元素的背景。我认为通过使用 el 来引用视图,它会影响整个页面而不仅仅是当前对象
        • $(this.el) 返回什么?
        • 与之前的 [object Object] 相同,在控制台中检出时包含外部 div
        • 什么外层div?你没有显示任何标记,所以我无法说出你指的是什么。
        • 对不起,它类似于
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        • 2014-07-29
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多