2015-02-08 3 views
0

На основе post here on StackOverflow, я пытаюсь создать раскрывающееся меню, содержимое которого зависит от выбора другого выпадающего меню.Использование JavaScript для фильтрации выпадающего меню

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

Оба меню правильно считываются из базы данных и преобразуются в правильный HTML-код. Так что, похоже, сбой - это JavaScript, который используется для фильтрации параметров во втором выпадающем меню. Мой код выглядит следующим образом:

<div id="selection"> 
    <?php 
     // Top level part selection 
     echo "<select name='firstLevelParts' id='select1'>"; 
     foreach ($category_primary as $category_item): 
      echo "<option value = '".$category_item['cat_primary_id']."'>".$category_item['cat_primary_name']."</option>"; 
     endforeach; 
     echo "</select>"; 


     // Second level part selection (This should be updated, based on selection in top level menu) 
     echo "<select name='secondLevelParts' id='select2'>"; 
     foreach ($category_secondary as $cat_sec_item): 
      echo "<option value='".$cat_sec_item['cat_secondary_code']."'>".$cat_sec_item['cat_secondary_name']."</option>"; 
     endforeach; 
     echo "</select>"; 
    ?> 

</div> 


<script> 
    $("#select1").change(function() { 
     if(typeof $(this).data('options') === "undefined")){ 
      /*Taking an array of all options-2 and kind of embedding it on the select1*/ 
      $(this).data('options',$('#select2 option').clone()); 
      } 
     var id = $(this).val(); 
     var options = $(this).data('options').filter('[value=' + id + ']'); 
     $('#select2').html(options); 
    }); 
</script> 

Я действительно надеюсь, что вы можете мне помочь локализации изъян в моем коде, я действительно раздражает черт из меня ...

Update - По желанию, здесь в результате HTML-коде, я не могу дать вам URL страницы, так как она находится за защитой пароля:

<div id="selection"> 
<select name='firstLevelParts' id='select1'> 
<option value = '1'>Terræn</option> 
<option value = '2'>Fundamentsystem</option> 
<option value = '3'>Vægsystem</option> 
<option value = '4'>Dæksystem</option> 
<option value = '5'>Tagsystem</option> 
</select> 

<select name='secondLevelParts' id='select2'> 
<option value='1'>Jordprofil</option> 
<option value='2'>Befæstet Areal</option> 
<option value='3'>Beplantning</option> 
<option value='1'>Fundamentkonstruktion</option> 
<option value='2'>Bærelag</option> 
<option value='3'>Åbning</option> 
<option value='4'>Lukning</option> 
<option value='5'>Inddækning</option> 
<option value='6'>Afslutning</option> 
<option value='7'>Afskærmning</option> 
<option value='8'>Fuge</option> 
<option value='9'>Samling</option> 
<option value='10'>Overflade</option> 
</select> 
</div> 

<script> 
    $("#select1").change(function() { 
     if(typeof $(this).data('options') === "undefined")){ 
      /*Taking an array of all options-2 and kind of embedding it on the select1*/ 
      $(this).data('options',$('#select2 option').clone()); 
      } 
     var id = $(this).val(); 
     var options = $(this).data('options').filter('[value=' + id + ']'); 
     $('#select2').html(options); 
    }); 
</script> 
+1

Мы можем увидеть результат 'html'. Если в коробках есть много вариантов, вы можете сократить его, но было бы хорошо, если бы результат был – DelightedD0D

+0

Теперь он добавлен в исходное сообщение ... – Noceo

ответ

2

адаптирован из this solution to a similar problem приведенных ниже должен делать то, что вы хотите :

