7

我有一个产品页面,我想在每行中显示 3 个项目,然后如果它有更多,创建一个新行并显示更多。因此,每行 3 列,行数不受限制。下面是我拥有的包含我的循环的代码,我假设代码需要进入。

$(data).find('products').each(function() {

            itemName = $(this).find('itemName').text();
            itemDesc = $(this).find('itemDesc').text();
            itemID = $(this).find('id').text();

                items +='<div class="row-fluid">\
                <div class="span3">Col 1</div>\
                <div class="span3">Col 2</div>\
                <div class="span3">Col 3</div>\
                </div>';

            count++;

        });

这是我需要做的地方,但我对如何处理这个问题有点困惑。如果计数可被 3 整除,我认为它将需要创建一个新行。

感谢您提供的任何帮助或意见。

4

6 回答 6

10

首先,不需要自己处理count变量,该.each()函数已经提供了一个索引元素(作为可选参数)。

使用modulus运算符,您可以将除以 3 得到余数index。然后您可以知道何时需要打印行的开头和结尾。

$(data).find('products').each(function(index) {

    itemName = $(this).find('itemName').text();
    itemDesc = $(this).find('itemDesc').text();
    itemID = $(this).find('id').text();

        if ((index % 3) == 0) items += '<div class="row-fluid">';

        items += '<div class="span3">Col 1</div>';

        if ((index % 3) == 2) items += '</div>';
});

if (items.substr(-12) != '</div></div>') items += '</div>';
于 2013-09-17T05:21:03.387 回答
4

向左走,不要!改用 CSS。

将您的span3班级设计为具有 30 % 的 with 并显示内联块。这样,当您决定每行显示 2、4 或 60 个时,您只需更改 CSS。这也使您可以使用 CSS 媒体查询来更改每行的项目数,以针对不同的视口(例如移动设备)进行。

此外,当您返回的项目不能被 3 整除时,您无需担心关闭该行

附带说明一下,如果您决定采用 CSS 路线,请考虑使用<ul>and<li>代替,因为语义上您有一个列表。

http://jsfiddle.net/UKQef/1/

更新Fiddle 以展示li这种方法的使用和灵活性。

于 2013-09-17T05:34:32.690 回答
0

你应该使用模数:http: //msdn.microsoft.com/en-us/library/ie/9f59bza0 (v=vs.94).aspx 它给你一个除以两个数字的余数,所以你可以这样做像(在你的.each里面):

if(!($(this).index() % 2)){
  // Add your row
}

$(this).index() 返回您的 .each() 的索引,而 % 2 返回该索引的其余部分除以 2,因此前 3 次运行它会是这样的:

  • 0 / 2 = 0 = 添加一行
  • 1 / 2 = .5 = 不添加行
  • 2 / 2 = 1 = 不添加行

希望这就是你的意思。

于 2013-09-17T05:20:27.553 回答
0

这是我认为更清洁的方法:

// Map each product to a cell.
var cells = $(data).find('products').map(function() {
    var itemName = $(this).find('itemName').text();
    var itemDesc = $(this).find('itemDesc').text();
    var itemID = $(this).find('id').text();
    return $('<div></div>').addClass('span3').text(itemName+' '+itemDesc+' '+itemID);
});

// Collect the cells into rows.
var rows = [];
for (var i=0, j=cells.length; i<j; i+=3) {
    rows.push(
      $('<div></div>')
        .addClass('row-fluid')
        .append(cells.slice(i,i+3))
    );
}
于 2013-09-17T05:23:37.570 回答
0

解决您的问题的最佳方法是使用 jquery 模板。您可以通过 ajax 请求以 Json 格式获取数据,并通过 jquery 模板动态创建行:

 <script src="jquery.tmpl.js" type="text/javascript"></script>

 <script type="text/javascript">
   $(document).ready(function() {
   var data = [
   { name: "Astor", product: "astor", stocklevel: "10", price: 2.99},
   { name: "Daffodil", product: "daffodil", stocklevel: "12", price: 1.99},
   { name: "Rose", product: "rose", stocklevel: "2", price: 4.99},
   { name: "Peony", product: "peony", stocklevel: "0", price: 1.50},
   { name: "Primula", product: "primula", stocklevel: "1", price: 3.12},
   { name: "Snowdrop", product: "snowdrop", stocklevel: "15", price: 0.99},
   ];
   $('#flowerTmpl').tmpl(data).appendTo('#row1');
   });
  </script>

  <script id="flowerTmpl" type="text/x-jquery-tmpl">
   <div class="dcell">
   <img src="${product}.png"/>
   <label for="${product}">${name}:</label>
   <input name="${product}" data-price="${price}" data-stock="${stocklevel}"
   value="0" required />
   </div>
  </script>

html:

<div id="row1" class="drow"></div>
于 2013-09-17T05:30:25.713 回答
0
var $products = $(data).find('products');
var num_of_rows = Math.ceil($products.length/3)
//Create your rows here each row should have an id = "row" + it's index
$products.each(function(i,val){
    var row_index = Math.ceil(i/3)
    $('#row' + row_index).append("<div>Col"+i%3+"</div>")
});

像这样的东西应该工作

于 2013-09-17T05:31:02.587 回答