Вход

Просмотр полной версии : Двойной динамический список.


oneplus
14.08.2015, 16:56
Доброго дня, друзья!
Ситуация такая:
Есть три списка:
- Материал (ткань, бриз, алюминий, пластик) - независимый,
- Выборка (весь список, хиты продаж, эконом, премиум) - независимый,
- Фактура (большой список моделей) - зависит от материала и выборки.
Принцип действия таков, выбираем материал, в соответствии с материалом выпадет нужный список моделей фактуры, но поскольку список большой мне необходимо сделать еще выборку по выпадающему списку (хиты, эконом и т.д.).
Изначально предполагал, что в value сделаю три значения:
vp1 - переменная стоимости,
econ - эконом класс,
art - артикул, к которому позже привяжу картинки.
var v=tex.options[tex.selectedIndex].value,
m=mat.options[mat.selectedIndex].value,
va=new Array();
s=v.substr(0,2);
va=v.split(",");
a=(va[0]);
b=(va[1]);
c=(va[2]);
//"s"-переменная списка, "a"-прайс класс, "b"-выборка, "c"-артикул
Значение econ привяжу к выборке.
е могу привязать, потому что здесь речь уже о выбранном оптионе, а мне их нужно раскидать.
В class вынес список по материалу (vt, vb, va, vp).
В итоге голова дымится, но ничего работающего не получилось.
Что сделал:
<body>
<table width="600" align="center">
<colgroup><col width="210"><col width="390"></colgroup>
<tbody>
<form name="vl_form">
<tr><td class="left">Материал:</td>
<td><select id="vl_mat_id" name="vl_mat">
<option class="vt" selected="selected">ткань</option>
<option class="vb">бриз</option>
<option class="va">алюминий</option>
<option class="vp">пластик</option>
</select></td></tr>
<tr><td align="left">Фактура:</td>
<td><select id="vl_sort_id" name="vl_sort">
<option selected="selected">весь список</option>
<option>хиты продаж</option>
<option>премиум</option>
<option>эконом</option>
</select></td></tr>
<tr><td></td>
<td><select id="vl_tex_id" name="vl_tex">
<option selected="selected" value="vt1, econ, art">Алжир</option>
<option class="vt" value="vt1, econ, art">Стандарт</option>
<option class="vt" value="vt2, econ, art">Рибкорд</option>
<option class="vb" value="vb1, hit, art">Парсифаль</option>
<option class="va" value="va1, hit, art">Сканди</option>
<option class="vp" value="vp1, hit, art">Аквамарин</option>
<option class="vp" value="vp2, hit, art">Лоэнгрин</option>
<option class="vp" value="vp3, prem, art">Фрост</option>
</select></td></tr>
</form>
</tbody>
</body>
var mat=document.getElementById("vl_mat_id"),
sor=document.getElementById("vl_sort_id"),
tex=document.getElementById("vl_tex_id"),
tex_c=tex.cloneNode(true),
tex_co=tex_c.getElementsByTagName("option");
function f() {
var m=mat.options[mat.selectedIndex].className;
while (tex.options.length) {tex.remove(0)};
for (var i=0; i<tex_co.length;i++) {
if (tex_co[i].className.match(m)) {tex.appendChild(tex_co[i].cloneNode(true))}
}
}
mat.onchange=f;
Привязка здесь по классу, но как сделать, что бы привязывалось по переменным и сделать двойной динамический список.

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

Rise
14.08.2015, 17:29
oneplus, уникальные значения, как я понял это артикул, в value, а всё остальное в class (классы материалов, классы фактур)

oneplus
14.08.2015, 17:37
Можно ли сделать несколько классов? Или подклассы?

Rise
14.08.2015, 17:43
oneplus, можно class="premium metal"

рони
14.08.2015, 17:49
oneplus,
нужно вырастить дерево зависимостей (обьект) и при переходе по веткам формировать селекты --- так же есть куча готовых решений и здесь и в космосе -- искать зависимые селекты плагин

рони
14.08.2015, 17:55
oneplus, этого плагина вам должно хватить
http://www.appelsiini.net/projects/chained

oneplus
14.08.2015, 17:58
oneplus, можно class="premium metal"
простите, сейчас нет возможности проэксперементировать, поэтому спрошу:
то есть я могу задать в классе сразу два класса? например class="premium metal" и при необходимости использовать:
if (tex_co[i].className.match("premium")){tex.appendChild(tex_co[i].cloneNode(true))}
или
if (tex_co[i].className.match("metall")) {tex.appendChild(tex_co[i].cloneNode(true))}
я правильно понимаю?

oneplus
14.08.2015, 18:04
oneplus, этого плагина вам должно хватить
http://www.appelsiini.net/projects/chained

