【问题标题】:Javascript - Infinite scroll JSON array?Javascript - 无限滚动 JSON 数组?
【发布时间】:2016-09-02 11:12:38
【问题描述】:

我有这样的 JavaScript:

items.forEach(function (item, index, arr) {
                console.log(item.price);
                var message = 'BitSkins Price: $' + item.bprice + '';
                if (item.price != null) {
                    if (item.bprice == '') {
                        message = 'Item never sold on BitSkins!';
                    }
                    if (item.name != 'Operation Phoenix Case Key' && item.name != 'CS:GO Case Key' && item.name != 'Winter Offensive Case Key' && item.name != 'Revolver Case Key' && item.name != 'Operation Vanguard Case Key' && item.name != 'Operation Wildfire Case Key' && item.name != 'Shadow Case Key' && item.name != 'Operation Breakout Case Key' && item.name != 'Chroma Case Key' && item.name != 'Huntsman Case Key' && item.name != 'Falchion Case Key' && item.name != 'Chroma 2 Case Key') {
                        $("#inventory").html($("#inventory").html() + "<li class='col 2' style='padding:8px;font-weight:bold;font-size:16px'><div class='card item-card waves-effect waves-light' style='margin:0%;min-height:295px;width:245.438px;border-radius: 15px;' id='" + item.id + "'><div class='iteam' style='text-decoration: underline;text-align: left'>" + item.name + "</div><div class='condition' style='text-align: left;text-size:13px'>" + item.condition + "</div><div class='center-align' style='padding:6%'><img title=\"" + item.originalname + "\" draggable='false' src='https://steamcommunity-a.akamaihd.net/economy/image/" + item.iconurl + "/200fx200'><div class 'floatvalue'>Float: 0.11503319442272186<div class='bitskinscomp' style='font-weight: normal;font-size:12px'>" + message + "</div><div class='buyer-price center-align'>$" + numberWithCommas(item.price) + "</li></div></div>");
                    }
                }
            });

将数组中的每个item 添加到html,然后显示在那里。 items 数组包含 JSON,可以是 1000 不同的项目。我怎么能在那个 JavaScript 上添加infinite scroll?示例:它将显示前 50 个项目,然后如果您滚动另一个 50.. 另外,按价格对它们进行排序(我已经在代码中得到它)。

【问题讨论】:

标签: javascript jquery arrays json


【解决方案1】:

你可以像这样轻松地做到这一点:

var perPage = 50;

function paginate(items, page) {
  var start = perPage * page;
  return items.slice(start, start + perPage);
}

function renderItems(pageItems) {
  pageItems.forEach(function (item, index, arr) {
    var message = 'BitSkins Price: $' + item.bprice + '';
    if (item.price != null) {
      if (item.bprice == '') {
        message = 'Item never sold on BitSkins!';
      }
      if (item.name != 'Operation Phoenix Case Key' && item.name != 'CS:GO Case Key' && item.name != 'Winter Offensive Case Key' && item.name != 'Revolver Case Key' && item.name != 'Operation Vanguard Case Key' && item.name != 'Operation Wildfire Case Key' && item.name != 'Shadow Case Key' && item.name != 'Operation Breakout Case Key' && item.name != 'Chroma Case Key' && item.name != 'Huntsman Case Key' && item.name != 'Falchion Case Key' && item.name != 'Chroma 2 Case Key') {
        $("#inventory").append("<li class='col 2' style='padding:8px;font-weight:bold;font-size:16px'><div class='card item-card waves-effect waves-light' style='margin:0%;min-height:295px;width:245.438px;border-radius: 15px;' id='" + item.id + "'><div class='iteam' style='text-decoration: underline;text-align: left'>" + item.name + "</div><div class='condition' style='text-align: left;text-size:13px'>" + item.condition + "</div><div class='center-align' style='padding:6%'><img title=\"" + item.originalname + "\" draggable='false' src='https://steamcommunity-a.akamaihd.net/economy/image/" + item.iconurl + "/200fx200'><div class 'floatvalue'>Float: 0.11503319442272186<div class='bitskinscomp' style='font-weight: normal;font-size:12px'>" + message + "</div><div class='buyer-price center-align'>$" + numberWithCommas(item.price) + "</li></div></div>");
      }
    }
  });
}

