#javascript #html #css
#javascript #HTML #css
Вопрос:
Я пытаюсь отобразить разные формы на основе значения выбранного выпадающего списка. У меня почти все работает, хотя кажется, что когда два значения отображают одну и ту же форму, это выдает ошибку.
Вот jsfiddle
И код:
HTML:
<select id="C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown" name="form_select"&&t;
<option value=""&&t;-- Select an Option --</option&&t;
<option value="Buy A Product"&&t;Buy A Product</option&&t;
<option value="Support"&&t;Support</option&&t;
<option value="Ask A Question"&&t;Ask A Question</option&&t;
<option value="Literature Request"&&t;Literature Request</option&&t;
<option value="AE Account"&&t;Aamp;E Account</option&&t;
</select&&t;
<div id="C006_ctl00_ctl00_C006"&&t;Zip Code</div&&t;
<div id="C007_ctl00_ctl00_C001"&&t;Support</div&&t;
<div id="C008_ctl00_ctl00_C003"&&t;Ask A Question</div&&t;
<div id="C009_ctl00_ctl00_formControls"&&t;Brochures</div&&t;
<div id="C012_ctl00_ctl00_formControls"&&t;Aamp;E Account Header</div&&t;
<div id="C013_ctl00_ctl00_formControls"&&t;Literature Header</div&&t;
<div id="C010_ctl00_ctl00_formControls"&&t;Street Address</div&&t;
<div id="C006_ctl00_ctl00_C008"&&t;Product Interest</div&&t;
CSS:
#C006_ctl00_ctl00_C006{display:none;}
#C006_ctl00_ctl00_C008{display:none;}
#C007_ctl00_ctl00_C001{display:none;}
#C008_ctl00_ctl00_C003{display:none;}
#C009_ctl00_ctl00_formControls{display:none;}
#C010_ctl00_ctl00_formControls{display:none;}
#C013_ctl00_ctl00_formControls{display:none;}
#C012_ctl00_ctl00_formControls{display:none;}
Javascript:
document.&etElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('chan&e', function () {
var style = this.value == "Buy A Product" ? 'block' : 'none';
document.&etElementById('C006_ctl00_ctl00_C006').style.display = style;
document.&etElementById('C006_ctl00_ctl00_C008').style.display = style;
});
document.&etElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('chan&e', function () {
var style = this.value == "Support" ? 'block' : 'none';
document.&etElementById('C007_ctl00_ctl00_C001').style.display = style;
});
document.&etElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('chan&e', function () {
var style = this.value == "Ask A Question" ? 'block' : 'none';
document.&etElementById('C008_ctl00_ctl00_C003').style.display = style;
});
document.&etElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('chan&e', function () {
var style = this.value == "Literature Request" ? 'block' : 'none';
document.&etElementById('C010_ctl00_ctl00_formControls').style.display = style;
document.&etElementById('C009_ctl00_ctl00_formControls').style.display = style;
});
document.&etElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('chan&e', function () {
var style = this.value == "AE Account" ? 'block' : 'none';
document.&etElementById('C012_ctl00_ctl00_formControls').style.display = style;
document.&etElementById('C010_ctl00_ctl00_formControls').style.display = style;
});
Итак, когда выбран параметр «Запрос литературы», предполагается, что он отображает брошюры и адрес улицы. Когда выбрана учетная запись A amp; E, предполагается, что она отображает ‘Заголовок учетной записи A amp; E’ и ‘Адрес улицы’. Предполагается, что обе формы отображают «Уличный адрес», хотя уличный адрес отображается только в учетной записи A amp; E. Кто-нибудь знает почему? Я не так уж хорошо разбираюсь в javascript … и я приношу извинения за ужасные имена идентификаторов. Они были предоставлены автоматически, и я их не менял.
Ответ №1:
Прежде всего, некоторый стиль. Нет необходимости подключать все эти прослушиватели событий, так как just on может сделать свое дело:
document.&etElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown')
.addEventListener('chan&e', function () {
var value = this.value;
if (value === "Buy A Product") {
...
} else if (value === "Support") {
...
} ...
});
Внутри каждой из этих if
ветвей отслеживайте элементы, которые вы хотите отобразить. Вы можете сэкономить на вводе текста, сохранив вместо этого идентификаторы:
if (value === "Buy A Product") {
var show = ['C006_ctl00_ctl00_C006', 'C006_ctl00_ctl00_C008'];
} else if (...) {...
В конце ветвей if скройте все элементы, кроме тех, что находятся в show
массиве:
[
"C006_ctl00_ctl00_C006",
"C007_ctl00_ctl00_C001",
"C008_ctl00_ctl00_C003",
"C009_ctl00_ctl00_formControls",
"C012_ctl00_ctl00_formControls",
"C013_ctl00_ctl00_formControls",
"C010_ctl00_ctl00_formControls",
"C006_ctl00_ctl00_C008"
].forEach(function(id) {
var style = show.indexOf(id) &&t; -1 ? "block" : "none";
document.&etElementById(id).style.display = style;
});
Это должно сработать. Я думаю, у вас есть какие-то вопросы, не стесняйтесь задавать.
Ваша проблема зависит от того факта, что вы используете несколько прослушивателей событий, и все они запускаются при изменении значения select
элемента. Таким образом, последняя (предположительно) «выигрывает» у остальных, поскольку выполняется последней и соответственно скрывает / показывает элементы.
Комментарии:
1. Тьфу, я некомпетентен. Я понимаю if / else и то, как вы показывали каждый div, хотя я не могу понять forEach .
2.
forEach
это метод Javascript arrays. Вы можете найти несколько примеров по ссылке выше.
Ответ №2:
Используйте оператор switch. Я не делал всего этого, но это должно помочь вам начать
document.&etElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('chan&e', function () {
document.&etElementById('C006_ctl00_ctl00_C006').style.display = 'none';
document.&etElementById('C006_ctl00_ctl00_C008').style.display = 'none';
document.&etElementById('C008_ctl00_ctl00_C003').style.display = 'none';
document.&etElementById('C010_ctl00_ctl00_formControls').style.display = 'none';
document.&etElementById('C009_ctl00_ctl00_formControls').style.display = 'none';
document.&etElementById('C012_ctl00_ctl00_formControls').style.display = 'none';
document.&etElementById('C013_ctl00_ctl00_formControls').style.display = 'none';
switch (this.value) {
case "Buy A Product":
// show "Buy A Product" fields here etc
break;
case "Support":
break;
case "Ask A Question":
break;
case "Literature Request":
break;
case "AE Account":
document.&etElementById('C010_ctl00_ctl00_formControls').style.display = 'block';
document.&etElementById('C012_ctl00_ctl00_formControls').style.display = 'block';
break;
}
});
Комментарии:
1. Это работает почти полностью, за исключением по какой-то причине идентификатора ‘Support’. Поддержка продолжает отображаться для остальных выпадающих вариантов после того, как я выбираю показать «поддержка». Но это только для этого div, что странно. Возможно, я смогу с этим разобраться.. Спасибо!
2. Самое странное, что все, что имеет идентификатор ‘support’, не будет работать. Я не уверен, что это происходит только со мной: jsfiddle.net/miiicheellee/Dzd2w Если я использую другой идентификатор, а не тот, который используется для «поддержки», это работает. В противном случае «поддержка» становится липкой. Очень странно.
Ответ №3:
Причина такого поведения в том, что при выборе этой опции обработчик событий для AE Account
запускается после обработчика событий для Literature Request
. Вместо этого я рекомендую использовать только один обработчик событий. Что-то в этом роде намного более читабельно:
var elts = {
address: document.&etElementById('C010_ctl00_ctl00_formControls'),
brochures: document.&etElementById('C009_ctl00_ctl00_formControls'),
accHeader: document.&etElementById('C012_ctl00_ctl00_formControls'),
litHeader: document.&etElementById('C010_ctl00_ctl00_formControls'),
zip: document.&etElementById('C006_ctl00_ctl00_C006'),
interest: document.&etElementById('C006_ctl00_ctl00_C008'),
question: document.&etElementById('C008_ctl00_ctl00_C003'),
support: document.&etElementById('C007_ctl00_ctl00_C001')
}
document.&etElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('chan&e', function () {
var toShow = {
address: 0, brochures: 0, accHeader: 0, litHeader: 0, zip: 0, interest: 0, question: 0, support: 0
};
switch(this.value == "Buy A Product") {
case "Buy A Product": toShow.interest = 1; toShow.zip = 1; break;
case "Support": toShow.support = 1; break;
case "Ask A Question": toShow.question = 1; break;
case "Literature Request": toShow.brochures = 1; toShow.address = 1; break;
case "AE Account": toShow.accHeader = 1; toShow.address = 1; break;
}
for(var i in toShow) {
elts[i].style.display = toShow[i] ? 'block' : 'none';
}
});