$(function() { 
 
    $('#select').filterByValues($('.filterElements')); 
 
    $('.filterElements').change(); 
 
}); 
 

 

 
jQuery.fn.filterByValues = function(masterSelects) { 
 
    return this.each(function() { 
 
    var select = this; 
 
    var options = []; 
 
    $(select).find('option').each(function() { 
 
     options.push({value: $(this).val(), text: $(this).text()}); 
 
    }); 
 
    $(select).data('options', options); 
 
    
 
    masterSelects.bind('change', function() { 
 
     var options = $(select).empty().scrollTop(0).data('options'); 
 
     var vals=[]; 
 
     $(masterSelects).each(function(i,e){ 
 
     vals.push('^'+$.trim($(e).val())+'$'); 
 
     }); 
 
     var search = vals.join('|'); 
 
     var regex = new RegExp(search,'gi'); 
 

 
     $.each(options, function(i) { 
 
     var option = options[i]; 
 
     if(option.value.match(regex) !== null) { 
 
      $(select).append(
 
      $('<option>').text(option.text).val(option.value) 
 
     ); 
 
     } 
 
     }); 
 
    }); 
 
    
 
    }); 
 
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="selection"> 
 
<select name='firstLevelParts' class='filterElements'> 
 
<option value = '0'>(Select category)</option> <!-- added --> 
 
<option value = '1'>Terræn</option> 
 
<option value = '2'>Fundamentsystem</option> 
 
<option value = '3'>Vægsystem</option> 
 
<option value = '4'>Dæksystem</option> 
 
<option value = '5'>Tagsystem</option> 
 
</select> 
 
    
 
<select name='firstLevelPartsB' class='filterElements'> 
 
<option value = '0'>(Select category)</option> <!-- added --> 
 
<option value = '1'>Terræn</option> 
 
<option value = '2'>Fundamentsystem</option> 
 
<option value = '3'>Vægsystem</option> 
 
<option value = '4'>Dæksystem</option> 
 
<option value = '5'>Tagsystem</option> 
 
</select> 
 

 
<select name='secondLevelParts' id='select'> 
 
<option value='1'>Jordprofil</option> 
 
<option value='2'>Befæstet Areal</option> 
 
<option value='3'>Beplantning</option> 
 
<option value='1'>Fundamentkonstruktion</option> 
 
<option value='2'>Bærelag</option> 
 
<option value='3'>Åbning</option> 
 
<option value='4'>Lukning</option> 
 
<option value='5'>Inddækning</option> 
 
<option value='6'>Afslutning</option> 
 
<option value='7'>Afskærmning</option> 
 
<option value='8'>Fuge</option> 
 
<option value='9'>Samling</option> 
 
<option value='10'>Overflade</option> 
 
</select> 
 
</div>

+0

Это действительно работает. Есть ли у него какие-либо препятствия/недостатки по сравнению с моим оригинальным решением? (Помимо очевидного факта, что он действительно работает ...) – Noceo

+0

@Noceo он должен быть более эффективным, и это в основном плагин, поэтому он очень многократно используется, просто назовите '$ ('# select2'). FilterByValue ($ ('# select1'), true); 'и подавать элементы для фильтрации вкл. и вкл. – DelightedD0D

+0

Спасибо, последний вопрос, если я могу ...Я пытаюсь добавить параметр, называемый «(Выбрать категорию)» в меню 1, которое имеет нулевое значение, и должно допускать отображение только одного параметра (с тем же именем) в меню два. Если это невозможно, просто используя значение = «0»? – Noceo

0

Я думаю, что проблема заключается в простых ошибках в вашем синтаксисе - у вас есть дополнительные «)» в ваше состояние if(typeof $(this).data('options') === "undefined")){

Вот ваш jsfiddle без этой ошибки - это работает: http://jsfiddle.net/dn7fLny5/

EDIT: Вы можете прикрепить свои hanlders после DOM готовы, как это:

<script> 
    $(document).ready(function() { 
     $("#select1").change(function() { 
      // your code 
     }); 
    }); 
</script> 
+0

Только что заметил, что сам, однако удаление его, похоже, ничего не меняет, что заставляет меня задаться вопросом, пытается ли он даже запустить сценарий ... – Noceo

+0

Вы использовали $ (document) .ready (function() {...}) для прикрепления ваших обработчиков? – rakhmanoff

+0

Нет, и теперь у меня такое чувство, что я должен ... Куда это идет? Нашел что-то на этой странице: http://learn.jquery.com/using-jquery-core/document-ready/ - но я все еще новичок в JavaScript. – Noceo

0

Надеюсь, я правильно понимаю ваш вопрос, но похоже, что вы хотите использовать на практике Select3 library, хотя он представляет варианты в вложенных выпадающих списках, а не в отдельных выделенных блоках.

Просто взгляните на fourth example на этой странице (под названием «Выберите город по часовой стрелке») и посмотрите, делает ли он то, что вы хотите. Если у вас есть другие вопросы о том, как его настроить, я открыт для вопросов!

+0

Не уверен, что это именно то, но, безусловно, что-то, что я могу использовать для других частей проектов, поэтому спасибо. Сейчас проблема заключается в том, что у меня есть система с тремя уровнями, в которой вам сначала нужно выбрать верхнюю категорию, затем среднюю, а затем нижнюю. И варианты средней категории зависят от верхней части, а варианты дна зависят от середины. Так что вроде как 3-слойная система зависимостей ... – Noceo

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