На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
  
> Динамическая подгрузка меню
    На моём сайте используется простое иерархическое меню а-ля Проводник.

    Для использования такого меню в более серьёзных проектах необходимо динамически подгружать (а если выгружать, то вообще отлично) ветки меню, которые выбирает пользователь. В настоящее время структура меню генерится из базы и один раз подгружается на страницу, при обновлении структуры меню приходится обновлять страницу. При малых объёмах данных в меню этот способ приемлем.

    В настоящее время я работаю над проектом в котором иерархическое меню может и будет очень быстро расти в объёме. Загружать его за один раз, тем более по интернету, будет очень накладно, если не фатально! На сайте RSDN есть то что мне надо. Я конечно выдеру необходимое оттуда, но желательно разъяснить как именно это работает.

    Заранее благодарен!
      мне тоже интересно как там работает, этот вопрос меня волновал давно, но могу предложить альтернативу:

      попробуй использовать xml - обычный текстовый файл и не нужно никакой базы данных - все, что надо - это скрипт на javascript, который обходит xml-файл и выводит на экран дерево

      если идти дальше - можно этот xml-файл генерить на php автоматически, используя информацию из базы(например при внесении каких-либо изменений в базу вызывать этот скрипт)
        Цитата
        RaD, 31.08.04, 18:34
        На моём сайте используется простое иерархическое меню а-ля Проводник.

        Сам делал? :)
          Мда... посмотрел я RSDN'овское меню,
          там используется старый способ динамической подгрузки
          контента через IFRAME.
          Реализация,должен заметить, -- на мой взгляд, ужасная, ОЧЕНЬ много лишнего HTML'я, я бы рекомендовал автору этого меню заново перечитать учебник по HTML
          Цитата

          <UL>
          ................
          <LI ID=li182>
          <A ONCLICK=expand('182',this); href=?node=182 title=Архивы>
          <IMG ALIGN=absmiddle alt=Архивы src=../images/tree/atc.gif ID=img182>Архивы</A>
          <IFRAME NAME=fra182></IFRAME>
          </LI>
          <UL class=Hidden ID=ul182></UL>
          </UL>

          Обратите внимание красным цветом выделено то что можно было-бы
          написать всего один , максимум два раза, но никак не ШЕСТЬ (следствие весьма поверхностного знания DOM)
          Жирным шрифтом синего цвета выделен тег </LI>
          который явно стоит не на своём месте, ведь UL не может содержать никаких других тегов кроме как <LI>,
          а в данном коде получается что UL(самый верхний) содержит другой тег UL - что являеться очень грубой ошибкой
          (браузеры не обязаны её прощать)
          Т.е. верстку и клиентские скрипты - на RSDN делал не профи.
          Вывод: копировать это меню не стоит.
            Цитата Mixxx @ 31.08.04, 20:30
            Цитата
            RaD, 31.08.04, 18:34
            На моём сайте используется простое иерархическое меню а-ля Проводник.

            Сам делал? :)

            Делал сам, по материалам сайта dhtml.ru.

            Добавлено в :
            Цитата shipbrother @ 31.08.04, 19:47
            мне тоже интересно как там работает, этот вопрос меня волновал давно, но могу предложить альтернативу:

            попробуй использовать xml - обычный текстовый файл и не нужно никакой базы данных - все, что надо - это скрипт на javascript, который обходит xml-файл и выводит на экран дерево

            если идти дальше - можно этот xml-файл генерить на php автоматически, используя информацию из базы(например при внесении каких-либо изменений в базу вызывать этот скрипт)

            Зачем вводить промежуточный слой между MySQL и PHP. У меня есть давно отлаженный класс для работы с этой БД.
            Проблема в том, что информация о меню может меняться очень часто, а самое главное, она может быстро расти в объёме.
            Тебе приятно будет закачивать пару мегабайт в окно меню?

            В обычных приложениях обычно рисуют элементы верхнего уровня меню. При нажатии пользователем на конкретную ветку происходит подгрузка содержимого выбранной ветки, а затем ветка открывается. Если ветка закрыта и не используется некоторое время, можно произвести выгрузку содержимого ветки для освобождения памяти.

            Меня интересует именно такой аспект. Можно ли такое реализовать на JavaScript???
              Цитата
              RaD, 1.09.04, 09:49
              Тебе приятно будет закачивать пару мегабайт в окно меню

              если ты используешь xml - объем меню будет окоро 20kb(супербольшое меню), а выводить на экран и раскрашивать его будет javascript(как вариант), то есть при каждом нажатии на раздел в меню будет выполняться скрипт, который будет перерисовывать меню, а не перегружать его.

              Цитата
              RaD, 1.09.04, 09:49
              В обычных приложениях обычно рисуют элементы верхнего уровня меню. При нажатии пользователем на конкретную ветку происходит подгрузка содержимого выбранной ветки, а затем ветка открывается.

              а с использованием javascript + xml, меню будет все время в памяти и будет объемом не более маленького текстового файла
              Удобно? По-моему очень!

              Цитата
              RaD, 1.09.04, 09:49
              У меня есть давно отлаженный класс для работы с этой БД

              я конечно понимаю, что если механизм налажен, то отойти от него сложно. поэтому и предложил используя БД переделывать xml-файл, но в принципе можно было бы сразу(минуя БД) делать xml

              Добавлено в :
              я делал такое меню. на основе xml и javascript. могу продемонстрировать, если заинтересует.
              Сообщение отредактировано: shipbrother -
                Цитата shipbrother,1.09.04, 11:39
                я делал такое меню. на основе xml и javascript. могу продемонстрировать, если заинтересует.

                Если твой вариант меню сможет отработать с таблицой из 10 000 элементов, то я с интересом на него гляну!
                  Не знаю, я его с таким объемом не тестировал...

                  Тут важно вот что:
                  --- если иерархическая структура твоего меню генериться автоматически исходя из выборки по БД(то есть иерархия строится на основе полей РАЗДЕЛ, ПОДРАЗДЕЛ, ПОДПОДРАЗДЕЛ и т.д. КАЖДОЙ записи), то xml - плохая альтернатива,
                  --- а если иерархия хотя бы частично(на уровне 1-3 ступеней) предопределена(т.е. например имеется несколько таблиц в базе, соответствующих каждому разделу или подразделу), то есть смысл протестить мой вариант на 10000 записей.

                  как у тебя это все устроено?
                    Цитата shipbrother,1.09.04, 12:55
                    --- если иерархическая структура твоего меню генериться автоматически исходя из выборки по БД(то есть иерархия строится на основе полей РАЗДЕЛ, ПОДРАЗДЕЛ, ПОДПОДРАЗДЕЛ и т.д. КАЖДОЙ записи), то xml - плохая альтернатива,

                    Именно про это и говорю. Уровень вложенности может быть произвольным. База большая, рост непредсказуем.
                    Оптимально, именно подгружать нужную ветку и выгружать через некоторое время неактивности.

                    Твою идею я понял, её можно переделать так:

                    Цитата
                    Копирайт адназначна!

                    1. В скрытый фрейм (старо как мир), подгружаем содержимое выбранной ветки (только верхний уровень) в виде XML или CSV (это пофиг).
                    2. Скрипт перегенерирует меню из ещё одного (главного) скрытого фрейма с учетом подгруженной информации.
                    3. Во время перегенерации, если есть "подгруженная" ветка/ветки, она закрыта и давно не открывалась (это надо хранить), то игнорировать её содежимое (происходит "выгрузка").

                    Думаю, этот алгоритм мне подойдёт.


                    Кстати, иерархия делается не по РАЗДЕЛ, ПОДРАЗДЕЛ, ПОДПОДРАЗДЕЛ и т.д, а по типу ID, PARENT_ID. Это предоставляет нам требуемую гибкость при создании иерархии.
                      RaD
                      Сегодня сделал простенькое меню с динамической подгрузкой узлов
                      В аттаче все необходимые файлы (Но учти что в IE работает только если запускать файл с сервера, а не с диска)
                      Скрипт кросбраузерный: IE 5.01, IE 6.0, IE 6.0, Opera 7.60 и Mozilla
                      Прикреплённый файлПрикреплённый файлxmlMenu.zip (5.73 Кбайт, скачиваний: 167)
                        Справочник по javascript и объектам в студию.

                        Особенно интересно, где берут информацию про XMLHttpRequest и так далее.
                        Интересует направление в сторону Mozilla.
                            Повозился на выходных, почитал, попрограммировал...

                            Очень интересная технология. Наполовину переделал код, теперь он работает "правильно", т.е. как надо мне :)
                            Теперь можно многое делать, не перегружая страничку, экономия траффика в чистом виде!
                            Надо протестировать идею и заставить переделать текущий форум...
                              Цитата
                              RaD, 6.09.04, 13:06
                              Теперь можно многое делать, не перегружая страничку, экономия траффика в чистом виде!

                              А как же системы удалённой статистики (mail, rambler top 100, RAX, Hot Log) ?
                                Нам шашечки или ехать? :)

                                Если сайт для работы, пример Дозор, то нам статистика ни к чему...

                                Я на этот форум хожу только с работы, дома у меня GPRS и просмотр нескольких тем форума выведет из олигархического состояния счёт моего мобильника. Экономика должна быть экономной (с) неглупый человек
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0459 ]   [ 15 queries used ]   [ Generated: 27.04.24, 21:10 GMT ]