2016-02-19 2 views
3

Привет всем, мне нужна помощь в создании выпадающего меню, которое реагирует на классы, содержащиеся в наборе параметров. Я хочу, чтобы пользователи выбирали брошюры (я назову меню брошюр ) и на основе классов, содержащихся в этих параметрах, второе раскрывающееся меню заполняется на основе классов в первом.Динамические выпадающие меню с использованием jQuery для веб-сайта

Например выбора этой опции:

<option id="parRight" class="eng kor esp">Special Ed. Parents Rights</option>

создать бы второй выпадающий я называю выбор по языка выпадающего меню на основе классов выше в «английский» «Кореец» и «Испанский» соответственно и только те языки, которые представлены в классах этого конкретного варианта.

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

Вот соответствующий код:

HTML

 <select id="docs"> 
      <option>- Choose a document to preview -</option> 
      <option id="specEd" class="eng kor viet esp chin">Special Education Programs</option> 
      <option id="parRight" class="eng kor esp">Special Ed. Parents Rights</option> 
      <option id="cac" class="eng esp">CAC Brochure</option> 
     </select> 

     <div id="langs"> 
      <ul style="display:none;"> 
       <li>-Select a Language-</li> 
       <li class="eng">English</li> 
       <li class="esp">Español</li> 
       <li class="kor">한국어</li> 
       <li class="viet">Tiếng Việt</li> 
       <li class="chin">中文</li> 
      </ul> 
     </div> 

JQuery

var $select = $("<select></select>"); 
    $("#langs").append($select); 


    function englishTest(lang) { 
    return lang.hasClass("eng"); 
    } 

    function spanishTest(lang) { 
    return lang.hasClass("esp"); 
    } 

    function koreanTest(lang) { 
    return lang.hasClass("kor"); 
    } 

    function chineseTest(lang) { 
    return lang.hasClass("chin"); 
    } 

    function vietnameseTest(lang) { 
    return lang.hasClass("viet"); 
    } 

$("#docs").change(function(){ 
    console.log("test"); 
    var $selection = $("#docs option:selected"); 


    if (englishTest($selection) === true) { 
      console.log("english passing"); 
      $select.append("<option>English</option>"); 
    } 
    if (spanishTest($selection) === true) { 
      console.log("spanish passing"); 
      $select.append("<option>Español</option>") 
    } 
    if (koreanTest($selection) === true) { 
      console.log("korean passing"); 
      $select.append("<option>한국어</option>") 
    } 
    if (chineseTest($selection) === true) { 
      console.log("chinese passing"); 
      $select.append("<option>中文</option>") 
    } 
    if (vietnameseTest($selection) === true) { 
      console.log("vietnamese passing"); 
      $select.append("<option>Tiếng Việt</option>") 
    }  
}); 

Я знаю, что этот код повторяется, и я не поклонник этого. Я также ценю некоторые указания о том, как очистить этот код и сделать его таким, чтобы я придерживался DRY. Не повторяйте себя. Заранее спасибо.

ответ

3

В моем коде, когда вы нажмете на раскрывающееся меню, из раскрывающихся списков создаются исходные параметры. Я сделал карту классов для языков, которые будут использоваться для вывода параметров в новом раскрывающемся списке. Надеюсь, вы понимаете. Если у вас есть какие-либо вопросы, дайте мне знать.

$(function(){ 
 
    var map = { 
 
    "eng" : "English", 
 
    "esp" : "Español", 
 
    "kor" : "한국어", 
 
    "viet" : "Tiếng Việt", 
 
    "chin" : "中文" 
 
    } 
 
    $("#docs").on("change", function(){ 
 
    //explanation of .attr() 
 
    // lets say your html looks like this === 
 
    //<option id="specEd" class="eng kor viet esp chin">Special Education Programs</option> 
 
    // .attr("class") will create a string of all the classes like : 'eng kor viet esp chin' 
 

 
    var selected = $("option:selected", this).attr("class"); 
 

 
    //then you split the string by spaces to get an arr like ["eng", "kor", "viet", "esp", "chin"] 
 

 
    var arr = selected.split(" "); 
 

 
    console.log(arr) //["eng", "kor", "viet", "esp", "chin"] 
 

 

 
    //Next, remove the old dropdown that was appended. If `.added` was not there it will remove nothing 
 
    //Then after it is removed append the new dropdown 
 
    //so, on every change event you're removing the old and appending the new. 
 

 
    $(".added").remove() 
 
    $("body").append("<select class='added'>") 
 

 
    //since the string of classes are split into an array you can use the array method of [forEach][1] 
 
    arr.forEach(function(e){ 
 
    //`e` is each element in `arr` 
 
     $(".added").append("<option>"+map[e]+"</option>"); 
 

 
    // so map[eng] == "English" then it goes to map[kor] etc.. 
 
    // you should know how JavaScript objects work 
 

 
    }) 
 
    }) 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
 
<select id="docs"> 
 
    <option>- Choose a document to preview -</option> 
 
    <option id="specEd" class="eng kor viet esp chin">Special Education Programs</option> 
 
    <option id="parRight" class="eng kor esp">Special Ed. Parents Rights</option> 
 
    <option id="cac" class="eng esp">CAC Brochure</option> 
 
</select>

+0

Это именно то, что я пытаюсь сделать. Большое спасибо. У меня есть несколько вопросов. в отношении 'var selected = $ (" option: selected ", this) .attr (" class ");' Это говорит, что переменная '$ selected' равна выбранной опции? Я не знаю, к чему это относится. Это выбранный вариант? Затем вы получаете атрибут класса с '.attr (« class »)? – m00saca

+0

Действительно, если бы вы могли просто пропустить меня через него. Мне нужна помощь, которая точно знает, что происходит по строкам. Я новичок в этом. – m00saca

+1

Да. 'selected' установлен на выбранный вариант раскрывающегося списка' # docs'. Выпадающий контекст (это). Я также получаю классы выбранных, выполняя '.attr()'. Это дает вам список классов. Вы можете предоставить объект контекста в качестве второго параметра селектора jquery, как описано в этой статье: http://weblogs.asp.net/dwahlin/jquery-tip-1-defining-a-context-when-using-selectors. КСТАТИ. Это также будет работать: 'var selected = $ (this) .find ('option: selected'). Attr (" class ");'. –

2

Для СУХОГО кодирования, я хотел бы предложить заменить эти функции

function englishTest(lang) { 
    return lang.hasClass("eng"); 
} 

С чем-то вроде этого

function testLanguage(selection, lang) { 
    return selection.hasClass(lang); 
} 

А потом называть это как

testLanguage($selection, "eng") === true 

Для Вашего основного вопроса, вы, кажется, добавляете вещи всегда, когда выбор меняется, но вы никогда ничего не очищаете.

+0

ооо спасибо за предложение, я включить это в мой код. Спасибо за совет. Да, вы правы, я добавляю каждый раз, когда меняется выбор, но я не знаю, как «очистить», как вы предлагаете. – m00saca

+0

Try $ select = $ (""); – tperamaki

+0

В верхней части моего .js-файла $ select does = ("") – m00saca

Смежные вопросы