$(document).ready(function() {
  var win = $(window);
  var page = 0;
  renderItems(paginate(items, page));

  // Each time the user scrolls
  win.scroll(function() {
    // End of the document reached?
    if ($(document).height() - win.height() == win.scrollTop()) {
      page++;
      renderItems(paginate(items, page));
    }
  });
});

或使用jQuery endlessScroll plugin

$(document).ready(function() {
  $(window).endlessScroll({
    inflowPixels: 300,
    callback: function() {
      //append new items to your list
    }
  });
});

【讨论】:

  • 是的,但我怎么能这样做。如果您首先加载页面,它将加载 50 个项目,如果您到达底部,然后再加载 50 个。我该怎么做?
  • 比较容易实现
  • 嗯,谢谢!但是,这些项目位于名为items 的数组中,我目前正在通过 foreach 获取它们。我只是应该将其更改为不同的名称?
  • 这是我的完整 JavaScript 代码:pastebin.com/raw/13MHn4Tf 该代码从第 151 行开始。我认为它会有所帮助:/
  • 是的,对所有项目的数组和每个页面的项目使用不同的名称。但是你应该从我的例子中得到大致的想法。我建议你重构 renderItems 函数以不使用内联 css 并使用一些模板语言,如 underscorejs.org/#template
【解决方案2】:

如何编写一个小函数来检查滚动位置并触发 ajax 调用以获取更多数据,或者只是从 json 对象中获取下一个数据槽并将其绑定到 HTML。如下:

$(window).scroll(function() {
    if($(window).scrollTop() == $(document).height() - $(window).height()) {
           // ajax call or some other logic to show data here
    }
});

或者你可以使用 这么多插件之一,我将 Waypoint 用于同一件事。

【讨论】:

  • 那个数组已经有 1000 个项目了,我怎么能只得到“精确”的数量?
  • 您可以启动一个计数器并将对象拼接到某个偏移量 20-50 并在滚动时使用增加的值更新偏移量并从对象获取下一个 50。
  • 你能给我举个例子吗?我不太擅长编写这种“复杂”的东西:(
【解决方案3】:

尝试使用其他变量,例如当前页面(如果您有 1000 个项目并且每个项目显示 50 个,那么您最多可以显示 20 个页面)、页面上的项目数、开始索引和结束索引。

假设:

var currPage = 0; //(First page)

var itemsInPage = 50; //NUMBER OF ITEMS IN A PAGE

然后对于每个滚动,计算startItem 索引和endItem 索引。

startItem = currPage * itemsInPage;//FOR FIRST PAGE, THIS IS 0

endItem = startItem + itemsInPage; //AND THIS IS 50

forEach 循环中,检查if( index &gt;= startItem &amp;&amp; index &lt; endItem ) 并仅显示这些项目。

您必须在每次滚动后和forEach 循环的开头增加currPage,添加:

if( currPage > Math.ceil( items.length/itemsInPage ) ) currPage = 1;

(使用 ceil 进行四舍五入,因为如果 'items' 的长度不能完全被 'itemsinpage' 整除,那么它们将作为附加页面相加)

【讨论】:

  • 嗯,你能把它写成“一个代码”吗?如果需要,我可以给你更多信息。谢谢顺便说一句! :)
  • 您好,先生?我希望你还在这里:)
  • 是的,很抱歉。这是一个示例:var currPage = 0, itemsInPage = 100, items = [], scrollTimeout = 0; for(i=0;i&lt;1000;i++) items.push( i+1 ); window.onscroll = function() { clearTimeout(scrollTimeout); scrollTimeout = setTimeout( function() { items.forEach( function (item, index, arr) { if( currPage &gt;= Math.ceil( items.length/itemsInPage ) ) currPage = 0; startItem = currPage * itemsInPage; endItem = startItem + itemsInPage; if( index &gt;= startItem &amp;&amp; index &lt; endItem ) console.log(item); }); currPage++; }, 250); };
  • 打开你的浏览器(我用的是chrome),导航到任何有滚动条的页面(长页面)。打开控制台,清除它并粘贴上面的代码。现在,滚动查看正在显示的项目!
【解决方案4】:

如果您可以使用第三方,请查看此处Infinite ajax scroll

或如similar asked question 中的说明使用JQuery Waypoint plugin

【讨论】:

    猜你喜欢
    • 2017-01-17
    • 2012-10-31
    • 1970-01-01
    • 2014-07-20
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    相关资源
    最近更新 更多