Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Сохранение параметров - что использовать?


Автор: GrAndrey 30.9.2004, 10:35
Помогите, плиз.
Имею древовидное меню. Работает через яваскрипт - меняется id, соотвественно срабатывает стиль css. При каждом переходе по ссылке меню снова сворачивается. Хотелось бы оставлять развернутое - развернутым. Для этого нужно передавать небольшой массив на новую страницу. Через УРЛ не хочу - некрасиво, особенно для обычных страниц сайта. Куки не пойдут, т.к. ставятся вначале, а пользователь меняет состояние позже. Что здесь можно придумать? И стоит ли с этим вообще связываться?

Автор: Ignat 30.9.2004, 10:50
А почему тогда в PHP?
Нарисуй форму и отправляй её POST'ом. JavaScript используй.

Автор: GrAndrey 30.9.2004, 11:51
Цитата(Ignat @ 30.9.2004, 10:50)
А почему тогда в PHP?
Нарисуй форму и отправляй её POST'ом. JavaScript используй.

Это как? Инпуты связать с массивом? На каждую ссылку завязать сабмит? Что-то не представляю.

Вот код инициализации деревца:
Код

<script>
function initTree(root)
 { for(var i=0; i<root.childNodes.length; i++)
     { if(/li/i.test(root.childNodes[i].nodeName))
         { uls = root.childNodes[i].getElementsByTagName('ul');
           if(uls.length)
             { root.childNodes[i].firstChild.onclick = function(e)
                 { target = e?e.currentTarget:window.event?this:null;
                   if(!target) return;
                   ul = (target.parentNode.getElementsByTagName('ul'))[0];
                   if(ul.style.display=='none')
                     { ul.style.display = '';
                       target.className = target.className.replace(/\scollapsed\b/,' expanded');
                     }
                   else
                     { ul.style.display = 'none';
                       target.className = target.className.replace(/\sexpanded\b/,' collapsed');
                     }

                 };
               uls[0].style.display = 'none';
               root.childNodes[i].firstChild.className += ' collapsed';
               initTree(uls[0]);
             }
         }
     }
 }
</script>


Далее тока <ul id="root"> и т.д.

Автор: Ignat 30.9.2004, 12:10
Не силен я в JS, но понимаю нужно так:
1. Содать форму, с передаваемыми параметрами.
2. Создать ф-цию присваивающую полям формы переменные и осуществляющую сабмит формы.
3. Каждому элементу меню сопопставить событие onCLick с вызовом ф-ции, которой в качестве аргументов передаются посылаемые значения/массив.
Добавлено @ 12:11
2 MuToGeN и IZ@TOP эту тему, наверное, в ЯваСкрипт переместить надо?

Автор: GrAndrey 30.9.2004, 14:00
Цитата(Ignat @ 30.9.2004, 12:10)
2 MuToGeN и IZ@TOP эту тему, наверное, в ЯваСкрипт переместить надо?

Т.е. Ignat однозначно установил, что без JS не обойтись?

Автор: Ignat 30.9.2004, 14:02
Цитата(GrAndrey @ 30.9.2004, 15:00)
Т.е. Ignat однозначно установил, что без JS не обойтись?

bored.gif Однако...

Автор: GrAndrey 30.9.2004, 16:24
Нашел в FAQ обсуждение. Разочарован. Значит, тока через форму... sad.gif

Автор: Aliance 30.9.2004, 21:44
Цитата(Ignat @ 30.9.2004, 10:50)
JavaScript используй.

Абсолютно верно!

Делаем фреймы, и передаем параметры через фреймы (есть функции escape() и unescape())

Можно еще и с использованием XML (фреймы допустимы для стандарта XHTML 1.0 для фреймов, проблем не будет.)

Написал бы функцию, да бе твоей функции меню не получиться, кидай ее...

P.S. перенесите тему в JS
Добавлено @ 21:46
P.P.S.: возможно это будет в скоропоявявщемся FAQ`е по JavaScript`ам

Автор: GrAndrey 30.9.2004, 22:51
Цитата(Aliance @ 30.9.2004, 21:44)
Цитата(Ignat @ 30.9.2004, 10:50)
JavaScript используй.

Абсолютно верно!

Делаем фреймы, и передаем параметры через фреймы (есть функции escape() и unescape())

Можно еще и с использованием XML (фреймы допустимы для стандарта XHTML 1.0 для фреймов, проблем не будет.)

Написал бы функцию, да бе твоей функции меню не получиться, кидай ее...

P.S. перенесите тему в JS
Добавлено @ 21:46
P.P.S.: возможно это будет в скоропоявявщемся FAQ`е по JavaScript`ам

Мне этот скрипт понравился, увы, не помню кто автор. Вроде, должен работать везде.
Повторно привожу код инициализации.

Код

