用jQuery拆分一行[Bootstrap | JSON]
Break one row with jQuery each [Bootstrap | JSON]
我是一个jQuery新手,最近有一个问题一直困扰着我。
我使用jQuery + Bootstrap + JSON来创建一个页面,并在Bootstrap网格中输出结果。我不知道如何描述它,但我会试着用代码写出来。
下面是我想要实现的输出。
<div id = "appendClasses">
<div class = "row">
<div class = "col-md-4"><p>Party 1</p></div>
<div class = "col-md-4"><p>Party 2</p></div>
<div class = "col-md-4"><p>Party 3</p></div>
</div>
<div class = "row">
<div class = "col-md-4"><p>Party 4</p></div>
<div class = "col-md-4"><p>Party 5</p></div>
<div class = "col-md-4"><p>Party 6</p></div>
</div>
</div>
这样的例子不胜枚举。
我有这样的HTML。
<div id = "appendClasses"></div>
并使用jQuery生成HTML并将其注入#appendClasses
.
$.getJSON(partyURL, function(partyURLResponse) {
var partyHTML = '';
$.each(partyURLResponse.data, function(partyIdx, party) {
/*optional stuff to do after success */
partyHTML += '<div class = "row">';
partyHTML += '<div class = "col-md-4">';
partyHTML += '<p>' + party.id + '</p>';
partyHTML += '</div>';
partyHTML += '</div>';
partyHTML += '</div>';
});
$('#appendClasses').html(partyHTML);
});
输出如下:
<div id = "appendClasses">
<div class = "row">
<div class = "col-md-4"><p>Party 1</p></div>
</div>
<div class = "row">
<div class = "col-md-4"><p>Party 2</p></div>
</div>
<div class = "row">
<div class = "col-md-4"><p>Party 3</p></div>
</div>
<div class = "row">
<div class = "col-md-4"><p>Party 4</p></div>
</div>
<div class = "row">
<div class = "col-md-4"><p>Party 5</p></div>
</div>
<div class = "row">
<div class = "col-md-4"><p>Party 6</p></div>
</div>
</div>
所以它在没有网格的一行中显示结果。我该如何解决这个问题?
在您当前的代码中,您将<div class='row'>
添加到每一方,您可以通过仔细计算当前id来解决它,并且:
- 当当前索引位于行首时,执行
partyHTML += '<div class = "row">';
- 当行项已满或循环以非空行结束时,执行
partyHTML += '</div>';
关闭它。
var count = 0;
var item_per_row = 3;
$.each(partyURLResponse.data, function(partyIdx, party) {
/*optional stuff to do after success */
if (count === 0) { // Start of a row
partyHTML += '<div class = "row">';
}
partyHTML += '<div class = "col-md-4">';
partyHTML += '<p>' + party.id + '</p>';
partyHTML += '</div>';
++count;
if (count === item_per_row) { // End of row
partyHTML += '</div>';
}
// It seems you mistakenly closed one more div in loop
// is it a typo?
// partyHTML += '</div>';
});
if (count > 0) { // Close the last row if it exist.
partyHTML += '</div>';
}
$('#appendClasses').html(partyHTML);
然而,当你使用纯文本来管理代码时(因为你似乎在每次迭代中添加了一个额外的</div>
),它很难维护,因为你使用jQuery,我建议你使用它的api来管理dom元素和它们的属性…等,这将更容易维护和做将来的更改。
var parties = [
{id: 1},
{id: 2},
{id: 3},
{id: 4},
{id: 5}
];
// Items per row.
var items_per_row = 3;
// current item counts in a row.
var item_count = 0;
// Create a row to place the created divs
var $row = $('<div>').addClass('row');
// Get target to place these items.
var $target = $('#appendClasses');
$.each(parties, function(partyIdx, party) {
/*optional stuff to do after success */
// Just use jquery's function to create the dom elements would be more clear.
var div = $('<div>'); // Create div.
var p = $('<p>').text(party.id); // Create p and add text to it.
div
.addClass('col-md-4') // add class `col-md-4` to div
.append(p) // append the p to the div
.appendTo($row); // append the div to the row.
++item_count;
// When item count reach limit, append row to target
// and create a new row for later elements.
if (item_count === items_per_row) {
$row.appendTo($target);
$row = $('<div>').addClass('row');
item_count = 0;
}
});
if (item_count > 0) {
$row.appendTo($target);
}
.row {
margin-bottom: 10px;
border: solid 1px blue;
padding: 10px;
width : 100px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "appendClasses"></div>
你可以在其他每个主体中使用,当json结构会像这里一样-我的快速柱塞代码。你可以从服务器数组的数组返回,然后它将很好地解析和渲染它像你需要的。
[
[{id: 1}, {id: 2}, {id: 3}],
[{id: 4}, {id: 5}, {id: 6}]
]
,然后这段代码将工作得很好:
$.each(partyURLResponse.data, function(partyIdx, party) {
/*optional stuff to do after success */
partyHTML += '<div class = "row">';
$.each(party, function(id, item) {
partyHTML += '<div class = "col-md-4">';
partyHTML += '<p>' + item.id + '</p>';
partyHTML += '</div>';
});
partyHTML += '</div>';
});
$('#appendClasses').append(partyHTML);
});
这是另一种使用最少代码的方法。我留下了内联注释来表示每行的作用。
var parties = [{id: 'p1'},{id: 'p2'},{id: 'p3'},{id: 'p4'},{id: 'p5'},{id: 'p6'}],
//Create empty containers for later use
$html = $rows = $(),
//Break limit
colsPerWrap = 3;
$.each(parties, function(partyIdx, party) {
//Create a jQuery object with the desired content
var $col = $("<div/>", {
'class': 'col-md-4',
'html': '<p>' + party.id + '</p>'
});
//Add the created object to the container
$rows = $rows.add($col);
//At every break limit
if ( (partyIdx+1) % colsPerWrap === 0 ) {
//Append the cols to the inner wrapper
var $wrap = $("<div/>", { 'class': 'row' });
$wrap.append($rows);
//Empty the container for the next iteration
$rows = $();
//Populate the container with each inner wrapper
$html = $html.add($wrap);
}
});
//Always append outside the loop as DOM scan is expensive!
$('#appendClasses').empty().append($html);
.row {
border: 1px solid green;
margin-bottom: 20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "appendClasses"></div>
相关文章:
- jQuery匹配JSON对象的部分文本
- 在循环中分配json值时,值被覆盖
- 需要帮助设置json数组
- 使用Bootstrap将JSON文件加载到表中
- Bootstrap模态主体:Json在上传Codeigniter后刷新
- 使用Bootstrap 3 popover并加载外部JSON
- 如何在AngularJS Bootstrap模式中从AJAX调用加载JSON数据
- 在Twiiter Bootstrap v2中整合Typeahead/JSON数据源
- bootstrap模式应该已经选择了从json(Angular)获得的表行
- Bootstrap示例:将数据从JSON加载到表中
- 将JSON数据加载到Bootstrap模态中
- 从JSON数据填充Bootstrap Select2
- 用jQuery拆分一行[Bootstrap | JSON]
- Bootstrap 3 -在加载表中链接json
- 尝试使用JavaScript/jQuery从OMDb API解析JSON到HTML Bootstrap表
- 如何使用我的项目bower.json在Bootstrap中限制jQuery依赖关系
- 从Bootstrap-Treeview获取当前数据(object/json)
- 如何从JSON Flickr API加载图像到Bootstrap Modal
- 我们如何使用JSON在Bootstrap模式中生成表列文本
- 使用Twitter Bootstrap从JSON加载模态内容