powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / JQuery. Неправильно строит список
10 сообщений из 10, страница 1 из 1
JQuery. Неправильно строит список
    #38342445
xPhoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Создаю своё дерево элементов с помощью вот этого кода:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Дерево</title>
        <link rel="stylesheet" type="text/css" href="css/tree.css" />
        <script type="text/javascript" src="jquery-2.0.3.js"></script>

        <script type="text/javascript">
            $(document).ready(function() {
                var tree = $('#treediv');
                $(tree).find('ul:first').addClass('first');

                var folders = $(tree).find('span');

                $(folders).before('<div class="clip"><div class="-closed-folder"></div></div>');
                $(folders).wrap('<div class="cell"></div>');

                simpleLi = $(tree).find('li');

                for (var i = 0; i < $(simpleLi).size(); i++) {
                    if ($(simpleLi[i]).children('ul').size() === 0) {
                        $(simpleLi[i]).wrapInner('<div class="cell"></div>');
                        $(simpleLi[i]).prepend('<div class="clip"><div class="-office"></div></div>');
                    }
                }


            });
        </script>
    </head>
    <body>
        <div id="treediv" style="width: 400px;">
            <ul>
                <li><span>Закрытая папка 1</span>
                    <ul>
                        <li>Первый элемент</li>
                        <li>Второй элемент</li>
                        <li>Третий элемент</li>
                        <li>Четвертый элемент</li>
                    </ul>
                </li>
                <li><span>Закрытая папка 1</span>
                    <ul>
                        <li>Первый элемент</li>
                        <li>Второй элемент</li>
                        <li>Третий элемент</li>
                        <li>Четвертый элемент</li>
                    </ul>
                </li>
            </ul>
        </div>
    </body>
</html>


Также CSS:

Код: css
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
html, body {
    width: 100%;
    height: 100%;
}

html, body, div, span, p, ul, li {
    margin: 0;
    padding: 0;
}

li, ul{
    list-style: none;
    white-space: nowrap;
}

.cell{
    vertical-align: middle;
    display: table-cell;
    height: 32px;
    padding-left: 32px;

}

.link{
    cursor: pointer;
}

.link:hover{
    color: red;
}

li{
    height: 32px;
}

ul.first{
    margin: 0;
}

ul {
    margin-left: 32px;
    margin-top: 2px;
}

#treediv {
    width: 300px;
    height: 100%;
    overflow: auto;
    background-color: gray;
}

#treediv p{
    font-weight: normal;
    font-size: 1em;
    color: black;
}

.-crop{
    width: 32px;
    height: 32px;
    overflow: hidden;
    float: left;
}

.-closed-folder, .-opened-folder, .-office{
    background: url("./img/treeitems.png") no-repeat;
    position: absolute;
    display: block;
    width: 32px;
    height: 32px;
}

.-closed-folder {
    background-position: 0 0;
}

.-closed-folder ul{
    display: none;
}

.-opened-folder{
    background-position: 0 -32px;
}

.-opened-folder ul {
    display: inherit;
}

.-office{
    background-position: 0 -64px;
}



Почти всё хорошо, но вместо того, чтобы получить две папки одну под другой в дереве, получаю то, что подпункты одной папки накладываются на другую:

В чём ошибка?
...
Рейтинг: 0 / 0
JQuery. Неправильно строит список
    #38342513
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте
Код: css
1.
2.
3.
li{
    height: 32px;
}

заменить например на
Код: css
1.
2.
3.
li ul li{
    height: 32px;
}
...
Рейтинг: 0 / 0
JQuery. Неправильно строит список
    #38342662
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xPhoenix,

Это вроде jquery, в которой я полный ноль. Но известно заранее что там где дерево - там лучше всего подходит рекурсия. Поскольку у вас функция безымянная, этого достаточно чтобы понять - рекурсии нет. Кроме того я не понял откуда берутся данные. Функция сама их сооружает в процессе сооружения?

