【问题标题】:event passed to debounce firing continuously (not debouncing)传递事件以连续触发去抖动(不去抖动)
【发布时间】:2015-03-13 00:35:54
【问题描述】:

代码如下:

lookup_book = (obj) ->
  $.get '/list_items/retrieve_google_book/' + obj.val() + '/' + obj.attr("id")
  return

delayed_lookup = (obj) ->
  _.debounce(lookup_book(obj), 3000)
  return

$(document).on 'keyup', '.list-item-title', (event) ->
  delayed_lookup($(this))
  return

我想要lookup_book,因此只有当用户3000 毫秒没有输入时才会触发ajax 请求。现在它会在我在输入字段中输入字母时触发,没有任何延迟。

这里发生了什么?我正在拔毛。

【问题讨论】:

    标签: ruby-on-rails coffeescript underscore.js asset-pipeline turbolinks


    【解决方案1】:

    您实际上是在每次触发 'keyup' 事件时调用函数 lookup_book,而不是将函数传递给 _.debounce。

    所以 _.debounce 返回一个新函数供您调用。

    delayed_lookup = _.debounce(lookup_book, 3000)
    
    $(document).on 'keyup', '.list-item-title', (event) ->
      delayed_lookup($(this))
      return
    

    【讨论】:

    • 编辑反映了我认为代码的目的
    • 我现在看到了错误所在。剩下的问题是我需要在lookup_book 中访问$(this)。我该怎么办?
    • 我稍微摆弄了一下,我发现_.debounce() 确实需要 -> 来将其声明为函数。我将发布我的解决方案,我必须使用自定义去抖动实现来工作。我无法弄清楚问题出在哪里。
    • _.deboucne 返回一个您应该调用的新函数。您可以将 $(this) 传递给延迟函数。您遇到了什么问题?
    【解决方案2】:

    我最终使用了 debounce 的自定义实现,因为我无法使上述方法正常工作。

    delay = do ->
      timer = 0
      (callback, ms) ->
        clearTimeout timer
        timer = setTimeout(callback, ms)
        return
    
    $(document).on 'keyup', '.list-item-title', (event) ->
      val = $(this).val()
      id = $(this).attr("id")
      delay (->
        $.get '/list_items/retrieve_google_book/' + val + '/' + id
        return
      ), 2000
      return
    

    【讨论】:

      猜你喜欢
      • 2015-04-12
      • 1970-01-01
      • 2016-07-03
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多