Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.05.2015, 13:51
Интересующийся
Отправить личное сообщение для oneplus Посмотреть профиль Найти все сообщения от oneplus
 
Регистрация: 25.05.2015
Сообщений: 24

Динамический список не динамический.
Доброго дня, друзья!
Делаю простенький калькулятор, точнее не могу сделать В JS новенький, не могу разобраться в чем дело:
Краткое пояснение:
При выборе "Пластиковый "Квадро"" в первом списке, должен пропадать "Транслюцентный баннер" во втором списке.
Отдельно "document.light_box.surface.options[2]=null;" - удаляется, а вот вместе с "if", что бы задать условие не работает.
<body>
<table width="600" align="center" class="light_box">
<colgroup><col width="210"><col width="390"></colgroup>
<tbody>
<form name="light_box">
<tr><td class="left">Профиль:</td>
<td><select id="profile" name="profile">
      <option selected="selected">Металлический</option>
      <option>Пластиковый "Квадро"</option>
      </select></td></tr>  
<tr><td align="left">Лицевая поверхность:</td>
<td><select name="surface">
      <option selected="selected">Акрил молочный (пленки)</option>
      <option>Акрил молочный (полноцветная печать)</option>
      <option>Транслюцентный баннер</option>
      <option>Сотовый поликорбанат (пленки)</option>
      <option>Сотовый поликорбанат (полноцветная печать)</option>
      </select></td></tr>
</form>
</tbody>
</body>


if (document.light_box.profile.options.selected==1) {
document.light_box.surface.options[2]=null;
}


Перепробовал и другие варианты, ничего не получается:
var objPro=document.light_box.profile;
var objSel=document.light_box.surface;
if (objPro.selectedIndex==objPro.options[1]) {
objSel.options[2]=null;
}


if (document.light_box.profile.options[1].selected==true) {
  document.light_box.surface.options[2]=null;
}


Друзья, если не затруднит подсказать правильный вариант или "где копать" пожалуйста ответьте. Заранее спасибо.

Продолжаю экспериментировать:
var objPro = document.getElementById("profile_id");
var objSel = document.getElementById("surface_id");
if (objPro.selectedIndex == 1) {
  objSel.options[2]=null;  
}

не работает.

Последний раз редактировалось oneplus, 25.05.2015 в 15:44. Причина: Дополнение
Ответить с цитированием
  #2 (permalink)  
Старый 25.05.2015, 15:54
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от oneplus
подсказать правильный вариант или "где копать"
Как вариант, сделать зависимую структуру из массивов и объектов... На основе этого создавать содержимое второго "зависимого" селекта...
Ответить с цитированием
  #3 (permalink)  
Старый 25.05.2015, 23:54
Интересующийся
Отправить личное сообщение для oneplus Посмотреть профиль Найти все сообщения от oneplus
 
Регистрация: 25.05.2015
Сообщений: 24

Дополнение к первому посту
Спасибо, попробую разобраться с массивами и объектами. Если не трудно буду благодарен за похожие примеры, поскольку плохо представляю нужные массивы и объекты. Второй день гуглю, не могу найти ответа.
В дополнение к первому посту:
Заметил следующее, код
var objPro = document.getElementById("profile_id");
var objSel = document.getElementById("surface_id");
if (objPro.selectedIndex == 1) {
objSel.options[2]=null; 
}

работает (на мой взгляд), но значения проверяет при старте страницы, то есть objPro.selectedIndex изначально [0], при последующем выборе уже условие "if" не проверяется.
Как заставить скрипт работать при каждом выборе?
Экспериментировал с "onchange",
<td><select id="profile" name="profile" onchange="this.options[this.selectedIndex]">
      <option selected="selected">Металлический</option>
      <option>Пластиковый "Квадро"</option>
      </select></td></tr>

, так понимаю с onchange скрипт должен срабатывать при каждом изменении (потере фокуса). Вариант также не увенчался успехом.
Ответить с цитированием
  #4 (permalink)  
Старый 26.05.2015, 01:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

зависимые селекты
oneplus,
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
<form name="light_box">
<table width="600" align="center" class="light_box">
<colgroup><col width="210"><col width="390"></colgroup>
<tbody>

<tr><td class="left">Профиль:</td>
<td><select id="profile" name="profile">
      <option selected="selected">Металлический</option>
      <option>Пластиковый "Квадро"</option>
      </select></td></tr>
<tr><td align="left">Лицевая поверхность:</td>
<td><select name="surface" size="5">
      <option selected="selected">Акрил молочный (пленки)</option>
      <option>Акрил молочный (полноцветная печать)</option>
      <option>Транслюцентный баннер</option>
      <option>Сотовый поликорбанат (пленки)</option>
      <option>Сотовый поликорбанат (полноцветная печать)</option>
      </select></td></tr>

</tbody>
</table>
</form>
<script>
var s = document.querySelectorAll("select"),
    o = s[1].options,
    op = o[2];

function foo() {
    this.selectedIndex ? o.remove(2) : o.add(op, 2)
}
s[0].onchange = foo;
</script>



</body>


</html>

