【问题标题】:JQuery loop to display every six items into an new unordered listJQuery循环将每六个项目显示到一个新的无序列表中
【发布时间】:2009-11-01 07:59:12
【问题描述】:

我对 jquery 世界有点陌生,我想知道:我有一个从数据库返回内容的 JSON 对象。我将如何遍历这些项目以在每个 ul 中仅显示六个,每个项目都附加在 li 中的该 ul 中,然后每六个项目构造一个新的 ul 以显示 li 中的剩余项目?基本上我正在尝试这样做:

  • 项目 1
  • 项目 2
  • 项目 3
  • 项目 4
  • 第 5 项
  • 第 6 项
  • 第 7 项
  • 第 8 项
  • 项目 9
  • 项目 10
  • 项目 11
  • 项目 12

等等……

【问题讨论】:

    标签: jquery json


    【解决方案1】:
    function buildLists(data, element) {
    
        var count = parseInt((data.length / 6) + (data.length % 6 == 0 ? 0 : 1), 10),
            html = "";
    
        for (var i = 0; i < count; i++) {
            html += "<ul>";
            for (var j = i; j < (6 + (6 * i)); j++) {
                html += "<li>" + data[j] + "</li>";
            }
            html += "</ul>";
        }
    
        element.append(html);
    }
    

    【讨论】:

      【解决方案2】:

      这使用了一个数组,但应该能让你指向正确的方向。

      var items = [1,2,3,4,5,6,7,8,9,10,11,12,13];
      var ul = $("<ul></ul>");
      for(var i = 0; i < items.length; i++) {
        if(i % 6 == 0 && i > 0) {    
          console.log(ul.html()); // change this line - insert into the DOM wherever you'd like
          ul = $("<ul></ul>");
        }
        ul.append("<li>" + i + "</li>");
      }
      

      【讨论】:

        【解决方案3】:

        我的回答主要是核心 JavaScript。

            $(function() { //execute when DOM is ready
            var lists = '<ul>'; //start off list
            var nums = new Array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20'); //add a few items to an array for demo
        
            var i = 1; //1-based count for "every six"
            var j = 0; //0-based count for array keys
            while (i <= nums.length){
               if(i%6 == 0){ //check if number is a multiple of 6
                   if(i != nums.length){ 
                    lists += '<li>'+nums[j]+'</li></ul><ul>';  
                   }else{ //if this is the last array value, don't start a new ul
                       lists += '<li>'+nums[j]+'</li></ul>';  
                   }
               }else {
                   lists += '<li>'+nums[j]+'</li>';   
               }
               i++; //go to next number
               j++; //go to next number
           }
        
        
              $('body').append(lists); //ad uls to page
            });
        

        【讨论】:

          【解决方案4】:

          想出了一个使用 jQuery 的“.each”函数的解决方案。创建循环和列表的核心代码非常小。注意:这是假设返回的 JSON 对象有嵌套数据。

          <html>
          <head>
          <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
          <script type="text/javascript">
          $(function(){
              var data = 
              [
                  {value: 1},{value: 2},{value: 3},{value: 4},{value: 5},{value: 6},
                  {value: 7},{value: 8},{value: 9},{value: 10},{value: 11},{value: 12},
                  {value: 13},{value: 14},{value: 15},{value: 16},{value: 17},{value: 18}
              ];
          
              var $listReference;
              $.each(data, function(i, item) {
                  if(i == 0 || (i) % 6 == 0){
                      $listReference = $("<ul>");
                      $("body").append($listReference);
                  }
                  $listReference.append($("<li>").text(item.value));
              });
          });
          </script>
          </head>
          <body>
          
          </body>
          </html>
          

          【讨论】:

            【解决方案5】:

            我建议练习unobtrusive Javascript。关键原则之一是将标记与设计分开;您想将视图分成 6 个块,但您表示的数据仍然是一个长而连续的列表。如果您创建多个列表来表示这一点,则会误导任何试图理解页面内容的脚本或屏幕阅读器等专业客户端。

            因此,我将创建一个列表,并使用 CSS 使其显示为多个块。

            CSS:

              .newBlock { margin-top: 1em; }
            

            Javascript:

            var records = 
            [ {name: "a"},{name: "b"},{name: "c"},{name: "d"},{name: "e"},{name: "f"},
              {name: "g"},{name: "h"},{name: "i"},{name: "j"},{name: "k"},{name: "l"},
              {name: "m"},{name: "n"},{name: "o"},{name: "p"},{name: "q"},{name: "r"}
            ]; // sample data, adapted from WesleyJohnson's example
            var $ul = $("<ul/>").appendTo("body");
            $.each(records, function(count, record) {
              var $li = $("<li/>").html(record.name).appendTo($ul);
              if (count % 6 == 0) $li.addClass("newBlock");
            });
            

            online demo

            【讨论】:

            • 你好马赫莫夫!我尝试了您的解决方案并且非常接近,但由于某种原因,它只显示了六个中的第一项,这很奇怪。它对您的原始代码进行了一些修改,但结构相同。有什么办法可以把我有的东西寄给你吗?
            • 应该可以 - 顺便说一句,您看到链接的演示了吗?我会尝试摆脱 CSS,你应该只看到长长的列表。您可以将其发送至 michael@mahemoff.com 或将其放在 pastebin 并在此处链接,谢谢。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-11-19
            • 2023-03-17
            • 2023-01-03
            • 2021-12-22
            • 2013-02-17
            • 2013-02-07
            • 1970-01-01
            相关资源
            最近更新 更多