Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Зависимые Чекбоксы (код)
 
 автор: lElectroHardl   (22.09.2010 в 22:02)   письмо автору
 
 

Вот код, который делает видимыми только те чекбоксы, группа которых была выбрана в предыдущем чекбоксе.
Проблема в том, когда выбираешь чекбокс, нажимаешь SUBMIT и переходишь на другую страницу, а потом переходишь назад, то значение зависимого (2-го) чекбокса обнуляется... Как это исправить?
function synccat_ings()
{}
synccat_ings.prototype.sync = function()
{
    for (var i = 0; i < arguments.length - 1; i++)
        document.getElementById(arguments[i]).onchange = (function (o, id1, id2) { return function() { o._sync(id1, id2); }; }) (this, arguments[i], arguments[i+1]);
    document.getElementById(arguments[0]).onchange();
}
synccat_ings.prototype._sync = function (firstSelectId, secondSelectId)
{
    var firstSelect = document.getElementById(firstSelectId);
    var secondSelect = document.getElementById(secondSelectId);
    secondSelect.length = 0;
    if (firstSelect.length > 0)
    {
        var optionData = this.datacat_ings[firstSelect.options[firstSelect.selectedIndex == -1 ? 0 : firstSelect.selectedIndex].value];
        for (var key in optionData || null) 
            secondSelect.options[secondSelect.length] = new Option(optionData[key], key);
        if (firstSelect.selectedIndex == -1) 
            setTimeout( function(){ firstSelect.options[0].selected = true;}, 1 );
        if (secondSelect.length>0) 
            setTimeout( function(){ secondSelect.options[0].selected = true;}, 1 );
    }
    secondSelect.onchange && secondSelect.onchange();
};
// это начало кода 2-го чекбокса
var comand = new synccat_ings;
comand.datacat_ings = 
{
'0': {'0':'-- Ингредиент --'},
'1': {'1':'-- Яблоки --'}, // ...

Если нужно, выложу структуру Чекбоксов (но это очень много).
Заранее спасибо.

  Ответить  
 
 автор: АЯ   (23.09.2010 в 05:02)   письмо автору
 
   для: lElectroHardl   (22.09.2010 в 22:02)
 

Что-то у Вас явно перепутано.

"Чекбоксы", о которых Вы пишете, это русифицированное название тегов <input type="checkbox">
В выложенном Вами скрипте описываются действия с тегами <select>, которые по-русски обычно называются "списками" (реже - "комбобоксами").
Кроме того, пишете Вы о "видимости" этих самых "чекбоксов", а в скрипте речь идёт об "отмеченности" ("выборе") пунктов "списка".


Так что определитесь - "кто на ком стоял?" и, по-любому, дайте кусочек HTML-кода, чтобы было понятно - о чём все-таки идёт речь...

  Ответить  
 
 автор: lElectroHardl   (23.09.2010 в 09:27)   письмо автору
 
   для: АЯ   (23.09.2010 в 05:02)
 

Ой... Наверно пересидел перед компом немного.
Да, конечно, речь идет о SELECT`ах..
<select name='sub_cat_ing[0]' size='1' id='cat_ings00'></select>
<script type="text/javascript"> 
var comand = new synccat_ings;
comand.datacat_ings = 
{
'0': {'0':'-- Ингредиент --'},
'1': {'0':'-- Ингредиент --',
'10':'Лимон (г./кг.,шт.)','8':'Клубника (г./кг.,шт.)','89':'Бананы (г./кг.,шт.)', }, 
'2': {'0':'-- Ингредиент --',
'68':'Бульон (г./кг.,стакан.)','4':'Тесто (г./кг.,)', }, 
}; // это второй селект, таких много
comand.sync("cat_ings000", "cat_ings00");

  Ответить  
 
 автор: lElectroHardl   (23.09.2010 в 16:11)   письмо автору
 
   для: lElectroHardl   (22.09.2010 в 22:02)
 

Кто-то знает, как это сделать?

  Ответить  
 
 автор: АЯ   (23.09.2010 в 17:05)   письмо автору
 
   для: lElectroHardl   (23.09.2010 в 16:11)
 

Можно сказать следующее: в разных браузерах дело обстоит по-разному.
Например, при проверке нижеследующего простейшего кода
<form name="frm" action="http://google.com/" method="post">
<select name="slc">
<option>1111111111111</option>
<option>2222222222222</option>
<option>3333333333333</option>
<option>4444444444444</option>
<option>5555555555555</option>
</select>
<script>
document.forms.frm.slc.options[1].selected = true;
</script>
<input type="submit">
</form>
выяснилось, что браузеры MSIE, FF, Opera при возврате на страницу формы сохраняют выбор клиента (т. е. не исполняют скрипт). А браузер GChrome - скрипт исполняет и устанавливает selectedIndex = 1

У Вас же ситуация сложнее - и сами опшены создаются скриптом, и установка selectedIndex происходит с таймаутом. Что там у Вас получается в разных браузерах - не знаю. Полагаю, что в каком-либо браузере скрипт исполнится...


В общем, совет таков - на кнопку сабмита Вам следует "повесить" функцию, коя будет записывать в куках выбор клиента по схеме: имя_селекта_1=его_selectedIndex;имя_селекта_2=его_selectedIndex;..
Кукам этим следует дать минимальное "время жизни" - три-пять минут.
Соответственно, в самом начале скрипта, создающих списки, Вам следует прочитать куки и, если они есть на браузере клиента, скриптом восстановить выбор клиента.

  Ответить  
 
 автор: lElectroHardl   (23.09.2010 в 19:12)   письмо автору
 
   для: АЯ   (23.09.2010 в 17:05)
 

А есть ли другой, менее велосипедостроительный вариант?
Может скрипт другой или доработка основного скрипта?...
А то JS в принципе для меня темный лес.

  Ответить  
 
 автор: АЯ   (24.09.2010 в 00:43)   письмо автору
 
   для: lElectroHardl   (23.09.2010 в 19:12)
 

Вариант есть - исключить скрипт из исходника.
Если сделаете все Ваши селекты на чистом HTML, то никаких проблем с сохранением выбора клиента при возврате не будет.

  Ответить  
 
 автор: lElectroHardl   (24.09.2010 в 18:27)   письмо автору
 
   для: АЯ   (24.09.2010 в 00:43)
 

Изначально так и было, но для удобства желательно разделять результаты на 2 селекта, т.к. в 1 селекте будет более 300 option`ов, а таких селектов будет 20 штук. В каждом селекте найти что-то будет очень трудно.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования