2011-10-08 21 views
13

Muszę pokazać/ukryć opcje w jednym rozwijanym menu zależnym od innych opcji rozwijanych.jQuery pokaż/ukryj opcje z rozwijanego menu wyboru, gdy wybrana jest opcja z innego rozwijanego menu wyboru:

Poniższy kod pokazuje, co próbuję osiągnąć.

Jeśli opcja menu "column_select" jest ustawiona na "1 kolumnę", menu wyboru "wybór układu" musi wyświetlać tylko opcję "brak".

Jeśli opcja menu "column_select" jest ustawiona na "2 kolumny", menu wyboru "layout_select" musi wyświetlać tylko opcje "layout 1" i "layout 2".

Jeśli opcja menu "column_select" jest ustawiona na "3 kolumnę", menu wyboru "layout_select" musi wyświetlać tylko opcje "layout 3", "layout 4" i "layout 5".

<select name="column_select" id="column_select"> 
    <option value="col1">1 column</option> 
    <option value="col2">2 column</option> 
    <option value="col3">3 column</option> 
</select> 

<select name="layout_select" id="layout_select"> 
    <!--Below shows when '1 column' is selected is hidden otherwise--> 
    <option value="col1">none</option> 

    <!--Below shows when '2 column' is selected is hidden otherwise--> 
    <option value="col2_ms">layout 1</option> 
    <option value="col2_sm">layout 2</option> 

    <!--Below shows when '3 column' is selected is hidden otherwise--> 
    <option value="col3_mss">layout 3</option> 
    <option value="col3_ssm">layout 4</option> 
    <option value="col3_sms">layout 5</option> 
</select> 

Do tej pory wszystko, co próbowałem, zawiodło beznadziejnie .... Jestem nowy w jQuery. Jeśli ktokolwiek mógłby pomóc, byłoby to bardzo cenne. Dzięki!

Odpowiedz

26

Try -

$("#column_select").change(function() { 
    $("#layout_select").children('option').hide(); 
    $("#layout_select").children("option[value^=" + $(this).val() + "]").show() 
}) 

Jeśli jechaliśmy do korzystania z tego rozwiązania trzeba by ukryć wszystkie elementy z wyjątkiem jednego z „brak” wartości w dokumencie.gotowy funkcja -

$(document).ready(function() { 
    $("#layout_select").children('option:gt(0)').hide(); 
    $("#column_select").change(function() { 
     $("#layout_select").children('option').hide(); 
     $("#layout_select").children("option[value^=" + $(this).val() + "]").show() 
    }) 
}) 

Demo - http://jsfiddle.net/Mxkfr/2

EDIT

może mam trochę ponieść z tego, ale tutaj jest kolejnym przykładem, który wykorzystuje pamięć podręczną oryginalnych wybranych opcji listy aby upewnić się, że lista 'layout_select' została całkowicie zresetowana/wyczyszczona (łącznie z opcją 'none') po zmianie listy 'column_select' -

$(document).ready(function() { 
    var optarray = $("#layout_select").children('option').map(function() { 
     return { 
      "value": this.value, 
      "option": "<option value='" + this.value + "'>" + this.text + "</option>" 
     } 
    }) 

    $("#column_select").change(function() { 
     $("#layout_select").children('option').remove(); 
     var addoptarr = []; 
     for (i = 0; i < optarray.length; i++) { 
      if (optarray[i].value.indexOf($(this).val()) > -1) { 
       addoptarr.push(optarray[i].option); 
      } 
     } 
     $("#layout_select").html(addoptarr.join('')) 
    }).change(); 
}) 

Demo - http://jsfiddle.net/N7Xpb/1/

+0

Dzięki! to wydaje się działać, ale jest jeden mały problem .... Po wybraniu opcji z "column_select" aktualnie wybrana opcja w "selekcja layoutu" pozostaje taka sama. Czy istnieje sposób na zmianę opcji? – Nick

+0

Świetnie zaimplementowałem twoją najnowszą aktualizację i działa dobrze. Jedną z kwestii, które mam, jest to, że po odświeżeniu nie utrzymuje wybranej właściwej opcji. Po odświeżeniu strony "#layout_select" powraca do pierwszej selekcji. Zastanawiałem się, czy mogę nałożyć na ciebie trochę więcej, aby powiedzieć mi, jak mogę zachować prawidłową opcję wybraną po odświeżeniu? – Nick

+0

W jakich okolicznościach jest odświeżanie ekranu? Czy to po postie? – ipr101

1
// find the first select and bind a click handler 
$('#column_select').bind('click', function(){ 
    // retrieve the selected value 
    var value = $(this).val(), 
     // build a regular expression that does a head-match 
     expression = new RegExp('^' + value), 
     // find the second select 
     $select = $('#layout_select); 

    // hide all children (<option>s) of the second select, 
    // check each element's value agains the regular expression built from the first select's value 
    // show elements that match the expression 
    $select.children().hide().filter(function(){ 
     return !!$(this).val().match(expression); 
    }).show(); 
}); 

(to jest dalekie od doskonałości, ale powinien dostać się tam ...)

7

Jak o:

(Updated)

$("#column_select").change(function() { 
    $("#layout_select") 
     .find("option") 
     .show() 
     .not("option[value*='" + this.value + "']").hide(); 

    $("#layout_select").val(
     $("#layout_select").find("option:visible:first").val()); 

}).change(); 

(zakładając trzeci option powinien mieć wartość col3)

przykład:http://jsfiddle.net/cL2tt/

Uwagi:

  • pomocą zdarzeń .change() zdefiniować obsługi zdarzeń, która jest wykonywana, jeśli wartość select#column_select zmian.
  • .show() wszystkie option s w drugim .
  • .hide() wszystkie option a w drugim select którego value nie zawiera value wybranej opcji w select#column_select stosując attribute contains selector.
+0

Dzięki! podobnie jak powyżej wydaje się działać, ale jest jeden mały problem. Po wybraniu nowej opcji z "column_select" aktualnie wybrana opcja w "selekcji layout_" pozostaje taka sama. Czy istnieje sposób na zmianę opcji? – Nick

+0

Tak. Zobacz mój zaktualizowany przykład. Przepraszamy za błąd! –

+0

Doskonałe dzięki! – Nick

2

Initialy zarówno rozwijana mieć tę samą opcję, opcja wybrana w firstdropdown jest ukryty w seconddropdown „wartość” jest niestandardowy atrybut, który jest unikatowy..

$(".seconddropdown option").each(function() { 
    if(($(this).attr('value')==$(".firstdropdown option:selected").attr('value'))){ 
     $(this).hide(); 
     $(this).siblings().show(); 
    } 
}); 
2

litle późno może jednak chciałbym zaproponować

$(document).ready(function() { 
    var layout_select_html = $('#layout_select').html(); //save original dropdown list 

    $("#column_select").change(function() { 
     var cur_column_val = $(this).val(); //save the selected value of the first dropdown 
     $('#layout_select').html(layout_select_html); //set original dropdown list back 
     $('#layout_select').children('option').each(function(){ //loop through options 
     if($(this).val().indexOf(cur_column_val)== -1){ //do your conditional and if it should not be in the dropdown list 
      $(this).remove(); //remove option from list 
     } 
    }); 
}); 
0

A w 2016 roku ..... to zrobić (który działa we wszystkich przeglądarkach i nie tworzy "nielegalne" html).

Dla menu rozwijanego wybierz, aby pokazać/ukryć różne wartości, dodaj tę wartość jako atrybut danych.

<select id="animal"> 
    <option value="1" selected="selected">Dog</option> 
    <option value="2">Cat</option> 
</select> 
<select id="name"> 
    <option value=""></option> 
    <option value="1" data-attribute="1">Rover</option> 
    <option value="2" selected="selected" data-attribute="1">Lassie</option> 
    <option value="3" data-attribute="1">Spot</option> 
    <option value="4" data-attribute="2">Tiger</option> 
    <option value="5" data-attribute="2">Fluffy</option> 
</select> 

Następnie w swoim jQuery dodaj zdarzenie zmiany do pierwszego menu rozwijanego, aby odfiltrować drugie menu rozwijane.

$("#animal").change(function() { 
    filterSelectOptions($("#name"), "data-attribute", $(this).val()); 
}); 

A magiczną częścią jest to małe narzędzie jQuery.

function filterSelectOptions(selectElement, attributeName, attributeValue) { 
if (selectElement.data("currentFilter") != attributeValue) { 
    selectElement.data("currentFilter", attributeValue); 
    var originalHTML = selectElement.data("originalHTML"); 
    if (originalHTML) 
     selectElement.html(originalHTML) 
    else { 
     var clone = selectElement.clone(); 
     clone.children("option[selected]").removeAttr("selected"); 
     selectElement.data("originalHTML", clone.html()); 
    } 
    if (attributeValue) { 
     selectElement.children("option:not([" + attributeName + "='" + attributeValue + "'],:not([" + attributeName + "]))").remove(); 
    } 
} 

}

Ten mały klejnot śledzi aktualny filtr, jeżeli różni się ona przywraca oryginalne wybrać (wszystkie elementy), a następnie usuwa przefiltrowane elementy. Jeśli element filtru jest pusty, widzimy wszystkie elementy.

Powiązane problemy