JavaScript
Есть несколько проблем с настоящим JS:
Выпуск № 1
Property Свойство при событии должно быть добавлено к объекту с помощью точечной нотации и должно быть в нижнем регистре. Оператор запятой включает в себя объявление select
, а затем завершается ошибкой.
var select = document.getElementById('TOR'),
onChange = function(event) {...
? Сначала объявите переменную для ссылки на объект DOM, затем используйте точечную запись, чтобы связать свойство on-event с переменной.
var select = document.getElementById('TOR');
select.onchange = function(event) {...
Выпуск № 2
? Я предполагаю, что следующей строкой было присвоить значение текущей выбранной опции, потому что следующая строка использует это ... вроде ... я думаю. В любом случае
==
предназначен для сравнения двух свободно набираемых значений (что означает, что строка
"3"
может быть набрана с помощью утки до числа 3). Присвоение только одного значения из пяти возможностей отменяет цель выбора.
var shown = this.options[this.selectedIndex].value == "SM";
select Доступ к выбору можно получить напрямую, чтобы получить значение текущей выбранной опции. Использование и повторное использование переменных является важной и фундаментальной парадигмой в программировании. Так что используйте то, что у вас уже есть. Обратите внимание, что конкретное значение не присваивается ( "SM" ) - вместо этого значение того, что будет выбрано , присваивается shown
.
var shown = select.value;
Выпуск № 3
Последняя строка синтаксически верна, но неверна в том смысле, что она противоречит тому, чем закончится остальная часть кода. Ссылка на #id хороша сама по себе, но наличие нескольких тегов, похожих по назначению и дизайну, должно быть сгруппировано Атрибуты имени класса и формы должны использоваться для групп. document.querySelectorAll()
может использоваться для сбора нескольких тегов в группы, называемые NodeLists или HTML Collections (небольшая разница между ними). Поскольку у вас есть форма, в следующей демонстрации используется несколько специальных веб-API, которые специализируются на тегах форм и элементах управления . Вот список ссылок на то, что использовалось для демонстрации, подробности о том, что происходит построчно, комментируются в демонстрации:
Существует значительное количество изменений в коде OP (почти все, кроме основной функции.) Следует отметить, что значения параметров заменяются на номера индексов, чтобы повысить эффективность и гибкость за счет использования общих значений.
Демо
// Reference the form
const main = document.forms.main;
/*
Collect all form controls into a NodeList (input, output,
textarea, select, button, fieldset) nested within form#main.
*/
const x = main.elements;
/*
A - Pass Event Object
B - Get the value of select#TOR (e.target always points to the
clicked, changed, hovered, etc tag) and convert it into a real
number.
C - Collect all form controls [name=tasks] into a NodeList
(x.tasks).
D - Loop through the NodeList and remove .show class from each
tag of NodeList (fieldset[name=tasks])
E - if the value from line #B is NOT -1...
F - Assign class .show to the fieldset within the NodeList at the
indexed position of the value from line #B
*/
function menu(e) { //A
const selected = Number(e.target.value); //B
const tasks = x.tasks; //C
for (let t = 0; t < tasks.length; t++) { //D
tasks[t].classList.remove('show'); //D
}
if (selected != -1) { //E
tasks[selected].classList.add('show'); //F
}
}
// Register select#TOR to the change event, menu() is the callback
x.TOR.onchange = menu;
:root {
font: 700 2.5vw/1.2 Verdana;
}
html,
body {
width: 100%;
height: 100%;
}
body {
overflow-x: hidden;
overflow-y: scroll;
}
#main {
width: 100vw;
height: 100vh;
}
section.task {
position: relative;
min-width: 300px;
height: 100vh;
margin: 0 auto;
padding: 5vh 2vw;
}
fieldset.task {
position: absolute;
top: 0;
left: 0;
right: 0;
width: 85%;
margin: 2vh auto 5vh 1vw;
visibility: collapse;
transform: scaleY(0);
transform-origin: top;
}
fieldset.task.show {
z-index: 1;
visibility: visible;
transform: scaleY(1);
transition: 0.4s transform ease-out
}
input,
output,
select,
button {
display: inline-block;
font: inherit;
height: 6vh;
line-height: 6vh;
vertical-align: middle;
padding: 0 3px
}
#date0 {
height: 7vh;
line-height: 7vh;
width: 30vw;
}
#TOR {
height: 8vh;
line-height: 8vh;
}
<form id='main'>
<header class='menu'>
<label for="date0">Date of Requests</label>
<input id="date0" name='date' class="date" type="date">
<label for="TOR">Tasks</label>
<select id="TOR" class="menu">
<option value='-1' selected>Choose a Task</option>
<option value="0">Task 1</option>
<option value="1">Task 2</option>
<option value="2">Task 3</option>
<option value="3">Task 4</option>
<option value="4">Task 5</option>
</select>
</header>
<section class='task'>
<fieldset id='CO' name='tasks' class="task show">
<legend>Task 1</legend>
<p>CO</p>
<p>CO</p>
<p>CO</p>
<p>CO</p>
</fieldset>
<fieldset id='ASM' name='tasks' class="task">
<legend>Task 2</legend>
<p>ASM</p>
<p>ASM</p>
<p>ASM</p>
<p>ASM</p>
<p>ASM</p>
<p>ASM</p>
</fieldset>
<fieldset id='SM' name='tasks' class="task">
<legend>Task 3</legend>
<p>SM</p>
<p>SM</p>
<p>SM</p>
<p>SM</p>
<p>SM</p>
<p>SM</p>
<p>SM</p>
<p>SM</p>
</fieldset>
<fieldset id='AM' name='tasks' class="task">
<legend>Task 4</legend>
<p>AM</p>
<p>AM</p>
<p>AM</p>
<p>AM</p>
</fieldset>
<fieldset id='RC' name='tasks' class="task">
<legend>Task 5</legend>
<p>RC</p>
<p>RC</p>
<p>RC</p>
<p>RC</p>
<p>RC</p>
<p>RC</p>
<p>RC</p>
<p>RC</p>
<p>RC</p>
<p>RC</p>
<p>RC</p>
<p>RC</p>
<p>RC</p>
</fieldset>
</section>
</form>