Slice выбирает не в том порядке из кколлекции
Задача стоит такая: есть определенное количество span, нужно завернуть их по три штуки, в div
Когда спанов 6, 9, 12 - все работает правильно А вот когда их не кратное трем количество, получается не то что мне надо: в первом диве один или два спана - а надо в последнем, + почему то 1-й спан в последнем диве Вообщем помогите пожалуйста, второй день не могу понять почему...
<script src="../js/jquery-1.3.2.min.js" type="text/javascript"></script>
<style type="text/css">
span {
width:100px; height:100px;
margin:5px; border:3px double #369;
}
div {
border:3px solid #369;
padding: 5px
}
</style>
<script type="text/javascript">
$(function(){
var perpage = 3;
num = $(".item span").length;
page = Math.ceil(num/perpage);
for (var i=1; i<page+1; i++) {
$(".item").append("<div class=item" + i + "></div>");
nws = $(".item span").slice(0,3);
$(".item" + i).html(nws);
}
});
</script>
</head>
<body>
<div class='item'>
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
<span>6</span>
<span>7</span>
<span>8</span>
<span>9</span>
<span>10</span>
<span>11</span>
<span>12</span>
<span>13</span>
</div>
|
а попробуй цикл в обратку пустить.
for (var i=page; i==1; i--) |
for (var i=page; i>0; i--) {
вот так вот дает тот же результат :( |
Я бы так делал:
var how = 3;
var par = $('div.item')[0];
while (true) {
var $span = $(par).children('span').eq(0); // первого непосредственного ребенка span
if ($span.length == 0 ) break;// не осталось -> выход
var $dp = $(par).find('div.obv:last'); // куда поместить
if (($dp.length == 0) || ($dp.children().length == how)) { // некуда
$dp = $('<div class="obv"></div>').appendTo($(par)); // создаем
}
$span.appendTo($dp); // переносим
}
<div class="obv"></div> - в такой div оборачиваем |
Спасибо! Ваш пример работает, хотя как для новичка, немного сложен. например $span = $("span") и зачем var $dp а не просто var dp
Вопрос остается вопросом? slice не правильно работает? Это как то с Dom связанно? Или функция не правильно реализована? |
var $dp
ничем не отличается от var dp по сути, просто так я подчеркиваю что $dp - именно jQuery объект. |
micscr, многовато как-то всего. Проще так:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Wrap test</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta name="generator" content="Geany 0.18.1.1" />
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
$(function(){
var i = 0,
perpage = 3,
items = $('.item span').get();
while (items.length) {
$(items.splice(0, perpage)).wrapAll('<div class=item-' + ++i + '></div>');
}
});
</script>
<style type="text/css">
span {
width:100px;
height:100px;
margin:5px;
border:3px double #369;
}
div {
border:3px solid #369;
padding: 5px;
}
</style>
</head>
<body>
<div class='item'>
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
<span>6</span>
<span>7</span>
<span>8</span>
<span>9</span>
<span>10</span>
<span>11</span>
<span>12</span>
<span>13</span>
</div>
</body>
</html>
|
Спасибо красивое решение, и с while похоже slice работает правильно.
items = $('.item span'); А вот без get() то же ведь можно? или это принципиально? |
alexsus, попробуйте, может и можно. Разницу между тем, что дает get, и тем, что возвращает $(), понимаете? Если нет -- почитайте.
Лично я считаю нехорошим стилем натравливать splice (не slice, это важно) на jQuery-объект. В моем понимании, это чем-то сродни изменению приватного свойства объекта напрямую, а не через setter. |
e1f, ага, так лучше, но есть минусик: при jQuery к тебе поступают javascript-вопросы:
Цитата:
|
| Часовой пояс GMT +3, время: 12:47. |