Потребовалось создать две пары связанных селектов в теле одной формы. Т.е. список 2 зависит от списка 1 и список 4 зависит от списка 3. Одну пару реализую таким способом: Файл в форме: PHP: <script type="text/javascript" src="office_blocks/script.js"></script> <select name="marka" id="marka"> <option value="0" selected>---------Выберите марку---------</option> <?php include "office_blocks/stopauto.php"; $sql=mysql_query("SELECT * FROM avto_name"); $n=0; $a=0; while ($ctg = mysql_fetch_array($sql)) { $id[n]=$ctg['avto_name_id']; $i[n]=$ctg['avto_name']; $n=$n+1; echo "<option value=".$id[n].">";echo $ctg['avto_name']; echo "</option>"; } ?> </select><br /> <select name="model" id="model"> <option value="0" selected>---------Выберите модель-------</option> <?php $sql=mysql_query("SELECT * FROM avto_name"); $n=0; $a=0; while ($ctg = mysql_fetch_array($sql)) { $id[n]=$ctg['avto_name_id']; $i[n]=$ctg['avto_name_id']; $n=$n+1; $sqla=mysql_query("SELECT * FROM avto_model WHERE avto_name_id =".$ctg['avto_name_id'].""); while ($ctga = mysql_fetch_array($sqla)) { $od[a]=$ctga['avto_model_id']; $o[a]=$ctga['avto_model']; $a=$a+1; echo "<option class=".$i[n]." value=".$od[a].">";echo $ctga['avto_model']; echo "</option>"; } } ?> </select>[/code] Файл script.js Код (Text): function dynamicSelect(id1, id2) { if (document.getElementById && document.getElementsByTagName) { var sel1 = document.getElementById(id1); var sel2 = document.getElementById(id2); var clone = sel2.cloneNode(true); var clonedOptions = clone.getElementsByTagName("option"); refreshDynamicSelectOptions(sel1, sel2, clonedOptions); sel1.onchange = function() { refreshDynamicSelectOptions(sel1, sel2, clonedOptions); } } } function refreshDynamicSelectOptions(sel1, sel2, clonedOptions) { while (sel2.options.length) { sel2.remove(0); } var pattern1 = /( |^)(select)( |$)/; var pattern2 = new RegExp("( |^)(" + sel1.options[sel1.selectedIndex].value + ")( |$)"); for (var i = 0; i < clonedOptions.length; i++) { if (clonedOptions[i].className.match(pattern1)|| clonedOptions[i].className.match(pattern2)) { sel2.appendChild(clonedOptions[i].cloneNode(true)); } } } window.onload = function() { dynamicSelect("marka", "model"); } В JS я "плаваю" где то на самой поверхности, и никак не могу дойти - что надо сделать с файлом script.js, что бы можно было и вторую пару селектов внести в форму. Помогите пожалуйста в данном вопросе, и если можно с комментариями - хочу хоть немного углубиться в познании JS.
Тогда для чего вообще форум??? Если Вы хотите только наживы, то и пишите только в Free-lance. А если нет ответа, так и скажите, я лишь помощи попросил, для того, что-бы самому понять, а не торговать идеями!!!
Чтобы самому понять, нужно самому писать. А форум создан в помощь людям у которых есть желание научиться программировать.
Что-бы самому понять нужно поучить, а мне обратиться не к кому. Может за пару сотен км и есть программисты, работающие на РНР - я с такими лично не знаком. У меня в глубинке таких нет, а просто читая - ничего не могу понять. Ну и к кому мне скажите обращаться???
Димон Если у тебя самого нет желания вникать и разбираться - откуда оно должно взяться у посторонних людей? Локализуй ошибку, задай конкретный вопрос - и на него ответят. А писать для кого-то код, да еще и с комментариями - это увы не бесплатно
Я не прошу весь код, а только принцип объяснить. Хотя-бы, если я изменю имя файла script.js на script1.js, в нем поменяю наименование функций и переменных, а так-же имена селектов - будет работать этот скрипт? Я пробовал, и у меня переставала работать первая пара селектов. Помогите не готовым скриптом а советом. А не просто на гугл отправляйте.
Что надо то? Сделать вторую пару динамической? Добавьте в [js] window.onload = function() { dynamicSelect("marka", "model"); }[/js] аналог для второй пары приведенный главный select дополните, чтоб выглядело так: HTML: <select name="marka" id="marka" onchange='dynamicSelect("marka", "model")'> и аналогично для второго главного select'а
Мне надо две пары зависимых селектов, но пары не зависят друг от друга, т.е например "марка"-"модель", "отдел"-"должность". Мне надо их поместить в одну форму, но когда я помещаю вторую пару, первая перестает работать.
Идентификаторы само-собой поменял. Первая пара снова заработала, а вот вторая нет. Вторая пара вообще не грузится, даже первый селект не выводится. Сейчас проверю запрос к БД на предмет ошибок и отпишусь что выходит и что не работает. Интересно, данный JS будет один на две пары селектов?
Перепроверил, запрос работает, а вторая пара нет. Во второй паре даже не появляется второй селект. И еще, во второй паре надо менять имена переменных (a, n например на x,y)?
Во второй паре надо поменять запросы и ключи массивов. Проверьте какой html создался. Может какой тег забыли закрыть.
Не получается у меня создать две, независимые друг от друга, пары зависимых селектов. Буду пока заниматься самостоятельно AJAX-ом, может со временем разберусь. Тему можно закрыть.
Димон хрен тебе закрыть. уперся в стену и сразу сопли? че там у тебя не получается? в запросе выбирай ДИСТИНКТ(поле по которому будешь строить селект) независимость селектов обеспечивается их именами по праву рождения, зависимость - только искусственно кодом js и ручками =) в чем затык?
Димон с помощью jquery данная задача облегчается в разы. без jquery придётся писать собственные механизмы обработки ajax запроса, а затем ещё отлаживать кроссбраузерность. хотя это конечно не отменяет изучения языка javascript как такового.
Вообще с js там ничего делать не надо... Задача лишь построить 4 select'а с правильными классами option'ов в двух из них. например: [js] function dynamicSelect(id1, id2) { if (document.getElementById && document.getElementsByTagName) { var sel1 = document.getElementById(id1); var sel2 = document.getElementById(id2); var clone = sel2.cloneNode(true); var clonedOptions = clone.getElementsByTagName("option"); refreshDynamicSelectOptions(sel1, sel2, clonedOptions); sel1.onchange = function() { refreshDynamicSelectOptions(sel1, sel2, clonedOptions); } } } function refreshDynamicSelectOptions(sel1, sel2, clonedOptions) { while (sel2.options.length) { sel2.remove(0); } var pattern1 = /( |^)(select)( |$)/; var pattern2 = new RegExp("( |^)(" + sel1.options[sel1.selectedIndex].value + ")( |$)"); for (var i = 0; i < clonedOptions.length; i++) { if (clonedOptions.className.match(pattern1)|| clonedOptions.className.match(pattern2)) { sel2.appendChild(clonedOptions.cloneNode(true)); } } } window.onload = function() { dynamicSelect("sel1", "sel2"); dynamicSelect("sel3", "sel4"); } [/js] HTML: <form> <select id='sel1' onchange='dynamicSelect("sel1", "sel2")'> <option value='s1'>1</option> <option value='s2'>2</option> <option value='s3'>3</option> <option value='s4'>4</option> <option value='s5'>5</option> <option value='s6'>6</option> </select> <select id='sel2'> <option class='s1' value='11'>11</option> <option class='s1' value='12'>12</option> <option class='s1' value='13'>13</option> <option class='s1' value='14'>14</option> <option class='s1' value='15'>15</option> <option class='s2' value='21'>21</option> <option class='s2' value='22'>22</option> <option class='s3' value='33'>33</option> <option class='s3' value='34'>34</option> <option class='s4' value='45'>45</option> <option class='s5' value='51'>51</option> <option class='s5' value='52'>52</option> <option class='s5' value='53'>53</option> </select> <br> <select id='sel3' onchange='dynamicSelect("sel3", "sel4")'> <option value='s1'>1</option> <option value='s2'>2</option> <option value='s3'>3</option> <option value='s4'>4</option> <option value='s5'>5</option> <option value='s6'>6</option> </select> <select id='sel4'> <option class='s1' value='11'>11</option> <option class='s1' value='12'>12</option> <option class='s1' value='13'>13</option> <option class='s1' value='14'>14</option> <option class='s1' value='15'>15</option> <option class='s2' value='21'>21</option> <option class='s2' value='22'>22</option> <option class='s3' value='33'>33</option> <option class='s3' value='34'>34</option> <option class='s4' value='45'>45</option> <option class='s5' value='51'>51</option> <option class='s5' value='52'>52</option> <option class='s5' value='53'>53</option> </select> </form> легко заметить что в js всего лишь добавлена одна строчка.