Большое спасибо, попробую разобраться. Так понимаю это уже будет jQuery? Просто я с ней ранее не знаком.

Можно ли мою задачу выполнить на просто яваскрипте? И целесообразно ли это будет, заморачиваться только яваскриптом без плагинов?

рони
14.08.2015, 19:36
oneplus,
можно на js если построите дерево.

рони
14.08.2015, 19:37
я могу задать в классе сразу два класса?
да хоть десять

oneplus
14.08.2015, 20:04
Поэкспериментировал с классами "premium metal" - открыл много нового:)
Задача следующая: Как работать с уже сформированным списком?
В первом списке я выбираю материал, список моделей фурнитуры собирается.
Затем мне нужно сделать выборку по этому списку, то есть работать с уже сформированным.
Как это реализовать?
Как сохранить селект лист сформированных оптионов, например в цикле фор, что бы потом с ним работать?
Пытался сделать, что то вроде этого:
var mat=document.getElementById("vl_mat_id"),
sor=document.getElementById("vl_sort_id"),
tex=document.getElementById("vl_tex_id"),
tex_c=tex.cloneNode(true),
tex_co=tex_c.getElementsByTagName("option"), sp, spc;
function f() {
var m=mat.options[mat.selectedIndex].className;
while (tex.options.length) {tex.remove(0)};
for (var i=0; i<tex_co.length;i++) {
if (tex_co[i].className.match(m)) {
tex.appendChild(tex_co[i].cloneNode(true));
sp=tex_co[i].cloneNode(true);
spc=sp.getElementsByTagName("option");
};
}
}
mat.onchange=f;
function p() {
var f=sor.options[sor.selectedIndex].className;
while (tex.options.length) {tex.remove(0)};
for (var i=0; i<spc.length;i++) {
if (spc[i].className.match(f)) {tex.appendChild(spc[i].cloneNode(true))};
}
}
sor.onchange=p;
Список сформировывается и я его записываю, затем работаю только с ним.
Только то, что написал не работает. Не записывает. Почему?

Rise
14.08.2015, 20:10
oneplus, имена переменным, функциям и классам надо осмысленные давать (как className, appendChild, cloneNode), чтобы было понятно о чем речь, а не просто букавки.

oneplus
14.08.2015, 20:21
Прошу прощение, действительно не информативно.
var mat=document.getElementById("vl_mat_id"),//первый список - материалы
sor=document.getElementById("vl_sort_id"),//второй список - выборка
tex=document.getElementById("vl_tex_id"),//третий список - фактура
tex_c=tex.cloneNode(true),
tex_co=tex_c.getElementsByTagName("option"),
//тех_цо-клонированный список фактуры
sp, spc;//спц-клонированный список новосформированного
//функция при выборе материала
function f() {
//класс материала
var m=mat.options[mat.selectedIndex].className;
//удаляем список
while (tex.options.length) {tex.remove(0)};
//возвращаем список с нужным классом
for (var i=0; i<tex_co.length;i++) {
if (tex_co[i].className.match(m)) {
tex.appendChild(tex_co[i].cloneNode(true));
//записываем список для дальнейшего использования
sp=tex_co[i].cloneNode(true);
spc=sp.getElementsByTagName("option");
};
}
}
mat.onchange=f;
//функция для работы второго списка-выборки
function p() {
//класс выборки или сортировки
var f=sor.options[sor.selectedIndex].className;
//удаляем старый список
while (tex.options.length) {tex.remove(0)};
//возвращаем нужный список из ранее сохраненного
for (var i=0; i<spc.length;i++) {
if (spc[i].className.match(f)) {tex.appendChild(spc[i].cloneNode(true))};
}
}
sor.onchange=p;

рони
14.08.2015, 20:31
oneplus,
пример на js
http://javascript.ru/forum/dom-window/35281-kak-svyazat-dva-spiska-na-javascript.html#post231937

рони
14.08.2015, 20:32
//удаляем список13 while (tex.options.length) {tex.remove(0)};

tex.options.length=0

oneplus
14.08.2015, 22:08
постарался разобрать пример связанных селектов
http://javascript.ru/forum/dom-windo...tml#post231937
правильно понимаю, сформированный список получится сохранить только через массив?
вот этот список:
for (var i=0; i<tex_co.length;i++) {
if (tex_co[i].className.match(m)) {tex.appendChild(tex_co[i].cloneNode(true))};
для этого нужно писать еще цикл?

oneplus
14.08.2015, 22:20
Дописал так в первой функции f:
sp=tex.cloneNode(true);
spc=sp.getElementsByTagName("option");
Возможно это не совсем правильно, но работает.

рони
14.08.2015, 22:42
oneplus,
что и как вы пишите мне неизвестно, подсказать не могу.