Я бы предложил сперва описать дерево, а потом натравить на него функцию выращивания. Тогда вы можете легко менять вид редактируя описание.

http://www.sitepoint.com/xml-data-traversal/

Описание под строкой Consider the following XML file:

муть загрузки xml можно пропустить, поскольку вы можете прямо в скрипте все описать

Рекурсия выращивания дерева под строкой Now, let’s take a look at the function that does the XML data traversal, traverse():
...
Рейтинг: 0 / 0
JQuery. Неправильно строит список
    #38342723
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, тут похоже вообще ничего не создается, а только заселяется уже построенное.

Кстати, можно без рекурсии если описать дерево плоской таблицей. Что не очень наглядно, зато проще чем xml.

folder - level
Папка1 - 1
Папка2 - 1
Папка3 - 2
Папка4 - 2
Папка5 - 3
и так далее

Что значит Папка1 в корне но пустая, Папка2 в корне и внутри у нее Папка3 и Папка4. Папка4 содержит Папка5 и так далее. Чтобы добавить папку в Папка1 надо под ней вписать Папка6 - 2.

Функция на php из класса NestedSet * @author Mark Stuppacher <mark@happynet.at>; без рекурсии, прикольно сделано:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
	/**
	 * Get the HTML code for an unordered list of the tree
	 * @return string HTML code for an unordered list of the whole tree
	 */
	public function treeAsHtml() {
		$tree = $this->getTree();
		$html = "<ul>\n";
		for ($i=0; $i<count($tree); $i++) {
			$html .= "<li>" . $tree[$i][$this->name];
			if ($tree[$i]['level'] < $tree[$i+1]['level']) {
				$html .= "\n<ul>\n";
			} elseif ($tree[$i]['level'] == $tree[$i+1]['level']) {
				$html .= "</li>\n";
			} else {
				$diff = $tree[$i]['level'] - $tree[$i+1]['level'];
				$html .= str_repeat("</li>\n</ul>\n", $diff) . "</li>\n";
			}
		}
		$html .= "</ul>\n";
		return $html;
	}



Переписать на яву как два пальца. Функция работает на ошибке. Попустит ли js я не знаю. Такого элемента массива $tree[$i+1] - естественно может не оказаться.
...
Рейтинг: 0 / 0
JQuery. Неправильно строит список
    #38342726
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл отметить что функция как раз заточена под описание дерева как в предыдущем сообщение - папка - уровень
...
Рейтинг: 0 / 0
JQuery. Неправильно строит список
    #38343176
xPhoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, почитал Ваши ответы. Ошибка крылась, как правильно заметил Паганель, именно в CSS - нельзя явно задавать высоту элементов <li>. Когда я убрал эту строку, элементы перестали накладываться друг на друга и стали отображаться нормально. Сейчас сделал так, что при нажатии на папку открываются дочерние элементы. Правда, сейчас при щелчке на "офис" папка закрывается. Как-то не так расставил обработчики, но скоро уже сделаю. Если интересно, как, просто продолжайте читать эту тему.
Правильный (на 9 утра 25.07.13) код JavaScript для собирания дерева вот:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
<script type="text/javascript">
    $(document).ready(function() {
        var tree = $('#treediv');
        $(tree).find('ul:first').addClass('first');

        //Феерическая расстановка папок в элементы списка
        var folders = $(tree).find('span');
        $(folders).before('<div class="clip"><div class="-closed-folder"></div></div>');
        $(folders).wrap('<div class="cell"></div>');

        //Расстановка домиков возле офисов
        var hives = $(tree).find('li');

        $(hives).addClass('link');

        for (var i = 0; i < $(hives).size(); i++) {
            if ($(hives[i]).find('ul').size() === 0) {
                $(hives[i]).wrapInner('<div class="cell"></div>');
                $(hives[i]).prepend('<div class=clip><div class="-office"></div></div>');
            }
        }

        //Прячем все офисы в папки
        var ulItems = $(tree).find('ul');
        for (var i = 0; i < $(ulItems).size(); i++) {
            if (!$(ulItems[i]).hasClass('first')) {
                $(ulItems[i]).addClass('hidden');
            }
            $(ulItems[i]).parent('li').click(openCloseFolder);
        }
    });

    function openCloseFolder() {
        childUl = $(this).children('ul:first');
        parentLiDiv = $(this).children('div.clip').children('div');
        if (!parentLiDiv) {
            alert("Не найден");
        }
        addUlClass = 'show';
        remUlClass = 'hidden';
        addLiClass = '-opened-folder';
        remLiClass = '-closed-folder';

        if ($(childUl).hasClass('show')) {
            addUlClass = 'hidden';
            remUlClass = 'show';
            addLiClass = '-closed-folder';
            remLiClass = '-opened-folder';
        }

        $(childUl).removeClass(remUlClass).addClass(addUlClass);
        $(parentLiDiv).removeClass(remLiClass).addClass(addLiClass);
    }