<script>
function initTree(root)
 { for(var i=0; i<root.childNodes.length; i++)
     { if(/li/i.test(root.childNodes[i].nodeName))
         { uls = root.childNodes[i].getElementsByTagName('ul');
           if(uls.length)
             { root.childNodes[i].firstChild.onclick = function(e)
                 { target = e?e.currentTarget:window.event?this:null;
                   if(!target) return;
                   ul = (target.parentNode.getElementsByTagName('ul'))[0];
                   if(ul.style.display=='none')
                     { ul.style.display = '';
                       target.className = target.className.replace(/\scollapsed\b/,' expanded');
                     }
                   else
                     { ul.style.display = 'none';
                       target.className = target.className.replace(/\sexpanded\b/,' collapsed');
                     }

                 };
               uls[0].style.display = 'none';
               root.childNodes[i].firstChild.className += ' collapsed';
               initTree(uls[0]);
             }
         }
     }
 }
</script>


не забыть стартануть:
Код
<body onload="initTree(document.getElementById('root'))">


Описание меню такое:

Код

<ul id="root">
 <li><h2>Раздел 1</h2>
     <ul>
         <li><a href="1.php">Ссылка1</A></li>
         <li><a href="2.php">Ссылка2</a></li>
         <li><a href="3.php">Ссылка3</A></li>
     </ul>
 </li>
 <li><h2><a href="4.php">Раздел_ссылка</a></h2></li>
</ul>


и ещё часть эффекта заложена в css:

Код

#root li
{ list-style: none; }

#root h2, #root h3, #root h4, #root li
{
   padding: 0.15em 0px 0.15em 0px;
   margin: 0px;
   line-height: 120%;
}

.collapsed
{ background: url("p.gif") no-repeat left center;
   cursor: pointer;
   cursor: hand;
}

.expanded
{ background: url("m.gif") no-repeat left center;
   cursor: pointer;
   cursor: hand;
}


Кстати, интересно узнать, нет ли проблем во втором случае, где раздел/ссылка. У меня в ИЕ и Опере работает, но один человек говорил что были проблемы.

Хотелось бы сильно не корежить имеющееся. Как передать массив через пост (сохраняя его имя) я уже разобрался. Вот как я это решил силами php:
Код

<?php
 $temp=$myarray;
 foreach ($temp as $cur)
 echo "<INPUT type=hidden name=\"myarray[]\" value=$cur>";
?>


Видно, нужно только сабмит на ссылки повесить. Это никаких проблем не вызовет? У всех работать будет? От слова фрейм в дрожь бросает - чтобы от них избавиться, php стал учить.

Автор: GoodBoy 1.10.2004, 11:11
Цитата(GrAndrey @ 30.9.2004, 11:35)
Куки не пойдут, т.к. ставятся вначале, а пользователь меняет состояние позже

И что из этого????? А почему нельзя при щелчке пользователем на меню поставить ещё одну запись в куку???? А при заходе на страницу проверить такое поле и если оно есть, то свернуть/развернуть нужное меню!!! я именно так и делал!

Автор: Gold Dragon 1.10.2004, 11:34
И я что-то не могу понять почему куки нельзя использовать. При переходах по ссылкам или закрытии страницы все переменные записываешь в куки, при открытии читаешь. Куда проще?

Автор: Alx 1.10.2004, 18:01
конечно, для таких вещей (почти) куки и были придуманы!

Автор: GrAndrey 1.10.2004, 21:30
Цитата(Red @ 1.10.2004, 11:34)
И я что-то не могу понять почему куки нельзя использовать. При переходах по ссылкам или закрытии страницы все переменные записываешь в куки, при открытии читаешь. Куда проще?

Я так понял из этого(цитата из мануалины по php):

setcookie() определяет куку для отправки вместе с остальной header-информацией. Куки обязаны быть отправлены до любых других шапок/headers (это ограничение кук, а не РНР). Это требует, чтобы вы помещали вызовы этой функции перед тэгами <html> или <head>.

Автор: Aliance 1.10.2004, 22:39
Цитата(GrAndrey @ 1.10.2004, 21:30)
цитата из мануалины по php

А теперь возьми очки -5 и внимательно прочти название подфорума smile.gif

Автор: GrAndrey 1.10.2004, 22:55
Цитата(Aliance @ 1.10.2004, 22:39)
Цитата(GrAndrey @ 1.10.2004, 21:30)
цитата из мануалины по php

А теперь возьми очки -5 и внимательно прочти название подфорума smile.gif

А меня в этот раздел насильно перенесли, я в форуме php поначалу запостился smile.gif
И в цитате говорилось:
Цитата
это ограничение кук, а не РНР

Я буквально так и понял.

Автор: Sardar 1.10.2004, 23:23
GrAndrey Собстна куку можно из JS установить smile.gif Каждый раз как только пользователь открывает какое нибудь подменю, его идентификатор можно записать в куку. При открытии стрницы JS скрипт проверяет наличие куки и если если кука существует, то открывет меню.

Автор: GrAndrey 3.10.2004, 12:18
А, допер. JS исполняется на компе пользователя, а потому может преспокойненько писать куки в любой времени, а php нужно доджаться следующей отправки страницы, чтобы приложить к ней куку. Значит, просто в мануале пхп по-дурацки написано.

Автор: GoodBoy 4.10.2004, 11:11
Цитата(GrAndrey @ 3.10.2004, 13:18)
А, допер. JS исполняется на компе пользователя, а потому может преспокойненько писать куки в любой времени

Именно!!!!!!!!!!!! :-))))))))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)