【问题标题】:Endless/infinite scroll type solution with backbone.js使用backbone.js 的无尽/无限滚动类型解决方案
【发布时间】:2011-05-23 19:51:03
【问题描述】:

我在玩backbone.js,我想知道是否有比我一直在查看的模块更简洁的解决方案来为模型/集合创建“无限滚动”情况(有几个用于jquery,可能更多用于其他库)。

一些搜索几乎没有出现,所以我想在尝试使用主干构建我自己的解决方案之前先问一下,我是否应该在主干集合之外构建它,或者是否有人尝试过类似的东西。

【问题讨论】:

    标签: jquery backbone.js infinite-scroll


    【解决方案1】:

    这个blog post最近登陆了我的推特流。看起来是一个非常好的解决方案,并且在 main page 上运行良好。从博客中可以看出,此解决方案的好处是:

    1. 保留后退按钮。
    2. 不使用 hashbang,不管 twitter 工程师对它有多满意。
    3. 如果 (1) 不可能,则放弃无限滚动。
    4. 逐步增强:当 (3) 发生时,用户点击一个好的 ol' 超链接以获得更多内容。

    【讨论】:

    • 这很有趣,我会研究一下。
    • 我刚写了一个无限滚动教程也backbonetutorials.com/infinite-scrolling
    • 文章给出了很好的观点。但是,我个人认为不要对非 js 后备感到害怕 developer.yahoo.com/blogs/ydn/…
    • @albertpeiro 同意,尽管从历史上看,对于我工作过的网站来说,出于可访问性原因和支持屏幕阅读器的原因,支持非 js 是一个要求。我相信屏幕阅读器现在更擅长解释 JavaScript 和动态页面。
    【解决方案2】:
    【解决方案3】:

    如果您还没有尝试过,SlickGrid 可能是一个选择:https://github.com/mleibman/SlickGrid/wiki/Examples

    【讨论】:

    • 看起来很有趣,我以前见过,但对于我现在想要的一些轻量级用途来说似乎太重了。
    【解决方案4】:

    Backbone 和 jQuery 航点的另一种解决方案:https://gist.github.com/davidmontoyago/6336612

    【讨论】:

      【解决方案5】:

      【讨论】:

        【解决方案6】:

        另一个重复的答案:这是我对 Backbone.Collection 的扩展:

        _.extend Backbone.Collection.prototype,
          options:
            infinitescroll:
              success: $.noop
              error: $.noop
              bufferPx: 40
              scrollPx: 150
              page:
                current: 0
                per: null
              state:
                  isDuringAjax: false
                  isDone: false
                  isInvalid: false
              loading:
                wrapper: 'backbone-infinitescroll-wrapper'
                loadingId: 'backbone-infinitescroll-loading'
                loadingImg: 'loading.gif'
                loadingMsg: '<em>Loading ...</em>'
                finishedMsg: '<em>No more</em>'
                msg: null
                speed: 'fast'
        
          infinitescroll: (options={})->
            # NOTE: coffeescript cannot deal with nested scope!
            that = @
        
            _.extend(@options.infinitescroll, options.infinitescroll) if options.infinitescroll
        
            infinitescroll_options = @options.infinitescroll
        
            # where we want to place the load message in?
            infinitescroll_options.loading.wrapper = $(infinitescroll_options.loading.wrapper)
            if !infinitescroll_options.loading.msg and infinitescroll_options.loading.wrapper.size() > 0
              infinitescroll_options.loading.msg = $('<div/>', {
                id: infinitescroll_options.loading.loadingId
              }).html('<img alt="'+$(infinitescroll_options.loading.loadingMsg).text()+'" src="' + infinitescroll_options.loading.loadingImg + '" /><div>' + infinitescroll_options.loading.loadingMsg + '</div>')
              infinitescroll_options.loading.msg.appendTo(infinitescroll_options.loading.wrapper).hide()
            else
              infinitescroll_options.loading.msg = null
        
            fetch_options = _.omit(options, 'infinitescroll')
            infinitescroll_fetch = ()=>
              # mark the XHR request
              infinitescroll_options.state.isDuringAjax = true
        
              # increase page count
              infinitescroll_options.page.current++
        
              payload = {
                page: infinitescroll_options.page.current
              }
              payload['limit'] = infinitescroll_options.page.per if infinitescroll_options.page.per isnt null
        
              _.extend(fetch_options, {
                remove: false
                data: payload
              })
        
              if infinitescroll_options.loading.msg
                # preload loading.loadingImg
                (new Image()).src = infinitescroll_options.loading.loadingImg if infinitescroll_options.loading.loadingImg
        
                infinitescroll_options.loading.msg.fadeIn infinitescroll_options.loading.speed, ()->
                  that.fetch(fetch_options)
                  .success (data, state, jqXHR)=>
                    infinitescroll_options.state.isDuringAjax = false
                    infinitescroll_options.state.isDone = true if _.size(data) is 0
        
                    infinitescroll_options.loading.msg.fadeOut infinitescroll_options.loading.speed, ()->
                      infinitescroll_options.success.call(data, state, jqXHR) if _.isFunction(infinitescroll_options.success)
                      return
                    return
                  .error (data, state, jqXHR)=>
                    infinitescroll_options.state.isDuringAjax = false
                    infinitescroll_options.state.isInvalid = true
        
                    infinitescroll_options.loading.msg.fadeOut infinitescroll_options.loading.speed, ()->
                      infinitescroll_options.error.call(data, state, jqXHR) if _.isFunction(infinitescroll_options.error)
                      return
                    return
                  return
        
              else
                that.fetch(fetch_options)
                .success (data, state, jqXHR)=>
                  infinitescroll_options.state.isDuringAjax = false
                  infinitescroll_options.state.isDone = true if _.size(data) is 0
        
                  infinitescroll_options.success.call(data, state, jqXHR) if _.isFunction(infinitescroll_options.success)
                  return
        
                .error (data, state, jqXHR)=>
                  infinitescroll_options.state.isDuringAjax = false
                  infinitescroll_options.state.isInvalid = true
        
                  infinitescroll_options.error.call(data, state, jqXHR) if _.isFunction(infinitescroll_options.error)
                  return
              return
        
            $(document).scroll ()->
              $doc = $(document)
              isNearBottom = ()->
                bottomPx = 0 + $doc.height() - $doc.scrollTop() - $(window).height()
        
                # if distance remaining in the scroll (including buffer) is less than expected?
                (bottomPx - infinitescroll_options.bufferPx) < infinitescroll_options.scrollPx
        
              return if infinitescroll_options.state.isDuringAjax || infinitescroll_options.state.isDone || infinitescroll_options.state.isInvalid || !isNearBottom()
        
              infinitescroll_fetch()
              return
        
        
            infinitescroll_fetch()
            return
        

        https://gist.github.com/mcspring/7655861

        【讨论】:

        • 您可以使用粗箭头 => 而不是细箭头,并将外部上下文传递给 @ 或 _this
        猜你喜欢
        • 2019-06-26
        • 2017-08-08
        • 2018-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 2012-10-11
        • 1970-01-01
        相关资源
        最近更新 更多