Последний раз редактировалось рони, 26.05.2015 в 01:09.
Ответить с цитированием
  #5 (permalink)  
Старый 26.05.2015, 10:11
Интересующийся
Отправить личное сообщение для oneplus Посмотреть профиль Найти все сообщения от oneplus
 
Регистрация: 25.05.2015
Сообщений: 24

Огромное спасибо.
Огромное спасибо, работает!
Правильно ли понимаю?
var s = document.querySelectorAll("select"),//все списки
    o = s[1].options,//второй список, где будут происходить изменения
    op = o[2];//оптион, который будет удаляться
//а вот, что происходит дальше?
//"this.selectedIndex" - расшифруйте пожалуйста условие
//true - удаляем третий оптион, false - добавляем третий оптион во второй список
function foo() {
    this.selectedIndex ? o.remove(2) : o.add(op, 2)
}
//первый список при каждом изменении проверяется по функции?
s[0].onchange = foo;

Вообщем не хотелось бы вставлять безглядно код, прошу расшифровать обычном языком, что произошло, особенно в функции не понимаю \ не вижу условия "при выборе селект0 оптион1".
И второй вопрос, на странице, да и в самом калькуляторе будут еще селекты, а если добавить селектов (например селект перед), скрипт перестает работать корректно, можно ли привязать этот скрипт только к этим двум селектам, например по id?

Что не правильного в этом условии? Почему не возвращает оптион 2.
var objPro = document.getElementById("profile_id");
var objSel = document.getElementById("surface_id");
function foo() {
  (objPro.selectedIndex == 1) ? objSel.options.remove(2) : objSel.options.add(objSel.options[2],2)
}
objPro.onchange = foo;

Скрипт по началу работает как надо, но при обратном выборе оптион 2 не возвращает.
В html все id прописаны.

Последний раз редактировалось oneplus, 26.05.2015 в 10:50.
Ответить с цитированием
  #6 (permalink)  
Старый 26.05.2015, 11:16
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от oneplus
//все списки
все селекты
Сообщение от oneplus
//второй список, где будут происходить изменения
NodeList опционов второго селекта
Пластиковый "Квадро this.selectedIndex == 1
Металлический - this.selectedIndex == 0 => this.selectedIndex уже ноль что даст false, сравнение с нулём и единицей опускаем, так как всего 2 опциона для выбора.
Сообщение от oneplus
Что не правильного в этом условии?
objSel.options.add(objSel.options[2],2) в этой строке нет опциона Транслюцентный баннер, потому что он уже отсутствует в селекте , а есть Сотовый поликорбанат (пленки) который благополучно вставляется на своё же место.
в моём случае он никуда не изчез, потому-то на него ссылается отдельная переменная.
var objPro = document.getElementById("profile_id");
var objSel = document.getElementById("surface_id");
var ops = objSel.options[2];
function foo() {
  (objPro.selectedIndex == 1) ? objSel.options.remove(2) : objSel.options.add(ops,2)
}
objPro.onchange = foo;
Ответить с цитированием
  #7 (permalink)  
Старый 26.05.2015, 14:08
Интересующийся
Отправить личное сообщение для oneplus Посмотреть профиль Найти все сообщения от oneplus
 
Регистрация: 25.05.2015
Сообщений: 24

Благодарю, все понятно и доступно!
Сегодня открыл для себя новые горизонты
Ответить с цитированием
  #8 (permalink)  
Старый 26.05.2015, 14:20
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сделайте еще одно открытие - транслюцентный это калька для дебилов, а по-русски говорят "просвечивающий". Это будет единственное, потому что ваш хардкор будет работать пока все условия в хардкоде совпадают с данными. Как только данные поменяются, добавится еще Трансцендентный баннер - пиндец, вам придется править свой хардкор. Уровень абстрации ниже плинтуса и самое печальное что некоторые профессора ничтоже сумняще его там и удерживают.

Последний раз редактировалось kostyanet, 26.05.2015 в 14:25.
Ответить с цитированием
  #9 (permalink)  
Старый 26.05.2015, 14:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

kostyanet,
вечно ты выдумываешь коня в вакуме, когда есть решение для одного обьекта, решить задачу с десятком можно без труда, распространив метод на нужные обьекты.
Ответить с цитированием
  #10 (permalink)  
Старый 26.05.2015, 15:25
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

А я о чем написал? Добавится кубический конь к сферическому и полезет наш счастливый аффтар добавлять

o11 = s[11].options,
op22 = o[22];

Короче, все делается не так, но как делается - не делается долбоящерами. Они хардкодят.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простой динамический список vasiliy_shkolniy Элементы интерфейса 34 05.07.2013 09:10
Динамический список элементов формы lar_i_sa Общие вопросы Javascript 0 08.03.2013 15:27
Динамический список djsadd Internet Explorer 1 13.04.2012 01:35
Динамический список из DIV`ов и INPUT`ов Andrew_li jQuery 5 09.06.2011 15:23
Заполнить список значениями из динамически созданного выпадающего списка zhuzha Элементы интерфейса 0 17.08.2010 14:40