</script>


Кроме того, картинка, если интересно, что получилось:
...
Рейтинг: 0 / 0
JQuery. Неправильно строит список
    #38343201
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
откройте для себя http://api.jquery.com/jQuery.each/ ато больно смотреть
...
Рейтинг: 0 / 0
JQuery. Неправильно строит список
    #38343202
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
JQuery. Неправильно строит список
    #38343332
xPhoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Паганель, по-русски и очень доступно об этой функции написано здесь . С учётом этого мой код стал ещё лучше и выглядит теперь так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
<script type="text/javascript">
    $(document).ready(function() {
        var tree = $('#treediv');
        $(tree).find('ul:first').addClass('first');

        //Феерическая расстановка папок в элементы списка
        $(tree).find('span')
                .before('<div class="clip"><div class="-closed-folder"></div></div>')
                .wrap('<div class="cell"></div>');


        //Расстановка домиков возле офисов
        $(tree).find('li').addClass('link').each(
                function() {
                    if ($(this).find('ul').size() === 0) {
                        $(this).wrapInner('<div class="cell"></div>');
                        $(this).prepend('<div class=clip><div class="-office"></div></div>');
                    }
                });


        $(tree).find('ul').each(
                function() {
                    if (!$(this).hasClass('first')) {
                        $(this).addClass('hidden');
                    }
                });


        cells = $(tree).find('.cell');
        for (var i = 0; i < $(cells).size(); i++) {
            if ($(cells[i]).parent('li').find('ul').size() > 0) {
                $(cells[i]).click(openCloseFolder);
            }
            else
            {
                $(cells[i]).click(openOffice);
            }
        }
    });

    function openCloseFolder() {
        parentLi = $(this).parent('li');
        childUl = parentLi.children('ul:first');
        parentLiDiv = parentLi.children('div.clip').children('div');
        if (!parentLiDiv) {
            alert("Не найден");
        }
        addUlClass = 'show';
        remUlClass = 'hidden';
        addLiClass = '-opened-folder';
        remLiClass = '-closed-folder';

        if ($(childUl).hasClass('show')) {
            addUlClass = 'hidden';
            remUlClass = 'show';
            addLiClass = '-closed-folder';
            remLiClass = '-opened-folder';
        }

        $(childUl).removeClass(remUlClass).addClass(addUlClass);
        $(parentLiDiv).removeClass(remLiClass).addClass(addLiClass);
    }

    function openOffice() {
        alert('Вы нажали на офис');
    }
</script>

...
Рейтинг: 0 / 0
JQuery. Неправильно строит список
    #38390742
xPhoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В результате долгих поисков забил на самостоятельное создание плагина и пользуюсь вот этим . Надеюсь, кому-нибудь эта информация будет полезна.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / JQuery. Неправильно строит список
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]