Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.06.2010, 15:42
Новичок на форуме
Отправить личное сообщение для alexsus Посмотреть профиль Найти все сообщения от alexsus
 
Регистрация: 09.06.2010
Сообщений: 6

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>
Ответить с цитированием
  #2 (permalink)  
Старый 09.06.2010, 15:48
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

а попробуй цикл в обратку пустить.
for (var i=page; i==1; i--)
__________________
.
Ответить с цитированием
  #3 (permalink)  
Старый 09.06.2010, 15:53
Новичок на форуме
Отправить личное сообщение для alexsus Посмотреть профиль Найти все сообщения от alexsus
 
Регистрация: 09.06.2010
Сообщений: 6

for (var i=page; i>0; i--) {

вот так вот дает тот же результат
Ответить с цитированием
  #4 (permalink)  
Старый 09.06.2010, 16:05
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,566

Я бы так делал:
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 оборачиваем
Ответить с цитированием
  #5 (permalink)  
Старый 09.06.2010, 16:21
Новичок на форуме
Отправить личное сообщение для alexsus Посмотреть профиль Найти все сообщения от alexsus
 
Регистрация: 09.06.2010
Сообщений: 6

Спасибо! Ваш пример работает, хотя как для новичка, немного сложен. например $span = $("span") и зачем var $dp а не просто var dp
Вопрос остается вопросом? slice не правильно работает? Это как то с Dom связанно? Или функция не правильно реализована?
Ответить с цитированием
  #6 (permalink)  
Старый 09.06.2010, 16:24
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,566

var $dp
ничем не отличается от
var dp
по сути, просто так я подчеркиваю что $dp - именно jQuery объект.
Ответить с цитированием
  #7 (permalink)  
Старый 09.06.2010, 16:35
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

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>
Ответить с цитированием
  #8 (permalink)  
Старый 09.06.2010, 16:43
Новичок на форуме
Отправить личное сообщение для alexsus Посмотреть профиль Найти все сообщения от alexsus
 
Регистрация: 09.06.2010
Сообщений: 6

Спасибо красивое решение, и с while похоже slice работает правильно.
items = $('.item span'); А вот без get() то же ведь можно? или это принципиально?
Ответить с цитированием
  #9 (permalink)  
Старый 09.06.2010, 16:49
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

alexsus, попробуйте, может и можно. Разницу между тем, что дает get, и тем, что возвращает $(), понимаете? Если нет -- почитайте.
Лично я считаю нехорошим стилем натравливать splice (не slice, это важно) на jQuery-объект. В моем понимании, это чем-то сродни изменению приватного свойства объекта напрямую, а не через setter.
Ответить с цитированием
  #10 (permalink)  
Старый 09.06.2010, 16:53
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,566

e1f, ага, так лучше, но есть минусик: при jQuery к тебе поступают javascript-вопросы:
Цитата:
А вот без get() то же ведь можно?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск