Javascript - связать два селекта

uncle17

есть подряд два селекта. Один - выбор региона, второй - выбор города. Как сделать, чтобы при выборе региона автоматом во второй селект подгружался нужный список городов?
Много где такое сделано, но как оптимальней?

kruzer25

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

uncle17

эт понятно... Просто там еще всякие дата-биндинги есть, в которых я не шарю. Думал, может, на них всё это...

skvoria

XMLHttpRequest

uncle17

мдя...не очень пока там всё ясно

skvoria

Да все просто, вот хоть тут почитай: http://www.webmascon.com/topics/technologies/13a.asp
Нормально держится везде кроме старых Опер.

uncle17

нда... давно я не сталкивался с кроссбраузерным геморроем

koly

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

evgen5555

А загрузка в список сразу всех городов и выборка скриптом почему не приемлема?

Andr163

тащить много возможно ненужной информации

evgen5555

Вот тут у меня сомнения и возникли. Разве список всех городов настолько огромен?

dedwowan

Хранить список всех регионов и для каждого - список входящих городов.
В твоем варианте, будут дикие тормоза на стороне клиента при перерисовке

dedwowan

Ну, если у него 20 регионов и 200 городов, то лучше просто все на клиента 1 раз скинуть в js'ке
Если у него 90 регионов и в каждом по 200 городов, то лучше перегружать страницу. Или подгружать инфу через XML.
А что именно ему надо - фик знает.

evgen5555

Вот мне и интересно, в каком регионе может быть двести городов...

Helga87

В любом, если считать деревушки всякие. Все зависит от того, какая нужна детальность.

uncle17

примерно 20 по 40

kruzer25

800 городов - разве это много?

uncle17

чтоб их каждый раз грузить? Прилично... К тому же их список постоянно расширяется и менять каждый раз скрипт...

kruzer25

Сделай .js, в котором будет этот массив 2*800 - и каждый раз подгружай его... при изменении списка надо будет только отредактировать этот .js...

uncle17

очень мне в кайф все время его редактировать... тем более, что добавлять регионы и города будет даже не мой отдел и даже далеко не всегда люди из Москвы

dedwowan

В чем проблема его генерить?
Вообще 800 городов это примерно 7кб трафика.
Даже если ты будешь их просто в странице без .js выкидывать получится немного.
Тормозов со стороны клиента такой объем данных не вызовет.

dedwowan

Скрипт менять нафиг не надо.
Надо его один раз правильно написать просто -)

uncle17

угу... чтоб PHP с забором из базы забирался как JS. Очч оптимально. Не... я лучше вон ту фишку порюхаю с первой страницы

dedwowan

Бррр. Какая тебе разница что в пхпм скрипте генерить - html, xml или js?

uncle17

да мне-то никакой, но региональным редакторам на диалапах...

dedwowan

Диалапы к генерации страниц отношения не имеют.
Если тебе важно экономить трафик, то рюхай работу с XMLRequest'м, тут ничего другого не остается.
Только сначала убедись, что у тебя вся страница не весит 80к -)

uncle17

нет, вся страница - это форма на 1-2К. А еще 78-79 будут занимать option'ы с регионами и городами...

dedwowan

Федя, ты порядок перепутал -)

uncle17

там, кроме этих двух полей, еще только три-четыре textarea, которые заполняются вручную

dedwowan

Ну и что?

uncle17

ну они-то минимум кода занимают... и браузер не тревожат нисколько... а вот эти два поля

dedwowan

Они тоже минимум кода занимают.
Ну сам посуди
<textarea></textarea>

Не будут же они в них сочинения писать

uncle17

там больше аргументы занимают, если что

sergei1969

пример см. в регистрации на ultra-online.ru
несколько геморней, но без XMLHttpRequest
на счёт кроссбраузерности спорить не буду, с 7-й оперой вроде работало
на счёт скорости и объёмов можешь прикинуть - там вобщем-то весь КЛАДР загружен

kruzer25

option'ы не будут занимать практически нисколько, если их генерить на стороне клиента.

uncle17

только у них values должны быть индепендент, мать их

artimon

Почему это?

uncle17

так мне их потом в базу пхать

kruzer25

только у них values должны быть индепендент
В смысле?

uncle17

в смысле
<select name=city>
<option value=1>Масква</option>
<option value=2>Саратаф</option>
</select>

evgen5555

- вот тут много селектов и всё работает внутри страницы.

uncle17

во-во-во. Именно такое и надо. Только поменьше:)

dedwowan

Блин. Вот честное слово, чем больше читаю тему, тем у меня больше ощущение, что ты чего-то глобально не понимаешь.
Может я ошибаюсь конечно...

uncle17

вполне возможно, ибо мощно яваскриптом никогда не занимался - так, красивости всякие только

skvoria

Да пусть попробует так, сяк, как-то иначе, все равно без знания специфики задачи трудно сказать, что именно будет оптимальнее. 20 х 40 городов - это тоже нифига не дофига, вот тут, к примеру, можно увидет пример аццкого классификатора: http://www.rusmarket.ru/cgi-bin/my-rm/company_modify.pl?tari... и ведь работает и не жужжит!
В конце концов, <script src="/cgi-bin/dynamic_script.pl"> тоже никто не отменял (правда жопа с поддержкой кажися)
Короче, Федечка, за то время, пока эта тема обсуждается, половину из предложенных вариантов уже можно было триста раз реализовать. Дерзай.

kruzer25

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

uncle17

так и буду делать... Кстати, как это сделать? innerHTML?

kruzer25

Нет... там какая-то специальная функция... посмотри в мануале список методов объекта <SELECT>...

uncle17

ага, гляну... сенкс

dedwowan

У объекта типа селект есть метод для добавления новых опшинов и коллекция в котором храняться уже существующие.
Сперва обнуляешь длину этой коллекции, потом с помощью метода генеришь опшины.
Фсе

vlfdimir58

посмотри регистрацию на rosmu.ru
Оставить комментарий
Имя или ник:
Комментарий: