URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 3130
[ Назад ]

Исходное сообщение
"JavaScript - связанные SELECT-ы"

Отправлено klyaznik , 03-Мрт-05 15:50 
Помогите пожалуйста сделать три связных SELECT-а. Пример: Район -> Улица -> Дом. То есть в одном SELECT-е выбираешь район - в другом остаются только нужные улицы, а в третьем - только нужные дома. Нашел код, которые делает связку Район -> Улица и не могу изменить его для связки трех SELECT-ов:
<html><head></head><body>
    <form name="info">
    <select name="segment_id" onChange="redirect(this.options.selectedIndex);" onClick="redirect(this.options.selectedIndex);">
    <option value="">Выберите сегмент</option>
    <option value="1">Ферма</option>
    <option value="2">Город</option>
    </select>
    <select name="street_id" onchange="modelvalue();">
    <option value="">Выберите улицу</option>
    </select>
    <script>
    var groups=document.info.segment_id.options.length
    var group=new Array(groups)
    for (i=0; i<groups; i++)
    group[i]=new Array()
    group[1][0]=new Option("Ясная","1")
    group[1][1]=new Option("Лесная","2")
    group[2][0]=new Option("Кооперативная","3")
    group[2][1]=new Option("Новоугличевский пр-т","4")
    group[2][2]=new Option("Спортивная","5")
    document.info.segment_id.index = document.info.segment_id.options[0].text;
    var temp=document.info.street_id;
    function redirect(x){
        for (m=temp.options.length-1;m>0;m--)
        temp.options[m]=null
        for (i=0;i<group[x].length;i++){
            temp.options[i]=new Option(group[x][i].text,group[x][i].value)
        }
        var prevalue = document.info.segment_id.value
        var sufvalue = temp.value
        document.revision.productid.value=(prevalue+"-"+sufvalue)
    }
    function modelvalue(){
        var prevalue2=document.info.segment_id.value
        var sufvalue2=document.info.street_id.value
        document.revision.productid.value=(prevalue2+"-"+sufvalue2)
    }
    </script>
    <input type=submit></form>
</body></html>

На крайний случай устроит связка такого типа - выбираешь район и в двух других SELECT-ах остаются данные, привязанные к району.


Содержание

Сообщения в этом обсуждении
"JavaScript - связанные SELECT-ы"
Отправлено XAnder , 04-Мрт-05 09:31 
Я сейчас работаю над схожей задачей. Не знаю, пригодится ли, но на всякий случай опишу.

Работаю с MySQL на PHP. В базе есть куча таблиц, некоторые связаны друг с другом внешними ключами или таблицами-связками. Структура базы сложна и может со временем изменяться. Для примера возьмём Ваш случай: три таблицы - Дома, Улицы, Районы - связаны внешними ключами Дома -> Улицы, Улицы -> Районы. Нужно выбирать SELECTом строку из Дома.

Предположим, что домов неподъёмное количество. Выдавать полный их список клиенту (даже в скрытом виде - внутри JavaScript, как в Вашем примере) - это плодить тонны ненужного трафика.

Сначала делаем SELECT для домов пустым и предлагаем выбрать улицу другим SELECTом, на который весим onChange следующего содержания:

open(
"filter.php?form=<название формы>&select=<название SELECTа>" +
"&tname=<название целевой таблицы (Дома)>" +
"&filterid=" + this.options[this.selectedIndex].value,
"filterWindow", "dependent=yes,width=100,height=100"
);

Смысл - подать запрос к серверу, открыв маленькое окошко, которое потом само себя закроет. Понимаю, что решение несколько кособоко, но работает :) Можно попробовать с IFRAME, наверное будет покрасивее, сам не пробовал.

Скрипт filter.php сделает запрос к БД, ему известно из какой таблицы брать данные, по какому значению внешнего ключа их фильтровать, в какую форму и в какой SELECT их складывать. Дальше - дело техники.

Аналогично и улиц слишком много - делаем то же самое для районов. В итоге имеем три SELECTа (а можно и четыре, и пять, и сколько влезет), связанных фильтрами, работающими на стороне сервера. Сразу же клиенту нужно передавать только районы, которых (будем считать) совсем немного.


"JavaScript - связанные SELECT-ы"
Отправлено dev , 04-Мрт-05 13:13 
>Смысл - подать запрос к серверу, открыв маленькое окошко, которое потом само
>себя закроет.

Только не наступи на граблю - большинство браузеров по умолчанию запрещают popup'ы. С фреймом надежней. И не обязательно iframe, можно и обычный, но это уже дело вкуса.


"JavaScript - связанные SELECT-ы"
Отправлено XAnder , 04-Мрт-05 15:41 
>Только не наступи на граблю - большинство браузеров по умолчанию запрещают popup'ы.
>С фреймом надежней. И не обязательно iframe, можно и обычный, но это уже дело вкуса.

Сделал сейчас с IFRAME - обычные фреймы у меня дизайном не предусмотрены. И всё работало прекрасно, пока юзал Мозиллу... Потом решил открыть в M$IE. Там тоже работает, но при попытке обновить страницу, выдаёт матерное окошко, гласящее:

"Данная страница предоставляет небезопасную информацию элементу управления ActiveX. Такой способ использования элементов управления запрещён текущими установками безопасности. В результате, данная страница может отображаться некорректно. OK?"

Жму OK - "данная страница" отображается совершенно "корректно". Что за "небезопасная информация"? Какой там "ActiveX"? X3 как обычно :(


"JavaScript - связанные SELECT-ы"
Отправлено dev , 04-Мрт-05 18:35 
Вот, кстати:
http://www.opennet.me/opennews/art.shtml?num=5140

"JavaScript - связанные SELECT-ы"
Отправлено XAnder , 05-Мрт-05 11:07 
>Вот, кстати:
>http://www.opennet.me/opennews/art.shtml?num=5140

Спасибо за ссылку - впечатляет! Возьму на вооружение.