2014-07-07 3 views
1

Я пытаюсь отобразить различные формы на основе значения выбранного выпадающего списка. У меня почти все работает, хотя кажется, что когда два значения отображают одну и ту же форму, это дает мне ошибку.Javascript: пытается показать различные формы, основанные на выпадающем значении?

Вот the jsfiddle

И код:

HTML:

<select id="C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown" name="form_select"> 
    <option value="">-- Select an Option --</option> 
    <option value="Buy A Product">Buy A Product</option> 
    <option value="Support">Support</option> 
    <option value="Ask A Question">Ask A Question</option> 
    <option value="Literature Request">Literature Request</option> 
    <option value="AE Account">A&E Account</option> 
</select> 
<div id="C006_ctl00_ctl00_C006">Zip Code</div> 
<div id="C007_ctl00_ctl00_C001">Support</div> 
<div id="C008_ctl00_ctl00_C003">Ask A Question</div> 
<div id="C009_ctl00_ctl00_formControls">Brochures</div> 
<div id="C012_ctl00_ctl00_formControls">A&E Account Header</div> 
<div id="C013_ctl00_ctl00_formControls">Literature Header</div> 
<div id="C010_ctl00_ctl00_formControls">Street Address</div> 
<div id="C006_ctl00_ctl00_C008">Product Interest</div> 

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.getElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('change', function() { 
    var style = this.value == "Buy A Product" ? 'block' : 'none'; 
    document.getElementById('C006_ctl00_ctl00_C006').style.display = style; 
    document.getElementById('C006_ctl00_ctl00_C008').style.display = style; 
}); 

document.getElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('change', function() { 
    var style = this.value == "Support" ? 'block' : 'none'; 
    document.getElementById('C007_ctl00_ctl00_C001').style.display = style; 
}); 

document.getElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('change', function() { 
    var style = this.value == "Ask A Question" ? 'block' : 'none'; 
    document.getElementById('C008_ctl00_ctl00_C003').style.display = style; 
}); 

document.getElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('change', function() { 
    var style = this.value == "Literature Request" ? 'block' : 'none'; 
    document.getElementById('C010_ctl00_ctl00_formControls').style.display = style; 
    document.getElementById('C009_ctl00_ctl00_formControls').style.display = style; 
}); 

document.getElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('change', function() { 
    var style = this.value == "AE Account" ? 'block' : 'none'; 
    document.getElementById('C012_ctl00_ctl00_formControls').style.display = style; 
    document.getElementById('C010_ctl00_ctl00_formControls').style.display = style; 
}); 

Поэтому, когда выбрано «Литературный запрос», он должен отображать брошюры и уличный адрес. Когда выбрана A & E Учетная запись должна указывать «A & E Заголовок учетной записи» и «Уличный адрес». Оба должны отображать «Уличный адрес», хотя только A & E Учетная запись показывает адрес улицы. Кто-нибудь знает, почему? Я не так уж фантастичен в javascript ... и прошу прощения за ужасные идентификационные имена. Они были автоматически предоставлены, и я не изменил их.

ответ

1

Используйте инструкцию switch. Я не делал все это, но это должно вам начать

fiddle

document.getElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('change', function() { 
    document.getElementById('C006_ctl00_ctl00_C006').style.display = 'none'; 
    document.getElementById('C006_ctl00_ctl00_C008').style.display = 'none'; 
    document.getElementById('C008_ctl00_ctl00_C003').style.display = 'none'; 
    document.getElementById('C010_ctl00_ctl00_formControls').style.display = 'none'; 
    document.getElementById('C009_ctl00_ctl00_formControls').style.display = 'none'; 
    document.getElementById('C012_ctl00_ctl00_formControls').style.display = 'none'; 
    document.getElementById('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.getElementById('C010_ctl00_ctl00_formControls').style.display = 'block'; 
      document.getElementById('C012_ctl00_ctl00_formControls').style.display = 'block'; 
      break; 
    } 
}); 
+0

Это работает почти полностью, кроме как по какой-то причине идентификатор для «поддержки». Поддержка продолжает отображаться для остальных выпадающих вариантов после того, как я выберет, чтобы показать «поддержку». Но это только для этого div, что странно. Я, возможно, смогу понять это, хотя .. спасибо! – user3802315

+0

Это странная вещь, ничего с идентификатором для «поддержки» не будет работать. Я не уверен, что это только делает это со мной: http://jsfiddle.net/miiicheellee/Dzd2w/ Если я использую другой идентификатор, а не тот, для поддержки, он работает. В противном случае «поддержка» липкая. Очень странно. – user3802315

+0

Это закончилось тем, что отлично работает - спасибо! – user3802315

2

Прежде всего, некоторые стиль. Там нет необходимости приложить все эти обработчики событий, как только что на может сделать трюк:

document.getElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown') 
     .addEventListener('change', function() { 
    var value = this.value; 
    if (value === "Buy A Product") { 
     ... 
    } else if (value === "Support") { 
     ... 
    } ... 
}); 

Внутри каждый из Thos if ветвей, отслеживать элементы, которые вы хотите показать. Вы можете сохранить некоторые набрав сохранения идентификаторов вместо:

if (value === "Buy A Product") { 
    var show = ['C006_ctl00_ctl00_C006', 'C006_ctl00_ctl00_C008']; 
} else 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) > -1 ? "block" : "none"; 
    document.getElementById(id).style.display = style; 
}); 

Это должно сделать трюк. Наверное, у вас есть какие-то вопросы, не стесняйтесь спрашивать.

Вы задаете вопрос о том, что вы используете несколько прослушивателей событий, и они все запускаются при изменении значения элемента select. Таким образом, последний (предположительно) «выигрывает» над остальными, поскольку он выполнен последним и скрывает/показывает элементы соответственно.

+0

Ух, я некомпетентен. Я понимаю, что if/else и то, как вы показывали каждый div, хотя я не могу понять forEach. – user3802315

+0

['forEach'] (https: // разработчик.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) - это метод массивов Javascript. Вы можете найти несколько примеров в приведенной выше ссылке. – MaxArt

0

Причиной такого поведения является то, что при выборе этой опции, обработчик событий для AE Account пробегов после события обработчик для Literature Request. Вместо этого я рекомендую использовать только один обработчик. Что-то в этом направлении более читаемо:

var elts = { 
    address: document.getElementById('C010_ctl00_ctl00_formControls'), 
    brochures: document.getElementById('C009_ctl00_ctl00_formControls'), 
    accHeader: document.getElementById('C012_ctl00_ctl00_formControls'), 
    litHeader: document.getElementById('C010_ctl00_ctl00_formControls'), 
    zip: document.getElementById('C006_ctl00_ctl00_C006'), 
    interest: document.getElementById('C006_ctl00_ctl00_C008'), 
    question: document.getElementById('C008_ctl00_ctl00_C003'), 
    support: document.getElementById('C007_ctl00_ctl00_C001') 
} 

document.getElementById('C002_ctl00_ctl00_C022_ctl00_ctl00_dropDown').addEventListener('change', 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'; 
    } 
}); 
Смежные вопросы